zoukankan      html  css  js  c++  java
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二

    http://blog.csdn.net/yerenyuan_pku/article/details/52894958

    前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Struts1.3.8,但是集成的方案并不完美,因为我们在Action里面每次要取得Spring容器实例,都必须有这样的代码:

    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(
                    this.getServlet().getServletContext());

    是不是很招人烦啊!而且这还会导致Struts的action跟Spring紧密耦合,因为我们使用到了Spring里面的类了。这时我们就想能不能采用Spring依赖注入的方式直接将其注入进来呢?我们应知道如果我们要使用Spring的依赖注入,前提是bean必须交给Spring容器进行管理。所以,我们要把action交给Spring管理,这样我们可以使用依赖注入在action中注入业务层的bean。注意,要确保action的path属性值与bean的名称相同。如果Struts配置文件中的<action>元素为:

    <action path="/person/list" ...>
    
    </action>

    那么在把action交给Spring管理时,Spring配置文件中应添加如下配置:

    <bean name="/person/list" class="cn.itcast.web.action.PersonAction"/>

    除此之外,我们还要在Struts配置文件中添加进Spring的请求控制器,该请求控制器会先根据action的path属性值到Spring容器中寻找跟该属性值同名的bean,如果寻找到即使用该bean处理用户请求。即在Struts配置文件中添加如下配置:

    <controller>
        <set-property property="processorClass"
            value="org.springframework.web.struts.DelegatingRequestProcessor" />
    </controller>

    至此,Struts配置文件——struts-config.xml的内容就是:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts-config PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
              "http://struts.apache.org/dtds/struts-config_1_3.dtd">
    
    <struts-config>
        <action-mappings>
            <action path="/person/list" validate="false">
                <forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
            </action>
        </action-mappings>
    
        <controller>
            <set-property property="processorClass"
                value="org.springframework.web.struts.DelegatingRequestProcessor" />
        </controller>
    
    </struts-config>

    Spring配置文件——beans.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.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    
        <context:annotation-config />
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url"
                value="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="username" value="root" />
            <property name="password" value="yezi" />
            <!-- 连接池启动时的初始值 -->
            <property name="initialSize" value="1" />
            <!-- 连接池的最大值 -->
            <property name="maxActive" value="500" />
            <!-- 最大空闲值。当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
            <property name="maxIdle" value="2" />
            <!-- 最小空闲值。当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
            <property name="minIdle" value="1" />
        </bean>
    
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" /> <!-- 数据源  -->
            <property name="mappingResources">
                <list>
                    <value>cn/itcast/bean/Person.hbm.xml</value> <!-- Hibernate的实体bean的映射文件(可有多个) -->
                </list>
            </property>
            <!-- hibernateProperties是用来配置Hibernate的属性信息 -->
            <property name="hibernateProperties">
                <value>
                    hibernate.dialect=org.hibernate.dialect.MySQLDialect
                    hibernate.hbm2ddl.auto=update
                    hibernate.show_sql=false
                    hibernate.format_sql=false
                </value>
            </property>
        </bean>
    
        <!-- 配置针对Hibernate的事务管理器,事务管理器对sessionFactory对象创建出来的session进行管理 -->
        <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <tx:annotation-driven transaction-manager="txManager" />
    
        <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" />
    
        <bean name="/person/list" class="cn.itcast.web.action.PersonAction" />
    </beans>

    注意一点,我们要向SSH项目中导入如下jar文件: 
     
    否则org.springframework.web.struts.DelegatingRequestProcessor该类将会找不到,org.springframework.web.struts.DelegatingRequestProcessor该类的处理过程为: 
     
    这样,总共需要向SSH项目中导入的jar文件有47个: 
     
    如此一来,PersonAction的代码就应该改为:

    public class PersonAction extends Action {
        @Resource PersonService personService;
    
        @Override
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            request.setAttribute("persons", personService.getPersons());
            return mapping.findForward("list");
        }
    
    }

    我们采用这种方式,可以看到并没有使用到Spring里面的任何类。查看数据库person表,可以看到person表有如下记录: 
     
    这时,我们通过浏览器访问url地址:http://localhost:8080/SSH/person/list.do,可以看到如下结果: 

    至此,说明Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成的第二种方案成功了,而且这种方式更加优雅,实际开发中就该这样做。如须查看源码,可点击Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二进行下载。

  • 相关阅读:
    机器学习实战
    python中的上下文管理器
    python中的参数传递
    SecureCRT在mac下无法输入中断命令
    Vim练级攻略(转)
    09_MySQL DQL_SQL99标准中的多表查询(外连接)
    08_MySQL DQL_SQL99标准中的多表查询(内连接)
    07_MySQL DQL_多表查询_等值内连接
    06_MySQL DQL_分组查询
    05_MySQL常见函数_分组函数
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6913561.html
Copyright © 2011-2022 走看看