struts2+spring的两种整合方式

本文介绍了Struts2与Spring的两种整合方案,包括利用Spring插件进行自动装配及使用Spring管理Action的方法。同时,详细解释了如何通过ContextLoaderListener和ContextLoaderServlet初始化Spring容器。

    也许有些人会因为学习了struts1,会以为struts2、struts1与spring的整合也是一样的,其实这两者相差甚远。下面就来讲解一下struts2与spring的整合两种方案。(部分转载,里面也有自己的内容)

    借助于Spring插件(Struts2-spring-plugin-XXX.jar,我们可以非常简单地完成SpringStruts2的整合,这种整合包括让Action自动装配Spring容器中的Bean,以及让Spring管理应用中的Action两种方式,不管采用哪种方式,完成Struts2Spring的整合都是非常简单的,而且差别不大.一旦在Web应用中安装了Spring插件,即可充分利用该插件提供的功能:

1,可以通过Spring来创建所有的Action,InterceptorResult.

2,可以在Struts创建了某个对象(Action实例)之后,Spring将其依赖的组件自动注入该对象

3,提供了两个拦截器来完成自动装配.

此外,在使用Spring容器之前,必须先完成Spring容器的初始化,为了完成Spring容器的初始化,Struts2利用了Spring所提供的两种初始化方式.

1.  利用ContextLoaderListener

Spring提供一个ContextLoaderListener对象,该类可以作为Web应用的Listener使用,它会在Web应用启动时自动查找WEB-INF/下的applicationContext.xml配置文件(Spring的配置文件),并且根据该文件来创建Spring容器.因此,如果Web应用中只有一个Spring配置文件,并且文件名为"applicationContext.xml",并将该文件放在Web应用的WEB-INF/路径下,则只需在web.xml文件中增加如下一段即可:

<!-- 根据默认配置文件来初始化Spring容器 -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

如果有多个配置文件需要载入,或则applicationContext.xml不在WEB-INF目录下,则应该在web.xml中再使用<context-param>元素来确定配置文件的文件名,内容如下:

<!-- 定义spring配置文件 -->

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

     /WEB-INF/applicationContext.xml,

     /WEB-INF/classes/conf/spring/applicationContext-*.xml

   </param-value>

</context-param>

如果spring配置文件被命名为applicationContext.xml,并且放在WEB-INF目录下,则不需要配置<context-param>,因为ContextLoaderListener默认在WEB-INF目录下寻找名为applicationContext.xml的文件。若存在多个Spring配置文件,则在<param-value>中依次列出,之间以逗号隔开。

 

2.  采用load-on-startup Servlet创建ApplicationContext(这也是为了兼容Servlet 2.3以下版本,它们不支持<listener>,需要配置<servlet>)

利用Listener创建Spring容器很简单,但有一个明显的局限,因为ListenerServlet2.3以后才开始出现的规范,这意味着在低版本的Servlet中只能利用Web应用中的load-on-startupServlet而不能利用Listener.这两者的作用是一样的.为了使用load-on-startup Servlet来创建Spring容器,Spring提供了一个特殊的Servlet:ContextLoaderServlet,Servlet在初始化时,会自动查找WEB-INF/下的"applicationContext.xml"文件,如果只有一个配置文件,并且名为"applicationContext.xml",则在web.xml文件中的配置如下:

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

servlet仅用于提供后台服务,负责创建spring容器,无需响应客户端请求,因此无需配置servlet mapping.

如果有多个配置文件,则与上面一样使用<context-param>元素来确定多个配置文件,事实上,无论是ContextLoaderServlet还是ContextLoaderListener都是通过调用ContextLoader来创建spring容器的。


Servlet规范中Listener总是比Servlet优先加载的,因此,采用ContextLoaderListener更好(web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ).

 

为了让控制器Action访问Spring的业务逻辑组件,有两种策略:

1.  Spring管理控制器,并利用依赖注入为控制器注入业务逻辑组件

1)        将Struts的业务逻辑控制器类配置在Spring的配置文件中,业务逻辑控制器中引用的业务类一并注入。注意,必须将业务逻辑控制器类配置为scope=”prototype”!
示例如下:
<bean id=”LoginAction” class=”yaso.struts.action.LoginAction”>
                     <property name=”loginDao” ref=”LoginDao”/>
</bean>
2)        在struts.xml或者等效的Struts2配置文件中配置Action时,指定<action>的class属性为Spring配置文件中相应bean的id或者name值。示例如下:
<action name=”LoginAction” class=”LoginAction”>
                     <result name=”success”>/index.jsp</result>
</action>

2.  控制器定位Spring工厂,也就是Spring的容器,Spring容器中取得所需的业务逻辑组件.

1)        业务类在Spring配置文件中配置,业务逻辑控制器类不需要配置,Struts2的Action像没有整合Spring之前一样配置,<action>的class属性指定业务逻辑控制器类的全限定名。
2)        业务逻辑控制器类中引用的业务类不需要自己去初始化,Struts2的Spring插件会使用bean的自动装配将业务类注入进来,其实业务逻辑控制器也不是Struts2创建的,而是Struts2的Spring插件创建的。默认情况下,插件使用by name的方式装配,可以通过增加Struts2常量来修改匹配方式:设置方式为:struts.objectFactory.spring.autoWire = typeName,可选的装配参数如下:
a)         name:等价于Spring配置中的autowire=”byName”,这是缺省值。(框架会去Spring中寻找与Action属性名字相同的bean)
b)        type:等价于Spring配置中的autowire=”byType”。
c)         auto:等价于Spring配置中的autowire=”autodetect”。
d)        constructor:等价于Spring配置中的autowire=” constructor”。

就这个策略,我现在只知道利用byName来实现自动装配。代码如下:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-autowire="byName" >
<!-- beanEmp2中的具体类中有一个属性empDao,存在geter和seter方法  -->
    <bean id="Emp2" class="com.neusoft.leehom.action.EmpAction" >
<!--        <property name="empDao" ref="EmpDaoImpl"></property>    -->
    </bean>

    <bean name="empDao" class="com.neusoft.leehom.dao.EmpDao" ></bean>

</beans>

由于上面empDao的名字相同,所以spring会直接根据注入属性的名字查找与之同名字的bean。

       对于这两种方式,Struts2都提供了对应的整合实现.比较这两种整合方式,其本质是一样的。不同之处在于,使用第二种自动装配的方式时,由于没有在Spring中配置业务逻辑控制器,所以需要对其配置一些AOP之类的内容时就很难实现了。

中文版,平时开发超实用工具。Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值