实战----整合项目
设计代码分3层:
view-->service-->Dao
Struts2+hibernate+spring+JBPM+junit+jquery
一. 建数据库:
create database itcastoa0720 default character set utf8;
查看:
show create database itcastoa0720
二. Myeclipse工程
1. 新建web工程, 工程右键属性, 编码设为utf-8 2. 添加框架环境,
Struts2: jar, struts.xml, web.xml
hibernate: jar, hibernate.cfg.xml, *.hbm.xml
spring:jar, applicationContext
junit: jar 3. 整合SSH Struts2+spring整合: 目的, spring负责主要IOC(管理对象), AOP(事务管理), 就为了让spring容器来管理struts的action hibernate+spring整合: 目的, sessionFactory是创建session的, factory就需要一个, 管理一个工厂的话,用spring来管理一个单例工厂, 最重要的是, 声明式事务管理 4. 资源分类 5. 配置日志
- 添加junit的jar
- 添加框架环境, Struts2
1. 添加Struts2的jar (commons-fileupload, commons-io, freemarker, ognl, struts2-core, xwork-core), Struts.xml, web.xml
struts.xml:
alt+/可以提示, 但是不能自动.设置自动提示:
1. Preferences对话框中,选择“XML Catalog” ,
2. add目录:D:\Java\jar\struts-2.3.24.1\src\core\src\main\resources --> URI.
3. 设置xml关联编辑器: Preferences->file asso...->找到.xml, 设置myeclipse xml editor为默认.
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置为开发模式 --> <constant name="struts.devMode" value="true" /> <!-- 配置扩展名为action --> <constant name="struts.action.extension" value="action" /> <!--把主题配置为simple, --> <constant name="struts.ui.theme" value="simple" /> <package name="default" namespace="/" extends="struts-default"> </package>
<!-- Add packages here --> </struts>
2.配置 web.xml, 添加struts2的filter:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
- 添加框架环境, hibernate: jar包, hibernate.cfg.xml, *.hbm.xml
jar包: 核心包, 必须包, jpa, c3p0, jdbc
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">bjsxt</property> <!-- 2. other configuration --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="connection.pool_size">1</property> <!--3. mapping--> <mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/> <mapping class="com.bjsxt.hibernate.Teacher"/> </session-factory> </hibernate-configuration>
- 添加框架环境, spring: jar包, applicationContext.xml/beans.xml
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:component-scan base-package="cn.itcast.oa" />
</beans>
- 整合spring和struts2:
新建class TestAction, 包cn.itcast.oa.test:
package cn.itcast.oa.test; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("===>TestAction.execute()"); return "success"; } }
创建一个jsp:test.jsp, 有编码就改成utf-8
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> Struts2添加成功. <br> </body> </html>
配置struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置为开发模式 --> <constant name="struts.devMode" value="true" /> <!-- 配置扩展名为action --> <constant name="struts.action.extension" value="action" /> <!--把主题配置为simple, --> <constant name="struts.ui.theme" value="simple" /> <package name="default" namespace="/" extends="struts-default"> <!-- 配置 测试用的action, 还没有和spring整合, class属性写全 名--> <action name="test" class="cn.itcast.oa.test.TestAction"> <result name="success">/test.jsp</result> </action> </package> <!-- Add packages here --> </struts>
test.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> Struts2添加成功. <br> </body> </html>
运行成功.
整合前测试spring:
1. 用于声明bean
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
2. 配置bean的生命周期: prototype, 不是单例.
详细步骤:
1. 新建类SpringTest.java:
package cn.itcast.oa.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testBean() throws Exception { TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } }
2. 在testAction类前加入@Controller
package cn.itcast.oa.test; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport; @Controller @Scope("prototype") public class TestAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("===>TestAction.execute()"); return "success"; } }
3. 在SpringTest上运行 junit test , 成功!
package cn.itcast.oa.test; import org.hibernate.SessionFactory; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testBean() throws Exception { TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } }
还有一种方法: XML, 只需要删除testAction类前的@Controller 更改ApplicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.itcast.oa.test" /> <bean id="testAction" class = "cn.itcast.oa.test.TestAction" scope="prototype"></bean> </beans>
整合开始: 1. 在web.xml里配置spring的监听器 2. 加入整合jar包
4. 配置web.xml里的sping监听器:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <!-- 配置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> <!-- 配置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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
5. 加入struts2-sping-plugin的jar包
6. 更改struts.xml:, 把action的class属性改成bean名称
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置为开发模式 --> <constant name="struts.devMode" value="true" /> <!-- 配置扩展名为action --> <constant name="struts.action.extension" value="action" /> <!--把主题配置为simple, --> <constant name="struts.ui.theme" value="simple" /> <package name="default" namespace="/" extends="struts-default"> <!-- 配置 测试用的action, 还没有和spring整合, class属性写全 名--> <!-- 当struts2余spring整合后,class属性可以写bean的名称 --> <!--<action name="test" class="cn.itcast.oa.test.TestAction"> --> <action name="test" class="testAction"> <result name="success">/test.jsp</result> </action> </package> <!-- Add packages here --> </struts>
整合成功测试test.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> Struts2添加成功. <br> Struts2与spring整合成功. <br> </body> </html>
运行: http://localhost:8080/Itcastoa/test.action, 整合成功!!!
spring与struts2整合总结:
1. 加入整合jar包, struts2-sping-plugin的jar包,
在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>
2. 在action上面加入@Controller:
package cn.itcast.oa.test; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport;
@Controller @Scope("prototype") public class TestAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("===>TestAction.execute()"); return "success"; } }
3. 配置struts.xml文件, 就可以在配置action的class的时候直接使用 action名字
<action name="test" class="testAction"> <result name="success">/test.jsp</result> </action>
所以spring整合struts2的目的就是为了管理action , 如果action里想使用某个service文件的话, 直接注入@Resource就可以了.
- hibernate+spring整合
整合目的:
1. spring管理sessionFactory实例(只需要一个)
2. 声明式事务管理
改配置文件:
1. 考虑到连接池的问题, 将hibernate配置文件里的jdbc配置注释掉:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">bjsxt</property> --> <!-- 2. other configuration --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="connection.pool_size">1</property> <!--3. mapping <mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/> <mapping class="com.bjsxt.hibernate.Teacher"/>--> </session-factory> </hibernate-configuration>
2. 新增jdbc.properties, 加入mysql配置:
jdbcUrl=jdbc:mysql://localhost/itcastoa0720
driverClass=com.mysql.jdbc.Driver
user=root
password=linda0213
3. applicationContext.xml配置: 别忘了要导入外部properties文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.itcast.oa" /> <!-- <bean id="testAction" class = "cn.itcast.oa.test.TestAction"></bean> --> <!-- 导入外部的properties文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 指定 hibernate 配置文件路径 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置c3p0数据库连接池 --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${user}"></property> <property name="password" value="${password}"></property> <!-- 其他配置 --> <!-- 初始化时获取3个连接, 取值应该在minPoolSize与maxPoolSize之间, default:3 --> <property name="initialPoolSize" value="3"></property> <!-- 连接池中保留的最小连接数, default:3 --> <property name="minPoolSize" value="3"></property> <!-- 连接池中保留的最大连接数, default:15 --> <property name="maxPoolSize" value="5"></property> <!-- 当连接池中的连接耗尽的时候, c3p0一次同时获取的连接数, default:3 --> <property name="acquireIncrement" value="3"></property> <!-- 控制数据源内加载的PreparedStatements数量, 如果maxStatements与maxStatementsPerConnection均为0, 则缓存被关闭, default:0 --> <property name="maxStatements" value="8"></property> <!-- maxStatements与maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数, default:0 --> <property name="maxStatementsPerConnection" value="5"></property> <!-- 最大空闲时间, 1800秒内未使用则连接被丢弃,若为0则永不丢弃,default:0 --> <property name="maxIdleTime" value="1800"></property> </bean> </property> </bean> </beans>
4. springtest.java里测试sessionFactory:
package cn.itcast.oa.test; import org.hibernate.SessionFactory; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testBean() throws Exception { TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } @Test public void testSessionFactory() throws Exception{ SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory"); System.out.println(sessionFactory); } }
测试成功后进行声明式事务管理:
1. 配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.itcast.oa" /> <!-- <bean id="testAction" class = "cn.itcast.oa.test.TestAction"></bean> --> <!-- 导入外部的properties文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 指定 hibernate 配置文件路径 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置c3p0数据库连接池 --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${user}"></property> <property name="password" value="${password}"></property> <!-- 其他配置 --> <!-- 初始化时获取3个连接, 取值应该在minPoolSize与maxPoolSize之间, default:3 --> <property name="initialPoolSize" value="3"></property> <!-- 连接池中保留的最小连接数, default:3 --> <property name="minPoolSize" value="3"></property> <!-- 连接池中保留的最大连接数, default:15 --> <property name="maxPoolSize" value="5"></property> <!-- 当连接池中的连接耗尽的时候, c3p0一次同时获取的连接数, default:3 --> <property name="acquireIncrement" value="3"></property> <!-- 控制数据源内加载的PreparedStatements数量, 如果maxStatements与maxStatementsPerConnection均为0, 则缓存被关闭, default:0 --> <property name="maxStatements" value="8"></property> <!-- maxStatements与maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数, default:0 --> <property name="maxStatementsPerConnection" value="5"></property> <!-- 最大空闲时间, 1800秒内未使用则连接被丢弃,若为0则永不丢弃,default:0 --> <property name="maxIdleTime" value="1800"></property> </bean> </property> </bean> <!-- 配置声明式事务管理 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="txManager"/> </beans>
2. 新建user.java, 包: cn.itcast.oa.domain
package cn.itcast.oa.domain; public class User { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3. User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.oa.domain"> <class name="User" table="itcast_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name" /> </class> </hibernate-mapping>
4. 配置hibernate.cfg.xml里的mapping内容:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">bjsxt</property> --> <!-- 2. other configuration --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="connection.pool_size">1</property> <!--3. mapping --> <mapping resource="cn/itcast/oa/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
5. 开始写测试文件, 先添加一个TestService.java:
package cn.itcast.oa.test; import javax.annotation.Resource; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.itcast.oa.domain.User; @Service public class TestService { @Resource private SessionFactory sessionFactory; @Transactional public void saveTwoUsers(){ Session session = sessionFactory.getCurrentSession(); session.save(new User()); int a = 1/0; //exception session.save(new User()); } }
写测试文件:
package cn.itcast.oa.test; import org.hibernate.SessionFactory; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testBean() throws Exception { TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } @Test public void testSessionFactory() throws Exception{ SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory"); System.out.println(sessionFactory); } @Test public void testTransaction() throws Exception { TestService testService = (TestService) ac.getBean("testService"); testService.saveTwoUsers(); } }
测试文件test.jsp,
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> Struts2添加成功. <br> Struts2与spring整合成功. <br> Struts2与spring与hibernate整合成功. <br> </body> </html>
布置工程时出错, 导入slf-nop包解决!!
http://localhost:8080/Itcastoa/test.action后,
创建了新表, 把service里的异常删掉, 再执行, 保存进去两个数据. 并且从2,3开始计数id
到此整合完成!!!
spring和hibernate整合总结:
1. 新建jdbc.properties, 把数据库连接信息填入:
jdbcUrl=jdbc:mysql://localhost/itcastoa0720 driverClass=com.mysql.jdbc.Driver user=root password=linda0213
2. 配置hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 2. other configuration --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="connection.pool_size">1</property>
<!--3. mapping --> <mapping resource="cn/itcast/oa/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
3. applicationContext.xml配置内容: 导入属性文件, sessionFactory, dataSource, transaction
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.itcast.oa" /> <!-- <bean id="testAction" class = "cn.itcast.oa.test.TestAction"></bean> --> <!-- 导入外部的properties文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 指定 hibernate 配置文件路径 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置c3p0数据库连接池 --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${user}"></property> <property name="password" value="${password}"></property> <!-- 其他配置 --> <!-- 初始化时获取3个连接, 取值应该在minPoolSize与maxPoolSize之间, default:3 --> <property name="initialPoolSize" value="3"></property> <!-- 连接池中保留的最小连接数, default:3 --> <property name="minPoolSize" value="3"></property> <!-- 连接池中保留的最大连接数, default:15 --> <property name="maxPoolSize" value="5"></property> <!-- 当连接池中的连接耗尽的时候, c3p0一次同时获取的连接数, default:3 --> <property name="acquireIncrement" value="3"></property> <!-- 控制数据源内加载的PreparedStatements数量, 如果maxStatements与maxStatementsPerConnection均为0, 则缓存被关闭, default:0 --> <property name="maxStatements" value="8"></property> <!-- maxStatements与maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数, default:0 --> <property name="maxStatementsPerConnection" value="5"></property> <!-- 最大空闲时间, 1800秒内未使用则连接被丢弃,若为0则永不丢弃,default:0 --> <property name="maxIdleTime" value="1800"></property> </bean> </property> </bean> <!-- 配置声明式事务管理 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:annotation-driven transaction-manager="txManager"/> </beans>
4. 编写业务逻辑service类: 此时就可以注入容器里的sessionFactory了, 同时声明事务管理
@Service public class TestService { @Resource private SessionFactory sessionFactory; @Transactional public void saveTwoUsers(){ Session session = sessionFactory.getCurrentSession(); session.save(new User()); //int a = 1/0; //exception session.save(new User()); } }
5. 测试文件可以直接获取testService了:
public class SpringTest { private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testTransaction() throws Exception { TestService testService = (TestService) ac.getBean("testService"); testService.saveTwoUsers(); } }
到此 spring和hibernate整合完成,
再验证struts整合:
action调用testService测试:
@Controller @Scope("prototype") public class TestAction extends ActionSupport{ @Resource private TestService testService; @Override public String execute() throws Exception { System.out.println("===>TestAction.execute()"); testService.saveTwoUsers(); return "success"; } }
浏览器输入http://localhost:8080/itcastoa/test.action验证成功!!!
Struts2添加成功. Struts2与spring整合成功. Struts2与spring与hibernate整合成功.