SSH整合

基于struts2.6.3 +spring 2+hibernate4整合
1.spring beans.xml
<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.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
              http://www.springframework.org/schema/tx/spring-tx.xsd
              http://www.springframework.org/schema/aop
              http://www.springframework.org/schema/aop/spring-aop.xsd">
  
  <!-- Annotation配置与XML配置不一样! -->
   <context:annotation-config/><!-- 打开Annotation -->
   <context:component-scan base-package="org.zttc"/>
   
   <!-- 此处dbcp类路径发生变化,属于dbcp新版与老版兼容问题 -->
   <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- 配置连接池初始值 -->
        <property name="initialSize" value="1"/>
        <!-- 连接池最大值 -->
        <!-- <property name="maxActive" value="100"/> -->
    <!-- 最大空闲时,当经过一个高峰之后,连接池可以将一些用不到的连接释放,一直减少到minIdle为止 -->
        <property name="minIdle" value="1"/>
        <!-- <property name="maxWait" value="1000"/> -->
    </bean>
    
    <!-- 导入src目录下的jdbc.properties -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 创建spring的SessionFactory工厂 -->
<!-- 如果使用的是Annotation的方式,不能使用hibernate3.LocalSessionFactoryBean
    而应该使用hibernate3.annotation.AnnotationSessionFactoryBean 
    hibernate4 采用LocalSessionFactoryBean-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!-- 1. 注入数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 2.设置spring区哪一个包中查找相应的实体类 -->
        <property name="packagesToScan" ><!-- name="mappingResources" -->
            <value>org.zttc.spring.model</value>
        </property>
        <property name="hibernateProperties">
          <!-- <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
          </value> -->
          <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.format_sql">false</prop>
          </props>
        </property>
      </bean>
    <!-- 配置spring的事务处理 -->
    <!-- 1.创建事务管理器 -->
    <bean id="transactionManager"
                class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 配置AOP,spring通过AOP来进行事务管理的 -->
      <aop:config>
      <!-- 设置pointcut表示那些方法要加事务处理 -->
      <!-- 以下事务声明在DAO中,但是通常都会在service处理多个业务对象逻辑的关系,诸如删除、更新等
      此时如果在执行一个步骤后抛出异常,就会导致数据不完整,所以事务不应该在DAO层处理,而应该是在service
      这也就是spring所提供的一个非常方便的工具:声明式事务 -->
        <!-- <aop:pointcut id="allMethods"
            expression="execution(* org.zttc.spring.dao.*.*(..))"/> -->
            <aop:pointcut id="allMethods"
            expression="execution(* org.zttc.ssh.service.*.*(..))"/>
        <!-- 通过advisor来确定具体要加入事务控制的方法 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
      </aop:config>
    <!-- 配置哪些方法要加入事务控制 -->
      <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
        <!-- 让所有的方法都加入事务管理,为了提高效率,可以把一些查询之类的方法设置为只读的事务 -->
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
            <!-- 以下方法都是可能涉及修改的方法,就无法设置为只读 -->
              <tx:method name="add*" propagation="REQUIRED"/>
              <tx:method name="del*" propagation="REQUIRED"/> 
              <tx:method name="update*" propagation="REQUIRED"/> 
              <tx:method name="save*" propagation="REQUIRED"/>    
        </tx:attributes>
      </tx:advice>

      <!-- 开启hibernateTemplate,为其注入sessionFactory
      使用hibernateTemplate麻烦在于获取Session的方式
      hibernate4中已经不支持 -->
  <!--     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
          <property name="sessionFactory" ref="sessionFactory"/>
      </bean> -->
</beans>

2.struts.xml
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <!-- ssh整合,表示Action由spring来进行创建,可以直接使用spring依赖来注入
    此处申明spring的方式与以前版本不一样 -->
    <constant name="struts.objectFactory" value="spring" />
    <package name="default" namespace="/" extends="struts-default">

      <!--   全局结果集就是公共的结果集,所有Action只要找到相应的返回值就会来对应全局结果集 -->
        <global-results>
            <result name="error">/WEB-INF/jsp/inc/error.jsp</result>
            <result name="exception">/WEB-INF/jsp/inc/exception.jsp</result>
            <result name="loginInput">/WEB-INF/Login/input.jsp</result>
        </global-results>
        
       <!--  定义异常处理界面 -->
       <global-exception-mappings>
               <exception-mapping result="exception" 
                   exception="org.zttc.ssh.exception.UeerException"/>
       </global-exception-mappings>

        <!-- 基于通配符,由于整合了Spring再calss中就不用再使用完整的类了 
        而应该使用spring所注入的对象,如UserAction就写userAction,此处特别注意第一个字母小写
       访问方法:http://localhost:8080/Java8_struts2/User_add.action
         http://localhost:8080/Java8_struts2/User_add -->
          <action name="*_*" class="{1}Action" method="{2}">
            <result>/WEB-INF/jsp/{1}/{2}.jsp</result>
            <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result>
            <result type="redirect" name="redirect">${url}</result>
        </action>
    </package>
    <!-- <include file="example.xml"/> -->

3.web.xml
<!-- 创建spring的监听器 -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!-- spring的监听器可以通过这个上下文参数来获取beans.xml的位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
<!-- /WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml -->
        <param-value>
            classpath*:beans.xml
        </param-value>
    </context-param>
    <!-- 进行字符编码处理的filter必须在OpenSessionInView之前 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- spring中提供了org.springframework.orm.
                        hibernate4.support.OpenSessionInViewFilter
    这个类来实现OpenSessionInViewFilter操作 -->
    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>
  org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    
    <filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!-- 分页pager过滤器 -->
    <filter>
        <filter-name>SystemContextFilter</filter-name>
        <filter-class>org.zttc.ssh.filter.SystemContextFilter</filter-class>
        <init-param>
            <param-name>pageSize</param-name>
            <param-value>15</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SystemContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
<!-- 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>


你可能感兴趣的:(SSH整合)