【化学药品管理平台——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完成。

posted @ 2018-07-23 11:33  XD_Yangf  阅读(3)  评论(0编辑  收藏  举报