一、三大框架整合原理
本文的主要目的是为了整合SSH三大框架。
三大框架整合原理:Spring作为容器,创建存储和管理Struts2的Action对象、Hibernate的SessionFactory对象和事务
二、导包
分别导三大框架的包,以及框架整合相关的包。
框架整合相关的包:Struts2-spring-plugin(注意:该包一旦导入,则struts2在启动时就会寻找spring容器,找不到就会抛出异常)
Spring所要导的包如下图所示。
三、单独整合Spring到web项目
1、创建配置文件并导入约束(beans|context|aop|tx)
2、配置spring随项目启动而启动:配置listener(ContextLoadListener)
3、配置spring配置文件位置参数:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
四、单独整合Struts2到web项目
1、配置struts2主配置文件
2、配置struts2核心过滤器到web.xml
五、整合Struts2和Spring
1、导包(struts2-spring-plugin)
2、配置常量
<constant name="struts.objectFactory" value="spring"></constant> //将action的创建交给spring
// struts.objectFactory.spring.autowire = name:spring负责action的依赖属性(默认打开),该常量已经由struts2在default.properties中配置,在此不用配置
3.1 整合方案一:struts2自己创建action,由spring负责组装依赖属性
(不推荐使用,理由:为了spring的功能能够应用到action,spring需要管理action的完整生命周期)
class属性上依然配置action的完整类名,struts2仍然自己创建action,由spring负责组装Action的依赖属性
<action name="UserAction_*" class="domain.UserAction" method="{1}"></action>
3.2 整合方案二:spring负责action的创建和组装(推荐使用)
1、在applicationContext.xml中手动配置依赖属性
//注意:Action对象作用范围一定是多例的,这样才符合Struts2架构
<bean name="userAciton" class="domain.UserAction" scope=“prototype”>
<property name="userService" ref="userService"></property>
</bean>
2、class属性上填写applicationContext.xml中action对象的bean标签的name
<action name="UserAction_*" class=‘"userAction" method="{1}"></action>
六、单独配置Hibernate
1、导入实体类&orm元数据
2、配置主配置文件
七、整合Hibernate和Spring
1、将SessionFactory配置到Spring容器中
<bean name="sessionFactory" class=“org.....LocalSessionFactoryBean”></bean>
2.1 加载配置方案1:仍然使用外部hibernate.cfg.xml配置文件(不推荐)
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
2.2 加载配置方案2:在spring配置中配置hibernate配置基本信息(推荐使用)
<property name="hibernateProperties" >
<props>
//必选配置
//当配置完C3P0连接池后,以下前四个属性不应配置,以免冲突
<!-- <prop key="hibernate.connection.driver_class">com.mysql.jdbc.driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql:///crm_32</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password">1234</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>
//引入orm元数据, 指定orm元数据所在的包路径,spring会自动读取该包内的所有配置文件
<property name="mappingDictionaryLocations" value="classpath:domain"></property>
八、引入C3P0连接池
1、配置C3P0连接池
//指定Spring读取db.properties配置文件
<context:property-placeholder location="classpath:db.properties">
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPoolDataSource">
<property name="jdbcUrl" value="${jdbc.jdcbUrl}"></property>
<property name="jdbcDriver" value="${jdbc.jdbcDriver}"></property>
<property name="jdcbUser" value="${jdbc.jdcbUser}"></property>
<property name="jdbcPassword" value="${jdbc.jdcbPassword}"></property>
</bean>
2、将C3P0连接池配置到SessionFactory中
<property name="dataSource" ref="dataSource"></property>
九、HibernateTemplate操作数据库
Spring提供了一个HibernateTemplate对象来操作数据库,与JdbcTemplate类似,也存在一个HibernateDaoSupport来简化配置过程,即只需要继承HibernateDaoSupport类即可快速获得HibernateTemplate对象。
Dao类创建:继承HibernateDaoSupport。
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
public User getUserByUserCode(final String usercode){
//HQL方法操作数据库
return getHibernateTemplate.execute(new HibernateCallback<User>(){
public User doHibernate(Session session) throws Exception{String sql = "from User where user_code=?";
Query query = session.createQuery(sql);
query.setParamter(0, usercode);
User user = (User)query.uniqueResult();
return user;
}
]);
//使用Criteria操作数据库
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.add(Restriction.eq("user_code", usercode));
List<User> list = (List<User>) getHibernateTemplate.findByCriteria(dc);
if(list != null && list.size()>0){
return list.get(0);
}else{
return null;
}
}
}
十、整合AOP事务
1、准备工作:配置核心事务管理器
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
</bean>
2.1 xml配置AOP事务
1、配置目标对象
2、配置通知(Advice):<tx:advice>
3、将通知织入:<aop:config>
2.2 注解配置AOP事务
1、开启注解事务 2、Service类中使用注解进行配置
十一、扩大session作用范围
为了避免懒加载时出现no-session问题,需要扩大session的作用范围。
做法:在web.xml中配置openSessionInView过滤器。
注意:openSessionInView过滤器必须要配置在Struts2核心过滤器之前,因为Struts2核心过滤器不会放行。
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInView</class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>