SSH整合过程
注意 在整合框架中,每一大步都要测试,这样容易排查问题出了问题从头开始
一. 导包
1..现将hibernate中的包全部导入进来
![](https://i-blog.csdnimg.cn/blog_migrate/c52429306982453964cf0e7f3df265b0.png)
jpa 注意10包+1个驱动包
1. 导入struts2包
![](https://i-blog.csdnimg.cn/blog_migrate/151aeb3a2fcb8cc3821c2750c9c2b013.png)
导包时 如果发现有同一个包 版本不同 一定要将其中之一删掉 原则是删除版本低的
再导入struts2和spring整合的包
![](https://i-blog.csdnimg.cn/blog_migrate/44bdbc88131f043e511e34c18a513c4c.png)
一旦导入了这个包 struts2在启动的时候自动寻找spring容器如果 没有配置spring就会出现异常
1. 导入spring的所有包
4+2基本的包
2+2 aop
4 c3p0 tx 数据库驱动Springjdbc
1 test
1 spring web包
1 orm
![](https://i-blog.csdnimg.cn/blog_migrate/e51fad5d93ecf37dfbffc4255d6f0267.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4464601801d399675015100b5b80f883.png)
二. 测试spring是否配置成功
首先创建一个applicationContext.xml
导入4个约束 beans context aop tx
在web.xml中配置 监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<beanname="userAction"class="cn.hd.action.UserAction"></bean>
三.单独配置struts2‘’
先把struts2插件删除掉
书写struts.xml文件 导入约束 书写刚刚的userAction的配置
在web.xml中配置struts2的过滤器
<struts>
<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>
<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和struts2
(1) 将刚刚删除的包导入
(2) 添加常量
<!--struts.objectFactory = spring-->
<!--action的创建交给spring-->
<!--struts.objectFactory.spring.autoWire=name-->
<!--spring负责装配的action属性-->
<constant name="struts.objectFactory"value="spring"></constant>
<constant name="struts.objectFactory.spring.autoWire"value="name"></constant>
<constant name="struts.devMode"value="true"></constant>
(3) 有spring管理的action
1. struts2 闯将action 由spring负责struts2的属性注入
struts2的配置文件
<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>
Spring的配置文件
<bean name="userService"class="cn.hd.service.impl.UserServiceImpl">
</bean>
<beanname="userAction" class="cn.hd.action.UserAction">
<property name="userService"ref="userService"></property>
</bean>
2. 完全交给spring去管理action
配置action时class的属性值改为spring中的bean的名字
struts2的配置文件
<package name="main" namespace="/"extends="struts-default">
<action name="userAction_*" class=" userAction"method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
Spring的配置文件注意:spring配置action也要配置的类的创建模式为多例
<bean name="userService"class="cn.hd.service.impl.UserServiceImpl">
</bean>
<beanname="userAction" class="cn.hd.action.UserAction" scope="prototype">
<property name="userService"ref="userService"></property>
</bean>
五单独整合hibernate
(1) 书写实体类 和 orm数据源文件
(2) 书写核心配置文件
将线程绑定 和事务的隔离级别删除掉 后面使用spring管理事务
(3) 书写测试类,测试hibernate单独配置成功
public voidfun(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Useruser = new User();
user.setMoney(1000);
user.setName("张四");
user.setPsd("123456");
session.save(user);
transaction.commit();
session.close();
sessionFactory.close();
}
六.hibernate 和spring结合
实际上结合的原理就是hibernate中的sessionFactory和事务交给
Spring管理
有两种方法
1. hibernate中的配置文件不动,在spring配置文件中配置sessionFactory对象
<!--配置hibernate-->
<beanname="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")
privateSessionFactory sessionFactory;
@Test
publicvoid fun(){
Session session = sessionFactory.openSession();
Useruser = session.get(User.class, 1);
System.out.println(user);
}
}
2. 不适用hibernate配置文件 所有配置写入到spring文件中
<!--第二种方案-->
<property name="hibernateProperties">
<props>
<propkey="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<propkey="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo</prop>
<propkey="hibernate.connection.username">root</prop>
<propkey="hibernate.connection.password">123</prop>
<propkey="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>
</bean>
七.整合c3p0连接池
使用spring读取连接池的配置文件
配置连接池的bean
<context:property-placeholderlocation="classpath:db.properties"></context:property-placeholder>
<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
<propertyname="dataSource" ref="dataSource"></property>
八.整合状态下操作数据库(dao)
书写dao类 并让dao继承 hibernateDaoSupp
提供了一个HibernateTemplate模板
这个模板可以实现hibernate的 crud hql criteria sql 四种查询
@Override
publicvoid add(User user) {
HibernateTemplate ht = getHibernateTemplate();
ht.save(user);
}
九.整合spring aop事务
1.获得事务管理对象
(dataSourceTransactionManager,HibernateTransactionManager)
<bean name="transactionManager"class="org.springframework.orm.hibernate5.HibernateTransactionManager"></bean>
3. 配置事务通知
<!--=======配置事务=========-->
<beanname="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:methodname="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>
十.介绍Template模板
直接使用hibernateTemplate.execute就拿到了session
回到了原始的hibernate开发
@Override
publicList<User> getAll() {
return this.getHibernateTemplate().execute(newHibernateCallback<List<User>>(){
@Nullable
@Override
public List<User> doInHibernate(Session session) throwsHibernateException {
String hql= "fromUser";
Query query = session.createQuery(hql);
List<User> list =query.list();
return list;
}
});
}