在前面Struts2和Hibernate4的整合基礎上,對Spring4進行整合,網上參考的大概都是Spring4+Hibernate3或者基於MyEclispe的,這里把自己研究后的配置和大家分享一下。
本次相關的版本如下:
Spring : spring-framework-4.0.1.RELEASE
1.將相關的jar包導入:
1.1libs目錄下包含所有的jar包(不需要復制結尾為sources和javadoc的jar包)到SSHProject項目的lib目錄

1.2 Hibernate內lib/optional/c3p0下的c3p0-0.9.2.1.jar復制到lib不目下

2.添加Spring的配置信息,放在WEB-INF下(都為Spring4的配置和Spring3的參數不同,大家注意一下相應的class名字)。
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 定義數據源的信息 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://localhost/ss3h</value> </property> <property name="user"> <value>root</value> </property> <property name="password"> <value>root</value> </property> <property name="maxPoolSize"> <value>80</value> </property> <property name="minPoolSize"> <value>1</value> </property> <property name="initialPoolSize"> <value>1</value> </property> <property name="maxIdleTime"> <value>20</value> </property> </bean> <!--定義Hibernate的SessionFactory --> <!-- SessionFactory使用的數據源為上面的數據源 --> <!-- 指定了Hibernate的映射文件和配置信息 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/tiny/ssh/beans/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="show_sql">true</prop> <prop key="hibernate.jdbc.batch_size">20</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="baseDao" class="com.tiny.ssh.daoImpl.UserDao"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!--用戶注冊業務邏輯類 --> <bean id="userManager" class="com.tiny.ssh.serviceImp.UserManagerImpl"> <property name="dao"> <ref bean="baseDao" /> </property> </bean> <!-- 用戶注冊的Action --> <bean id="regAction" class="com.tiny.ssh.action.RegisterAction"> <property name="userManager"> <ref bean="userManager" /> </property> </bean> <!-- more bean definitions go here --> </beans>
3.刪除Hibernate的配置文件Hibernate.cfg.xml和工廠類HibernateSesseionFactory類。他們的工作已經交給Spring去做,已經不再有用。
4.修改相應的類
接口類BaseDao.java:
package com.tiny.ssh.dao; import org.hibernate.HibernateException; public interface BaseDao { public void saveObject(Object obj) throws HibernateException; }
實現類UserDao.java (注意下面注釋中不一樣的地方,由於Hibernate4的默認配置不在有getCurrentSession()方法,要用openSession()來代替):
(##剛寫博文的時候,這里有點弄的不是太清楚##根據 @galison 的提議修改##
如果替換為openSession(),則事務的管理由Hibernate來處理,Hibernate4與3不一樣的地方,管理不是很方便,可以應用原來的getCurrentSession()來獲取,此時由spring來管理事務,有如下兩種方式(更詳細的資料可以參考網絡中的說明和文檔)
(1)配置<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
(2)添加事務注解 @Transactional
)
package com.tiny.ssh.daoImpl; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import com.tiny.ssh.dao.BaseDao; public class UserDao implements BaseDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } private Session getCurrentSession() { return sessionFactory.openSession(); // return sessionFactory.getCurrentSession(); } @Override public void saveObject(Object obj) throws HibernateException { this.getCurrentSession().save(obj); } }
業務邏輯實現類UserManagerImpl.java:
package com.tiny.ssh.serviceImp; import org.hibernate.HibernateException; import org.springframework.beans.BeanUtils; import com.tiny.ssh.beans.User; import com.tiny.ssh.dao.BaseDao; import com.tiny.ssh.forms.UserForm; import com.tiny.ssh.service.UserManager; public class UserManagerImpl implements UserManager { private BaseDao dao; public void setDao(BaseDao dao) { this.dao = dao; } @Override public void regUser(UserForm userForm) throws HibernateException { User user = new User(); BeanUtils.copyProperties(userForm, user); dao.saveObject(user); } }
用戶注冊Action類RegisterAction.java :
package com.tiny.ssh.action; import com.opensymphony.xwork2.ActionSupport; import com.tiny.ssh.forms.UserForm; import com.tiny.ssh.service.UserManager; public class RegisterAction extends ActionSupport { private static final long serialVersionUID = 1L; private UserForm user; private UserManager userManager; public UserForm getUser() { return user; } public void setUser(UserForm user) { this.user = user; } public void setUserManager(UserManager userManager) { this.userManager = userManager; } public String execute() { try { userManager.regUser(user); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } } }
加入Listener后的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>SSH Project</display-name> <filter> <filter-name>SSH</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>SSH</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>Register.jsp</welcome-file> </welcome-file-list> </web-app>
5.最終的層次結構

6.在期間有一些ClassNotFound的錯誤,按照網上的提示多導入了一些包,最終所引用的所有的包(共50個包)


7.結果



總結:至此,大概的環境都已經完事,希望大家在配置的時候用自己的名字,這樣能更好的找到其中的映射文件已經功能,更快的上手,有疑問的歡迎留言一起交流 (^.^)
參考鏈接:
http://blog.csdn.net/yeohcooller/article/details/9316923
