zoukankan      html  css  js  c++  java
  • Spring与Struts整合

    Spring框架是一个非常优秀的轻量级Java EE容器,Spring框架是整个轻量级Java EE框架的核心。大部分的Java EE应用,都会考虑使用Spring容器管理应用中的组件,从而保证各组件之间的低耦合。Struts2框架只是一个MVC框架,Web层的解决方案。其通过一种”可插拔式“的插件,实现了与Spring框架的整合。

    Struts2提供了两种基本的整合策略,其中一种策略是将Action实例交给Spring容器来负责生成、管理,通过这种方式,可以充分利用Spring容器的IoC特性,提供最好的解耦;另外一种策略是利用Spring插件的自动装配方式,当Spring插件创建Action实例后,立即将Spring容器中对应的业务逻辑组件注入Action实例。通过这两种方式,即可让Struts2的Action访问到Spring容器中的Bean。整合的关键是让Struts2的Action可以访问Spring容器中的业务逻辑组件,不管通过上述的两种方式的哪种,都可实现让Action访问Spring容器中业务逻辑组件的目的。

    一、Struts2插件

    Struts2的插件是一个JAR文件,这个文件可以用于扩展、改变或者添加Struts2的功能,只需要复制该jar文件到web应用中即可。

    Struts2的插件Jar文件都必须包含一个名为struts-plugin.xml的配置文件,其余普通的struts.xml文件内容完全相同。struts2插件的加载顺序随机,但是配置文件确实按照 struts-default.xml、struts-plugin.xml、struts.xml顺序加载。 从系统实现的角度来看,如果我们需要扩展struts2的功能,可以通过提供新的拦截器、新的Bean实例来实现;如果从系统结构的角度来看,如果我们需要扩展struts2的功能,则通过提供新的插件即可。

    spring和struts2的整合,必须安装struts2的spring插件,只需将struts2-spring-plugin-x.x.x.x.jar文件复制到Web应用的WEB-INF/lib路径下即可。一旦安装了spring插件,我们便可以通过spring控制所有的action,也可在struts2创建之后,使用spring注入进去。为了使用spring容器,我们需要先初始化spring容器,spring提供了ContextLoaderListener类,该类可以作为Web应用的Listener使用,它会在Web应用启动自动在WEB-INF路径下查找applicationContext.xml配置文件,并且根据此文件创建Spring容器。如果我们使用别的配置文件,或者配置文件不止这一个,可以使用参数contextConfigLocation指定,如下:

     <context-param>

         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/xxxDao.xml,/WEB-INF/applicationContext.xml</param-value>
         </context-param>
         <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
         </listener>

      下面我们考虑让spring容器来管理应用中的控制器,struts2的核心控制器首先拦截到用户请求,然后将请求转发给对应的Action处理,这个过程是固定的。但实际上,Action实例是struts2容器产生的,我们需要用spring容器来产生它,充分利用spring的ioc特性。spring插件提供了一种为Action,当我们在struts.xml文件中陪孩子action时,指定的class,指向spring容器中的BeanID,而Struts2的该action只是一个摆设,spring容器中才是真正的控制器。

    如下,struts2.xml中配置:

    <struts>

            <package name="demo" extends="struts-default">
                <action name=login" class="loginAction">
                        <result name="error">/WEB-INF/jsp/error.jsp</result>
                        <result>/WEB-INF/jsp/welcome.jsp</result>
                </action>
            </package>

          </struts>  

    这个loginAction类不是实际的处理类,我们需要在applicationContext.xml中配置该Bean,如下:

    <bean id="loginAction" class="com.demo.struts2.action.LoginAction" scope="prototype" /> 

    如果使用了其他的bean,还可以在该bean进行注入。这样便实现了spring容器产生action,但是这样显然action配置比较臃肿,代码可读性降低。

    二、使用自动装配

    这种策略下,action还是有spring插件创建,只是使用了spring的自动装配策略而已。如果不指定装配策略,默认按name自动装配。spring插件的自动装配策略通过struts.objectFactory.spring.autoWire常量指定,该常量可以有name、type、auto、constructor几种。

    修改struts.xml的配置如下:

    <struts>

            <package name="demo" extends="struts-default">
                <action name=login" class="com.demo.struts2.action.LoginAction">
                        <result name="error">/WEB-INF/jsp/error.jsp</result>
                        <result>/WEB-INF/jsp/welcome.jsp</result>
                </action>
            </package>

         </struts> 

    可以看出其实和不整合spring好像没有区别,配置action时一样需要指定action的实现类,此时有一点不同的是action实现类中的依赖对象或者说业务逻辑对象,我们可以通过spring注入进去。

  • 相关阅读:
    sql server 2008数据复制方法
    排错技能:任务管理器中追踪某w3wp.exe是哪个IIS站点的application pool
    SplendidCRM中给来自EditView中的listbox控件设置选中值或数据源
    jQuery String Functions
    [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .
    [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
    深入理解C语言
    Qt回忆录之配置开发环境
    360电话面试
    浅谈C++设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/2964414.html
Copyright © 2011-2022 走看看