在整合框架的过程中,每一步都要测试,这样容易排查出问题,出现问题也就得从头开始
第一步,导包
将需要的jar包导入到项目中
hibernate所需要的jar包
struts2所需要的jar包
spring所需要的jar包

导包时,如果发现是同一个包,版本不同一定要删除一个(建议低版本)因为高版本可以兼容低版本
Struts2-spring-plugin-2.3.24.jar
一旦导入了该包,struts2在启动的时候会自动寻找spring容器,如果没有配置spring就会报异常

第二步测试spring配置是否成功
首先创建一个applicationContext.xml文件
导入四个约束:bean context aop tx

在web.xml中配置监听器
<!--spring 设置监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
|
三 单独配置struts2
先把struts2-spring-plugin-2.3.24.jar
然后书写struts2.xml文件导入约束,书写刚刚的userAction的配置
<package name="main" namespace="/" extends="struts-default"> <action name="userAction_*" class="cn.hd.action.UserAction" method="{1}"> <result name="success">/index.jsp</result> </action> </package>
|
在web.xml中配置struts2过滤器
<!--struts 配置过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
四 整合spring和struts
(1)将刚刚删除的包导入项目中
Struts2-spring-plugin-2.3.23.jar
|
(2)添加常量
<!--action的创建交给spring--> <constant name="struts.objectFactory" value="spring"></constant> <!--由spring负责装配action的属性--> <constant name="struts.objectFactory.spring.autoWire" value="name"></constant> <!--热部署,开启友好提示--> <constant name="struts.devMode" value="true"></constant>
|
(3)由spring管理action
①struts2创建action,由spring负责struts2的属性注入
struts2配置文件
<struts> <!--action的创建交给spring--> <constant name="struts.objectFactory" value="spring"></constant> <!--由spring负责装配action的属性--> <constant name="struts.objectFactory.spring.autoWire" value="name"></constant> <!--热部署,开启友好提示--> <constant name="struts.devMode" value="true"></constant>
<package name="main" namespace="/" extends="struts-default"> <action name="userAction_*" class="cn.hd.action.UserAction" method="{1}"> <result name="success">/index.jsp</result> </action> </package> </struts>
|
spring的配置文件
<bean name="userService" class="cn.hd.service.impl.UserServiceImpl"></bean>
<bean name="userAction" class="cn.hd.action.UserAction"> <property name="userService" ref="userService"></property> </bean>
|
②完全交给spring去管理action
在配置action的class属性值改为spring中的bean的名字
<struts> <!--action的创建交给spring--> <constant name="struts.objectFactory" value="spring"></constant> <!--由spring负责装配action的属性--> <constant name="struts.objectFactory.spring.autoWire" value="name"></constant> <!--热部署,开启友好提示--> <constant name="struts.devMode" value="true"></constant>
<package name="main" namespace="/" extends="struts-default"> <action name="userAction_*" class="userAction" method="{1}"> <result name="success">/index.jsp</result> </action> </package> </struts>
|
spring配置文件
<bean name="userService" class="cn.hd.service.impl.UserServiceImpl"></bean>
<bean name="userAction" class="cn.hd.action.UserAction" scope=”prototype”> <property name="userService" ref="userService"></property> </bean>
|
注意:spring配置action要配置的类的创建模式为多例模式
单独整合hibernate
1.1 书写实体bean类和orm数据源文件
package cn.hd.entity;
public class User {
private Integer stuid; private String name; private String password; private Integer money;
public Integer getStuid() { return stuid; }
public void setStuid(Integer stuid) { this.stuid = stuid; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public Integer getMoney() { return money; }
public void setMoney(Integer money) { this.money = money; }
@Override public String toString() { return "User{" + "stuid=" + stuid + ", name='" + name + '\'' + ", password='" + password + '\'' + ", money=" + money + '}'; } }
|
1.2书写核心配置文件
将线程绑定事务隔离级别删除,然后使用spring管理事务
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="cn.hd.entity.User" table="t_user"> <id name="stuid" column="stuid"> <generator class="native"></generator> </id> <property name="name" column="name"></property> <property name="password" column="password"></property> <property name="money" column="money"></property> </class> </hibernate-mapping>
|
1.3书写测试类,测试hibernate单独配置成功
@Test public void fun(){ Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = new User(); user.setMoney(1000); user.setName("莫邪"); user.setPassword("123"); session.save(user); transaction.commit(); session.close(); sessionFactory.close(); }
|
Hibernate和spring的结合
实际上结合的原理即使hibernate中的sessionFactory和事务交给spring管理
有两种管理方案
(一)hibernate中的配置文件不动,在spring配置文件中配置sessionFactory
<!--配置hibernate--> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean>
|
书写测试代码
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 {
@Resource(name = "sessionFactory") private SessionFactory sessionFactory;
@Test public void fun(){ Session session = sessionFactory.openSession(); User user = session.get(User.class, 1); System.out.println(user); } }
|
(二)不使用hibernate配置文件,所以配置写入到spring配置文件中
<!--配置hibernate--> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!--第一种--> <!--<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>-->
<!--第二种--> <property name="hibernateProperties"> <props> <prop key="connection.driver_class">com.mysql.jdbc.Driver</prop> <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh</prop> <prop key="hibernate.connection.username">root</prop> <prop key="hibernate.connection.password">1234</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="mappingDirectoryLocations" value="classpath:cn/hd/entity"></property>
|
整合c3p0连接池
使用spring读取连接池的配置文件
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
|
配置连接池的bean
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean> |
将hibernate中的数据库配置删除,增加一个propertity为dataSource
<property name="dataSource" ref="dataSource"></property> |
整合状态下操作数据库(dao)
书写dao类,并让dao类继承hibernateDaoSupport
提供了一个hibernateTemplate模板
这个模板可以实现hibernate的crud hql criteria sql 四种查询
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Override public void add(User user) { HibernateTemplate hibernateTemplate = getHibernateTemplate(); hibernateTemplate.save(user); }
|
整合spring aop事务
(一)获得事务管理对象(dataSourceTransaction,HibernateTransactionManager)
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"></bean>
|
(二)配置事务通知
<!--配置事务--> <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--配置事务通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/> <tx:method name="find" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice> <!--将事务织入到目标对象--> <aop:config> <aop:pointcut id="txPc" expression="execution(* cn.hd.service.impl.*ServiceImpl.*(..))"></aop:pointcut> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"></aop:advisor> </aop:config>
|
介绍Template模板
使用hibernateTransactionTemplate.execute就拿到了session
回到了原始的hibernate开发
@Override public List<User> getAll() { return this.getHibernateTemplate().execute(new HibernateCallback<List<User>>() { @Nullable @Override public List<User> doInHibernate(Session session) throws HibernateException { String sql = "from User"; Query query = session.createQuery(sql); List<User>list = query.list(); return list; } }); }
|