SSH整合总结(OA项目)
代码规范
环境搭建
Struts2
jar包
struts.xml, web.xml
Hibernate
jar包:核心包, 必须包, jpa, c3p0, jdbc
hibernate.cfg.xml, *.hbm.xml
Spring
jar包
appicationContext.xml/beans.xml
Spring与Struts2整合
1,在web.xml中配置Spring的监听器
2,加一个jar包以及整合web项目jar
Hibernate与Spring整合
1,管理SessionFactory实例(只需要一个)
2,声明式事务管理
3,加入整合jar包
--------------------
struts与spring整合前 首先单独测试struts
struts.xml
1 <struts> 2 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 3 <!-- 配置为开发模式,修改配置文件时,立即生效,无需重新部署项目重启服务器 --> 4 <constant name="struts.devMode" value="true" /> 5 <!-- 配置url的后缀名必须为.action 如果不配置 则url书写时可有可无 struts.action.extension=action,,--> 6 <constant name="struts.action.extension" value="action"></constant> 7 <!-- 配置为simple 自己控制样式 --> 8 <constant name="struts.ui.theme" value="simple"></constant> 9 10 <package name="default" namespace="/" extends="struts-default"> 11 <!-- struts未与spring整合 class属性的值写的是类的全路径--> 12 <action name="test_*" class="org.action.T" method="{1}"> 13 <result name="success">/test.jsp</result> 14 </action> 15 </package> 16 </struts>
web.xml
1 <!--struts2核心过滤器--> 2 <filter> 3 <filter-name>struts2</filter-name> 4 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 5 <init-param> 6 <param-name>actionPackages</param-name> 7 <param-value>com.mycompany.myapp.actions</param-value> 8 </init-param> 9 </filter> 10 11 <filter-mapping> 12 <filter-name>struts2</filter-name> 13 <url-pattern>/*</url-pattern> 14 </filter-mapping>
action
测试:http://localhost:8888/ItcastOA/test.action
接下来测试spring
在spring核心配置文件中开启自动扫描与装配bean对象
action中添加注解
执行测试
接下来测试spring与struts能否整合成功
1,在web.xml中配置Spring的监听器
2,加一个struts和spring整合jar包以及整合web项目的jar
struts中修改
测试http://localhost:8888/ItcastOA2/test.action
hibernate与spring整合测试
1,管理SessionFactory实例(只需要一个)
2,声明式事务管理
3,加入整合jar包
首先测试sessionfactory是否配置成功,能够正常得到(如果sessionFactory配置有问题,那么就得不到)
spirng核心配置文件:
1 <!-- 引入外部的properties文件 --> 2 <context:property-placeholder location="classpath:jdbc.properties"/> 3 4 <!-- 配置sessionFactory --> 5 <bean id="sessionFactory" 6 class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 7 <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> 8 <!-- 配置c3p0链接池 因为该datasource只有该工厂使用 所以可以配置一个内部bean--> 9 <property name="dataSource"> 10 <!-- 内部使用的bean 不需要id属性 --> 11 <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> 12 <!-- 必要属性 引入外部的properties文件 使用其中配置的值--> 13 <property name="jdbcUrl" value="${jdbcUrl}"></property> 14 <property name="driverClass" value="${driverClass}"></property> 15 <property name="user" value="${user}"></property> 16 <property name="password" value="${password}"></property> 17 <!-- 其他属性配置 --> 18 <!-- 初始化时获取3个链接 取值应在minPoolSize和maxPoolSize之间 default=3 --> 19 <property name="initialPoolSize" value="3"></property> 20 <!-- 连接池中保留的最小链接数 default=3--> 21 <property name="minPoolSize" value="3"></property> 22 <!-- 连接池中保留的最大链接数 default=15--> 23 <property name="maxPoolSize" value="5"></property> 24 <!-- 当连接池中的连接耗尽的时候 c3p0一次同时获取的连接数 default=3--> 25 <property name="acquireIncrement" value="3"></property> 26 <!-- 控制数据源内加载的PreparedStatement数量。如果maxStatement与maxStetementsPerConnection均为0,则缓存关闭。default=0 --> 27 <property name="maxStatements" value="8"></property> 28 <!-- maxStatemPerConnection定义了连接池内单个链接所拥有的最大缓存statements数。default=0 --> 29 <property name="maxStatementsPerConnection" value="5"></property> 30 <!-- 最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。default=0 --> 31 <property name="maxIdleTime" value="1800"></property> 32 </bean> 33 </property> 34 </bean>
测试sessionfactory
接下来测试事务管理
在spring核心配置文件中添加
1 <!-- 配置事务管理 采用注解的方式--> 2 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 3 <property name="sessionFactory" ref="sessionFactory"></property> 4 </bean> 5 <!-- 注解驱动 --> 6 <tx:annotation-driven transaction-manager="transactionManager"/>
创建一个简单的user实体类以及对应的映射文件
创建一个类SaveTwoUser
1 package test; 2 import javax.annotation.Resource; 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.model.User; 6 import org.springframework.stereotype.Service; 7 import org.springframework.transaction.annotation.Transactional; 8 //如果想注入容器中的对象sessionFactory 当前的类必须在容器中 spring不能给 不在容器中的对象注入属性 9 //(例如配置方式中 先配置action 然后配置service action中才能注入配置的service 因为他们在一个容器中 spring配置文件中管理生成的对象都是在容器中的) 10 //所以声明一个bean对象在容器中 名字默认为对象的名称SaveTwoUser 11 //@Service("saveTwoUser")效果和@Service一样 注意类名的第一个字母是小写的 12 @Service 13 public class SaveTwoUser { 14 //sessionFactory已经配置好了 在容器中 使用时 采使用注解的方式进行注入 则不用在配置set方法了 如果采用配置的方式 15 //那么这里声明sessionFactory之后 创建set方法 在配置文件中进行注入<property name="sessionFactory" ref=""></property> 16 //注入bean资源使用@Resource 先按照"sessionFactory"去spring配置文件中去找 找不到 再按照类型去找 17 @Resource 18 private SessionFactory sessionFactory; 19 //private ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 20 21 //加注解 开启事务 22 @Transactional 23 public void save(){ 24 //这里只能使用getCurrentSession而不能使用opensession,opensession得到的是一个新的session 没有事务 25 //而getCurrentSession得到的是外边已经管理好事务的session 使用框架操作底层数据时 使用的session也是与本地线程绑定的currentSession 26 if(sessionFactory!=null){ 27 Session session=sessionFactory.getCurrentSession(); 28 if(session!=null){ 29 session.save(new User()); 30 int i=10/0;//这里会出现异常 观察是否保存的有对象 正产情况下 事务回滚 不保存任何对象 31 session.save(new User()); 32 } 33 }else{ 34 System.out.println("sessionfactory为空。。。。"); 35 } 36 } 37 }
测试
查看数据库
然后把异常注释 再次执行
查看数据库
可以看到正确插入了(为什么不从1开始 因为第一插入了一条数据 但是由于事务回滚 插入的记录又被删除了 所以第一条记录是被占用过的 但再次插入的时候 是从第二条开始的)
最后进行一次最终的测试(struts,hibernate,spring整体整合)
测试:http://localhost:8888/ItcastOA2/test.action
以上就完成了三大框架的整合