Spring+Struts2+Hibernate整合(配置方式)

文章摘要:
本文通过演示在前端JSP页面中往Oracle数据库插入一条数据,描述了Spring3、Struts2和Hibernate3三大框架的整合步骤。

软件环境:
struts-2.3.15.1
spring-framework-3.2.0
hibernate-distribution-3.6.10
Oracle 11.2.0.1.0
MyEclipse 10.7

一、三大框架导入jar包
1、Struts jar包
(1)Struts jar包
struts-2.3.15.1-all\struts-2.3.15.1\apps\struts2-blank\WEB-INF\lib下所有jar包
(2)Struts与Spring整合的jar包
struts-2.3.15.1-all\struts-2.3.15.1\lib目录下:
struts2-spring-plugin-2.3.15.1.jar — 整合Spring框架
struts2-json-plugin-2.3.15.3.jar — 整合AJAX
struts2-convention-plugin-2.3.15.3.jar — 使用Struts2注解开发
2、Struts配置文件
struts.xml,注意在这里Spring和Struts的整合方式有两种

1
2
3
4
5
6
7
8
    <package name="default" namespace="/" extends="struts-default">
        <!-- 方法1:Struts自己管理 -->
        <!--
        <action name="book_*" class="cn.jianyu.action.BookAction" method="{1}"></action>
         -->
        <!-- 方法2:Spring的伪类,applicationContext里面定义的bean-->
        <action name="book_*" class="bookAction" method="{1}"></action>
    </package>

web.xml

1
2
3
4
5
6
7
8
9
10
    <!-- 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>

3、Spring jar包
Spring3.2 开发最基本jar包
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
AOP开发
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring Jdbc开发
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
Spring事务管理
spring-tx-3.2.0.RELEASE.jar
Spring整合其他ORM框架
spring-orm-3.2.0.RELEASE.jar
Spring在web中使用
spring-web-3.2.0.RELEASE.jar
Spring整合Junit测试
spring-test-3.2.0.RELEASE.jar

4、Spring配置
applicationContext.xml
Log4j.properties

5、Srping在web.xml中配置
添加

1
2
3
4
5
6
7
8
9
10
11
    <!-- 配置Spring的监听器 -->
    <listener>
        <!-- 监听器默认加载的是:WEB-INF/applicationContext.xml -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
   
    <!-- 指定Spring框架配置文件的所在位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

6、Hibernate jar包
核心包:hibernate3.jar
lib/required/*.jar
lib/jpa/*.jar
引入hibernate整合日志系统的jar包:
slf4j-api-1.6.1.jar
slf4j-log4j12-1.7.2.jar
数据连接池:
c3p0-0.9.1.jar
数据库驱动:
oracle-connector-java.jar

二级缓存:(可选)
backport-util-concurrent.jar
commons-logging.jar
ehcache-1.5.0.jar

7、Hibernate配置
hibernate.cfg.xml
Book.hbm.xml

二、Spring的整合Struts
1、创建包结构

ssh工程包结构

工程包结构

2、Action的管理
参考struts.xml中的注释说明

3、web层获得Service
传统方式:
获得WebApplicationContext对象.
通过WebAppolicationContext中getBean(“”);

实际开发中:
引入了struts2-spring-plugin-2.3.15.3.jar
有一个配置文件 : struts-plugin.xml

jar包中开启常量 :

1
  <constant name="struts.objectFactory" value="spring" />

引发另一个常量的执行:(Spring的工厂类按照名称自动注入)
struts.objectFactory.spring.autoWire = name

三、Spring整合Hibernate
1、第一种整合方式:零障碍整合
在Spring中引入Hibernate的配置文件.
(1)通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件

1
2
3
4
    <!-- 零障碍整合 在spring配置文件中引入hibernate的配置文件 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    </bean>

(2)Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO.

1
2
3
4
5
* DAO继承HibernateDaoSupport.
    <!-- DAO的配置 -->
    <bean id="bookDao" class="cn.itcast.dao.BookDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

改写DAO:继承HibernateDaoSupport类.

1
2
3
4
5
6
7
8
public class BookDao extends HibernateDaoSupport{

    public void save(Book book) {
        System.out.println("DAO层的保存图书...");
        this.getHibernateTemplate().save(book);
    }

}

(3)创建一个映射文件 Book.hbm.xml:

1
2
3
4
5
6
7
8
9
<hibernate-mapping>
    <class name="cn.itcast.vo.Book" table="book">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="price"/>
    </class>
</hibernate-mapping>

(4)事务管理:

1
2
3
4
    <!-- 管理事务 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

(5)注解管理事务:

1
2
<!-- 注解开启事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

(6)在业务层类上添加一个注解:

1
@Transactional

————————————————–
在前端输入数据,点击添加,数据成功插入后台数据库,控制台打印信息如下:

运行结果

运行结果

源代码:spring3_ssh1工程
链接:http://pan.baidu.com/s/1slGpETv 密码:py6k

2、没有Hibernate配置文件的形式(源代码中的spring3_ssh2工程)
修改applicationContext.xml,删除

1
2
3
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    </bean>

增加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    <!-- 没有hibernate配置文件 -->
    <!-- 引入外部属性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
   
    <!-- 配置c3p0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
   
   
    <!-- 零障碍整合:在Spring配置文件中引入hibernate的配置文件 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties" >
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
            </props>
        </property>
       
        <!-- 加载映射 -->
        <!--<property name="mappingResources" >
            <list>
                <value>cn/jianyu/vo/Book.hbm.xml</value>
            </list>
        </property> -->
       
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:cn/jianyu/vo</value>
            </list>
        </property>
    </bean>

删除hibernate.cfg.xml文件

源代码:spring3_ssh2工程
https://github.com/baijy/springwork/tree/master/spring3_ssh2