【化学药品管理平台——Struts2+Spring+Hibernate实现 0202】SSH框架整合
这篇我们来讲struts2、hibernate和spring的整合,如何通过spring来管理struts2和hibernate。
Spring整合struts2
现在我们将struts2也交给spring管理,需要更改一下struts.xml文件和spring核心配置文件的配置,并在web.xml中配置spring的核心监听器。
applicationContext.xml
在applicationContext.xml中配置Action类,并配置Action类中依赖注入的UserService实现类。
<bean id="userAction" class="com.rclv.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<bean id="userService" class="com.rclv.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.rclv.dao.impl.UserDaoImpl"/>
struts.xml
<!-- 整合action -->
<action name="user_registUI" class="userAction" method="registUI">
<result name="register">/jsp/register.jsp</result>
</action>
<action name="user_strutsRegistTest" class="userAction" method="strutsRegistTest">
<result name="msg">/jsp/msg.jsp</result>
</action>
将原来action标签中的class属性值更换为applicationContext.xml中bean标签的id值。
web.xml
<!-- 配置Spring的核心监听器 -->
<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>
在web.xml中配置spring的核心监听器,这样在Web容器启动时,会自动装配applicationContext.xml文件的配置信息。
在UserAction类中,通过set方法将UserService注入,这样就实现了spring整合struts2。
来看测试代码。
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
// Spring整合struts2,获取Action类中注入的UserService实现类
public String strutsRegistTest2(){
user.setUid(UUIDUtils.getId());
user.setUpassword(MD5Utils.md5(user.getUpassword()));
userService.registAtService2(user);
request.setAttribute("msg", "注册成功");
return "msg";
}
修改之前的registAtService()方法,UserService实现类现在以Spring注入的方式获取。
Spring整合hibernate
<!-- 配置sessionFactory,加载hibernate.cfg.xml -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- 配置hibernate平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="userAction" class="com.rclv.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<bean id="userService" class="com.rclv.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<!-- 第一种方式注入hibernateTemplate模板类 -->
<!-- <bean id="userDao" class="com.rclv.dao.impl.UserDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean> -->
<!-- 第二种方式注入hibernateTemplate模板类 -->
<bean id="userDao" class="com.rclv.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
1. 在applicationContext.xml中,配置一个id="sessionFactory"的bean标签,用来加载hibernate.cfg.xml。
2.配置事务管理器,因为对数据库的操作使用的是Hibernate框架,所以需要使用Hibernate框架的事务管理器。下面的开发中,我们会使用到一个HibernateTemplate的模板类,而使用HibernateTemplate 时,必须进行事务管理,否则将报错。
3.开启事务的注解。原生的事务操作写起来比较麻烦,使用@Transactional注解方式会很方便。
4. 配置HibernateTemplate组件,注入到Dao实现类中。
对于Hibernatetemplate的使用,可以通过set方法注入,也可以继承HibernateDaoSupport接口注入。若是set方法注入,则HibernateTemplate需要引用前面的sessionFactory。若是继承HibernateDaoSupport接口注入,也可直接在Dao实现类中引入sessionFactory组件,因为HibernateDaoSupport中有一个setSessionFactory方法,会自动创建HibernateTemplate。
5. 还需要注意一个问题,如果hibernate已经交给spring来管理了,那么之前在hibernate.cfg.xml中获取current_session的配置就需要去掉。
<!-- 获取线程中的session需要在此配置,若是hibernate.cfg.xml交给spring管理,则不能有此配置-->
<property name="hibernate.current_session_context_class">thread</property>
/*
* 2. 通过继承HibernateDaoSupport注入HibernateTemplate模板类
*/
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
// 1。set方法注入HibernateTemplate模板类
/*private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}*/
//分层开发持久层
@Override
public void registAtDao(User user){
/*Session session = HibernateUtils.getCurrentSession();
session.save(user);*/
this.getHibernateTemplate().save(user);
}
由于UserDaoImpl继承了HibernateDaoSupport,所以,在registAtDao()方法中,可以直接获取HibernateTemplate封装好的方法进行数据库添加保存操作。关于HibernateTemplate模板类的使用,我们会在后面进行介绍。
Spring整合hibernate第二种方式
刚才的整合我们保留了hibernate.cfg.xml配置文件,现在我们可以将该文件中的内容完全写入applicationContext.xml中,则不再需要hibernate.cfg.xml文件。
<!-- 先配置C3P0的连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///cupboard"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- LocalSessionFactoryBean加载配置文件 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 先加载连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加载方言,加载可选 -->
<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="mappingResources">
<list>
<value>com/rclv/domain/User.hbm.xml</value>
<value>com/rclv/domain/Agents.hbm.xml</value>
</list>
</property>
</bean>
<!-- 先配置平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="userAction" class="com.rclv.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<bean id="userService" class="com.rclv.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.rclv.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
1.先配置c3p0连接池。
2.修改sessonFactory的属性配置,注入连接池。
3.继续在sessonFactory中使用hibernateProperties属性配置其他原来hibernate.cfg.xml中的属性,如hibernate方言等。并使用mappingResources标签配置映射文件。
4.事物管理器、事物的注解、HibernateTemplate的配置和前面一样。
至此,spring整合hibernate和struts2完成。