首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明。谢谢。
今天做Spring+Hibernate+Struts2整合。
一 Struts2与Spring的整合。
1.整合之前Struts2例子:
在src下建立一个包,包名为:cn.clear.oa.test,在包下面建立一个类TestAction.java,内容如下:
1 package cn.clear.oa.test; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class TestAction extends ActionSupport{ 6 7 /** 8 * 9 */ 10 private static final long serialVersionUID = 3452727162433082820L; 11 12 13 public String execute() throws Exception { 14 System.out.println("---> TestAction.execute()"); 15 return "success"; 16 } 17 18 }
然后在WebRoot目录下建立一个test.jsp,页面内容如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 7 <title>测试页面</title> 8 </head> 9 10 <body> 11 Struts2添加成功! 12 </body> 13 </html>
修改struts.xml的内容,修改后内容如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 8 <!-- 设置为开发者模式 --> 9 <constant name="struts.devMode" value="true" /> 10 <!-- 把扩展名设置为.action,如name里的内容记不住,请在core包里的default.properties里面找 --> 11 <constant name="struts.action.extension" value="action" /> 12 <!-- 把主题设置为simple,如name里的内容记不住,请在core包里的default.properties里面找 --> 13 <constant name="struts.ui.theme" value="simple" /> 14 15 <package name="default" namespace="/" extends="struts-default"> 16 17 <!-- 测试用的Action(未与Spring整合,class写类的全名) --> 18 <action name="test" class="cn.clear.oa.test.TestAction"> 19 <result name="success">/test.jsp</result> 20 </action> 21 </package> 22 23 </struts>
然后启动tomcat服务器,访问这个页面:http://localhost:8080/OA/test.action,如果跳转到如下图的页面,则说明Struts2环境添加成功。
同时,在myeclipse的console下面也会打印:---> TestAction.execute()
2.测试Spring环境:
在包cn.clear.oa.test下面建立一个测试类SpringTest.java,其内容如下:
1 package cn.clear.oa.test; 2 3 import org.junit.Test; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 public class SpringTest { 8 9 private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 10 11 @Test 12 public void testBean() throws Exception { 13 TestAction testAction = (TestAction) ac.getBean("testAction"); 14 System.out.println(testAction); 15 } 16 }
然后在TestAction.java里面类名上面添加如下注解,在类SpringTest.java的testBean方法中开启单点测试,如果结果条显示绿色,
控制台打印出:cn.clear.oa.test.TestAction@4929b0e1,则说明测试通过,Spring环境添加成功。
1 @Controller 2 @Scope("prototype") 3 public class TestAction extends ActionSupport{ 4 …………………………………………………………………… 5 }
3.Struts2与Spring整合:
首先在web.xml中配置Spring的监听器。如下:
1 <!-- 配置Spring用于初始化容器的监听器 --> 2 <listener> 3 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 4 </listener> 5 <context-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:applicationContext*.xml</param-value> 8 </context-param>
其次添加整合所需的jar包。jar包在struts2.3.15.1的lib下面加,名字为:struts2-spring-plugin-2.3.15.1.jar
进入struts.xml中,将action的class属性直接填写bean的名字testAction,重启服务器,访问:http://localhost:8080/OA/test.action
如果成功进入页面,说明Struts2与Spring整合成功。
二 Hibernate与Spring的整合。
为什么要整合?答:1.管理SessionFactory(只需要一个);2.声明式事务管理。
整合步骤:
1)修改hibernate.cfg.xml中的内容,因为我们将使用到c3p0连接池管理数据库连接,所以数据库连接信息注释掉,如下图所示:
2)在applicationContext.xml中添加内容,最终如下所示:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 3 - Middle tier application context definition for the image database. 4 --> 5 <beans xmlns="http://www.springframework.org/schema/beans" 6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 7 xmlns:context="http://www.springframework.org/schema/context" 8 xmlns:tx="http://www.springframework.org/schema/tx" 9 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 11 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 12 13 <!-- 自动扫描与装配bean --> 14 <context:component-scan base-package="cn.clear.oa"></context:component-scan> 15 <!-- 导入外部的properties文件 --> 16 <context:property-placeholder location="classpath:jdbc.properties"/> 17 <!-- 配置SessionFactory --> 18 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 19 <!-- 指定hibernate配置文件的位置 --> 20 <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> 21 <!-- 配置c3p0数据库连接池 --> 22 <property name="dataSource"> 23 <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> 24 <property name="driverClass" value="${driverClass}"></property> 25 <property name="jdbcUrl" value="${jdbcUrl}"></property> 26 <property name="user" value="${username}"></property> 27 <property name="password" value="${password}"></property> 28 29 <!-- 其他配置 --> 30 <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 31 <property name="initialPoolSize" value="3"></property> 32 <!--连接池中保留的最小连接数。Default: 3 --> 33 <property name="minPoolSize" value="3"></property> 34 <!--连接池中保留的最大连接数。Default: 15 --> 35 <property name="maxPoolSize" value="5"></property> 36 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 37 <property name="acquireIncrement" value="3"></property> 38 <!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> 39 <property name="maxStatements" value="8"></property> 40 <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --> 41 <property name="maxStatementsPerConnection" value="5"></property> 42 <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 43 <property name="maxIdleTime" value="1800"></property> 44 </bean> 45 </property> 46 </bean> 47 <!-- 配置声明式事务管理(使用注解的方式) --> 48 <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 49 <property name="sessionFactory" ref="sessionFactory"></property> 50 </bean> 51 <tx:annotation-driven transaction-manager="txManager"/> 52 </beans>
3)在src目录下建立一个数据库配置文件,名字为jdbc.properties,内容如下(注意每行最后不要留空格,否则会报错):
1 jdbcUrl = jdbc:mysql:///oa 2 driverClass = com.mysql.jdbc.Driver 3 username = root 4 password =root
4)在SpringTest.java类里写一个方法测试SessionFactory,内容如下,如果执行单点测试成功,说明成功:
1 //测试sessionFactory 2 @Test 3 public void testSessionFactory() throws Exception { 4 SessionFactory sessionFactory = (SessionFactory) ac.getBean("sessionFactory"); 5 System.out.println(sessionFactory); 6 }
5)测试事务:
首先创建一个包:cn.clear.oa.domain,在包下建一个测试用的用户类(User.java),具体代码如下:
1 package cn.clear.oa.domain; 2 3 public class User { 4 private Long id; 5 private String name; 6 public Long getId() { 7 return id; 8 } 9 public void setId(Long id) { 10 this.id = id; 11 } 12 public String getName() { 13 return name; 14 } 15 public void setName(String name) { 16 this.name = name; 17 } 18 19 20 }
将之前拷贝的XX.hbm.xml剪切到domain包下,将名字改为User.hbm.xml,内容如下:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="cn.clear.oa.domain"> 7 <class name="User" table="oa_user"> 8 <id name="id"><generator class="native"/></id> 9 <property name="name"/> 10 </class> 11 </hibernate-mapping>
然后将这个mapper配置到hibernate.cfg.xml里面,具体内容如下所示:
1 <!-- 导入映射文件 --> 2 <mapping resource="cn/clear/oa/domain/User.hbm.xml" />
在test包下创建一个测试用的业务类,名字叫TestService.java,内容如下:
1 package cn.clear.oa.test; 2 3 import javax.annotation.Resource; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.springframework.stereotype.Service; 8 import org.springframework.transaction.annotation.Transactional; 9 10 import cn.clear.oa.domain.User; 11 @Service 12 public class TestService { 13 14 @Resource 15 private SessionFactory sessionFactory; 16 17 @Transactional 18 public void saveTestUser(){ 19 Session session = sessionFactory.getCurrentSession(); 20 session.save(new User()); 21 //测试事务的回滚功能 22 //int a = 1/0; 23 session.save(new User()); 24 } 25 }
在SpringTest.java下创建方法测试事务,内容如下:
1 //测试事务 2 @Test 3 public void testTransaction() throws Exception { 4 TestService testService = (TestService) ac.getBean("testService"); 5 testService.saveTestUser(); 6 }
启动单点测试测试事务,分别注释掉TestService.java里的int a = 1/0;代码和不注释各测试一次,如果成功就说明hibernate和spring整合成功。
三 ssh整合后测试:
在TsetAction.java里引入TestService.java类,测试是否能够创建user对象,然后启动服务器,在浏览器中访问:http://localhost:8080/OA/test.action,
如果成功进入页面并且数据库增加了相应的表记录,证明ssh整合成功。修改后的TestAction.java内容如下:
1 package cn.clear.oa.test; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.context.annotation.Scope; 6 import org.springframework.stereotype.Controller; 7 8 import com.opensymphony.xwork2.ActionSupport; 9 10 @Controller 11 @Scope("prototype") 12 public class TestAction extends ActionSupport{ 13 14 /** 15 * 16 */ 17 private static final long serialVersionUID = 3452727162433082820L; 18 19 @Resource 20 private TestService testService; 21 22 public String execute() throws Exception { 23 System.out.println("---> TestAction.execute()"); 24 testService.saveTestUser(); 25 return "success"; 26 } 27 28 }