Spring和Struts 2整合

Spring 和Struts 2都是应用非常广泛的J2EE应用程序框架,Struts 2主要注重的是将视图层和控制层分开,但是不涉及对模型层的优化设计;而Spring除了实现Struts 2的MVC功能外,还可以利用其控制反转的思想实现对模型层的优化,从更深层次去降低应用程序各个组件的耦合程度。本节将结合实例讲解如何实现 Spring框架和Struts 2框架的集成使用。

23.6.1 整合原理

Struts 2在发布的时候在其插件包struts-2.1.2\lib中有struts2-spring-plugin-2.1.2.jar,正是它实现了 Struts 2和Spring的整合。这个插件覆盖了Struts 2的ObjectFactory,所以在Struts 2创建一个对象的时候,例如Action类,它会先到Struts 2的配置文件去寻找类的名字,然后转到Spring配置文件中去查找名字找到该类。解压struts2-spring-plugin- 2.1.2.jar,可以看到有一个struts-plugin.xml文件,其内容如下:

1. <!DOCTYPE struts PUBLIC 2. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 3. "http://struts.apache.org/dtds/struts-2.0.dtd"> 4. <struts> 5. <!--定义一个bean:spring,其实现类为StrutsSpringObjectFactory --> 6. <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class= 7. "org.apache.struts2.spring.StrutsSpringObjectFactory" /> 8. <!--使Spring object factory的值为上面定义的bean:spring --> 9. <constant name="struts.objectFactory" value="spring" /> 10. <!--创建spring-default 包,其中包含两个拦截器--> 11. <package name="spring-default"> 12. <interceptors> 13. <interceptor name="autowiring" class="com.opensymphony.xwork2. 14. spring.interceptor.ActionAutowiringInterceptor"/> 15. <interceptor name="sessionAutowiring" class="org.apache.struts2. 16. spring.interceptor.SessionContextAutowiringInterceptor"/> 17. </interceptors> 18. </package> 19. </struts>

可以看到,上面代码中用<bean>标签定义了一个name为StrutsSpringObjectFactory的bean对象,用 它去替换struts.objectFactory:<constant name="struts.objectFactory" value="spring" />。并且定义了一个spring-default包,该包有两个拦截器,如果Action类不是由ObjectFactory创建的话,则这两个 插件会自动装配Action类。

附加一部分:

Struts2与Spring 的集成要用到Spring 插件包struts2-spring -plugin-x-x-x.jar,这个包是同Struts2一起发布的。Spring 插件是通过覆盖(override)Struts2的ObjectFactory来增强核心框架对象的创建。当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring 配置文件中的id属性进行关联,如果能找到,则由Spring 创建,否则由Struts 2框架自身创建,然后由Spring 来装配。Spring 插件具体有如下几个作用:

— 允许Spring 创建Action、Interceptror和Result。

— 由Struts创建的对象能够被Spring 装配。

— 如果没有使用Spring ObjectFactory,提供了2个拦截器来自动装配action。

开发者不必在Spring 中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象。

struts2-spring -plugin-x-x-x.jar插件中有一个struts-plugin.xml文件,该文件内容如下所示:查看

其中设置了Struts 2框架常量struts.objectFactory的值为spring ,实际上,spring 是org.apache.struts2.spring .StrutsSpringObjectFactory类的缩写,默认情况下所有由Struts 2框架创建的对象都是由ObjectFactory实例化的,ObjectFactory提供了与其他IoC容器如Spring 、Pico等集成的方法。覆盖这个ObjectFactory的类必须继承ObjectFactory类或者它的任何子类,并且要带有一个不带参数的构造方法。在这里用org.apache.struts2.spring .StrutsSpring ObjectFactory代替了默认的ObjectFactory。

如果Action不是使用Spring ObjectFactory创建的话,插件提供了两个拦截器来自动装配Action,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring 中寻找与Action属性名字相同的bean,可选的装配策略还有:type、auto、constructor,开发者可以通过常量struts.objectFactory.spring .autoWire来进行设置。

Struts 2框架整合Spring 后,处理用户请求的Action并不是Struts框架创建的,而是由Spring 插件创建的。创建实例时,不是利用配置Action时指定的class属性值,根据bean的配置id属性,从Spring 容器中获得相应的实例。


23.6.2 整合步骤

Spring和Struts 2的整合其实很简单,下面是整合步骤。

(1)复制jar文件。把struts 2-spring-plugin-2.1.2.jar和spring.jar复制到Web工程的WEB-INF/lib目录下,并且还需要复制commons-logging.jar。

(2)配置struts.objectFactory属性。在文件struts.properties中设置struts.objectFactory属性,使其使用StrutsSpringObjectFactory,代码如下:

struts.objectFactory=spring

当然也可以在struts.xml文件中配置,其中spring就是struts-plugin.xml中定义的bean:spring,代码如下所示。

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

(3)配置Spring监听器。在web.xml文件中增加如下内容:

   1. <listener>  
   2. <listener-class>org.springframework.web.context.ContextLoaderListener</-  
   3. listener-class>  
   4. </listener> 

(4)编写Spring配置文件。默认情况下Spring配置文件的名字为applicationContext.xml,该文件需要保存到Web工程的WEB-INF/目录下。内容实例如下:

1. <?xml version="1.0" encoding="UTF-8"?> 2. <!DOCTYPE beans PUBLIC 3. "-//SPRING//DTD BEAN//EN" 4. "http://www.springframework.org/dtd/spring-beans.dtd"> 5. <beans> 6. <!--创建一个bean:login,其实现类为LoginAction --> 7. <bean id="login" class="com.examp.ch23.LoginAction"> 8. <property name="loginCheck" ref="loginCheck"/> 9. </bean> 10. ... 11. </beans>

在这个文件中定义要加载的类对象。

(5)编写Struts 2配置文件。将Struts 2和Spring集成,其配置文件也有变化,如下所示。

   1. <?xml version="1.0" encoding="UTF-8" ?>  
   2. <!DOCTYPE struts PUBLIC  
   3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
   4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
   5. <struts>  
   6.     <package name="ch23" extends="struts-default" >  
   7.         <!--class="login"指向applicationContext.xml文件中定义的bean:login-->  
   8.         <action name="LoginAction" class="login">  
   9.             <result name="input">/login.jsp</result>  
  10.             <result name="success">/success.jsp</result>  
  11.         </action>  
  12.         ...  
  13.     </package>  
  14. </struts> 

可以看出上面代码中的LoginAction其class属性并没有给出完整路径名,因而objectFactory是找不到该类的,所以就会到applicationContext.xml中去寻找bean的名字为login的类对象。

来源:http://book.51cto.com/art/200909/154478.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值