SSH整合
spring分别整合hibernate与struts。
spring管理hibernate中的对象以及struts中的对象。
整合原理
导包
hibernate
在lib下导入required下的包
struts2
导入apps下struts2-blank下的包
注意:删除重复的包,优先删除低版本.javassist.jar
struts2整合spring包,注意:该包的功能会在struts2启动时从application域寻找spring容器,如果找不到将会抛出异常.
spring
- 导入4个核心包以及两个依赖包(bean、core、context、exception、apache下的log4j、logging)
- spring-jdbc、spring-tx、spring-orm
- 数据库驱动、c3p0连接池
- spring-aop、spring-aspects
- aspectj织入包、aop联盟
- spring-web
- spring-test、junit4类库
web
jstl.jar
整合spring到web项目
配置监听器
配置监听器,让spring容器随项目的启动而创建
<!--配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定容器的配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-name>classpath:applicationContext.xml</param-name>
</ocntext-param>
准备spring配置文件
在src目录下创建applicationContext.xml文件,并导入beans、context、aop、tx约束
整合struts2到web项目
创建Action对象
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public String regist() throws Exception {
//1.service执行注册逻辑
userService.regist(user);
//2.重定向到登录页面
return "toLogin";
}
@Override
public User getModel() {
return user;
}
}
创建struts2配置文件
<struts>
<package name="crm" namespace="/" extends="struts-default">
<action name="userAction_*" class="cn.it.web.action.UserAction" method="{1}">
<result name="toLogin" >/login.jsp</result>
</action>
</package>
</struts>
配置入口过滤器
<!--配置struts2入口过滤器-->
<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整合strurs2
配置整合spring常量
在struts.xml中配置
<!--配置常量,指定由spring完成属性注入-->
<context name="struts.objextFactory" value="spring"></context>
struts2创建Action,由spring负责组装
方案一:Action对象仍然由struts2创建,spring负责组装依赖
指定由spring自动装配依赖属性
在action中准备依赖属性
public class UserAction extends ActionSupport implements ModelDriven {
private UserService userService;
}在spring中配置依赖属性对象
Action对象创建与依赖注入全部由spring完成
方案二:Action对象创建与依赖注入全部由spring完成(推荐使用)
将Action配置到spring容器中
<bean name="userService" class="cn.it.service.UserServiceImpl"></bean> <bean name="userAction" class="cn.it.web.action.UserAction"> <property name="userService" ref="userService"></property> </bean>
在Action配置中的class属性,填写对象的BeanName
login.jsp
搭建Hibernate框架
准备实体与映射文件
如:
- User.java
- User.hbm.xml
准备主配置文件
- 主配置文件名称:hibernate.cfg.xml
- 导入dtd映射文件
填写配置
<hibernate-configuration> <session-factory> <!-- 5个必选 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 3个选选 --> <!-- 设置sql语句打印在控制台上 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 自动建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入映射文件 --> <mapping resource="cn/test/domain/User.hbm.xml"/> </session-factory> </hibernate-configuration>
代码测试
@Test
//测试框架搭建是否成功
public void test(){
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session session = sf.opensession();
//开启事务
Transaction tx = session.beginTransaction();
//执行操作
session.sace(new User("测试"));
//提交事务
tx.commit();
//关闭资源
session.close();
sf.close();
}
整合spring与hibernate
整合方式一:使用原生Hibernate配置文件
<!--配置sessionFactory-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--使用原生hibernate.cfg.xml加载配置-->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
整合方式二:将Hibernate配置转移到spring中
<!--将Hibernate配置转移到spring中-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--指定可选|必选属性-->
<property name="hibernateProperties">
<props>
<!--必选配置-->
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql:///hibernate</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password">123</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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="" value=""></property>
</bean>
将c3p0连接池配置到SessionFactory中
准备db.properties
jdbc.jdbcUrl=jdbc:mysql:///hibernate
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123
读取db.properties
<context:property-placeholder location="classpath:db.properties" />
配置连接池对象,注入连接配置
<--c3p0连接池-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
将连接池对象注入到SessionFactory中
<!--将Hibernate配置转移到spring中-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--将连接池注入SessionFactory-->
<property name="dataSource" ref="dataSource"></property>
<!--指定可选|必选属性-->
<property name="hibernateProperties">
<props>
<!--必选配置-->
<!--连接从连接池获取-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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="" value=""></property>
</bean>
将Dao&Hibernate模板配置到spring
书写Dao类
public Class UserDaoImpl implements UserDao {
private HibernateTemplate ht;
public void setHt(HibernateTemplate ht){
this.ht = ht;
}
public void save(User user){
ht.save(user);
}
}
配置Hibernate模板到spring
<!--配置Hibernate模板-->
<bean name="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate" >
<property name="dataSource" ref="dataSource"></property>
</bean>
配置dao到spring
<bean name="userDao" class="cn.it.dao.impl.UserDaoImpl" >
<property name="ht" ref="hibernateTemplate"></property>
</bean>
整合AOP事务
完成Service
public Class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void regist(User user){
userDao.regist(user);
}
}
配置核心事务管理器
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
事务配置
xml配置
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
<tx:method name="update*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
<tx:method name="delete*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true" isolation="REPEATABLE_READ"/>
<tx:method name="*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
</tx:attributes>
</tx:advice>
<!--配置切面-->
<aop:config>
<aop:pointcut experssion="execution(* cn.it.service.*serviceImpl.*(..))" id="txPC" />
<aop:advice advice-ref="txAdvice" pointcut-ref="txPC" />
</aop:config>
注解配置
<!--开启注解管理事务开关-->
<tx:annocation-driven transaction-manager="transactionManager" />
Service中使用注解
@Transactional(propagation=Propagation.REQUIRED,readOnly=true,isolation=Isolation.REPEATABLE_READ)
public class UserServiceImpl implements UserService {
@Transactional(propagation=Propagation.REQUIRED,readOnly=false,isolation=Isolation.REPEATABLE_READ)
@Override
public void regist(User user) {
//1.判断注册名是否重复
User existUser = userDao.getByUserCode(user.getUser_code());
if (existUser != null) {
throw new RuntimeException("用户名已经存在!");
}
//保存用户
userDao.save(user);
}
}
解决no-session问题
配置扩大session作用范围的过滤器
<!--注意:所有除struts2以外的过滤器都应配置到strut2过滤器之前-->
<!--解决no-session过滤器:OpenSessionInViewFilter-->
<filter>
<filter-name>OpenSession</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>