spring struts 整合
Spring Struts1.x 整合
使用Spring的ActionSupport?类整合Structs1.X,使用?Spring?的?DelegatingRequestProcessor覆盖Struts的RequestProcessor,将StrutsAction管理委托给Spring框架
--
装载应用环境:
无论您使用哪种技术,都需要使用?Spring?的?ContextLoaderPlugin?为?Struts?的?ActionServlet?装载?Spring?应用程序环境
在struts-config.xml?文件尾处添加该插件:
<plug-in?className=??"org.springframework.web.struts.ContextLoaderPlugIn">
????<set-property property=?"contextConfigLocation" value="/WEB-INF/class/applicationContext.xml"/>
</plug-in>
--
第一种:使用Spring的ActionSupport
该方法:?简单快捷,但会导致struts和spring耦合在一起,如果要移值struts应用程序要重写代码.
例如:
??public?class?ActionName?extends?ActionSupport?{
????public?ActionForward?execute(????){
????------------------------------------------
????ApplicationContext?ctx=?getWebApplicationContext();????
????BookService?bookService?=?(BookService)?ctx.getBean("bookService");?????
????-------------------------------------------------------------------------??
???}
}
--
?
第二种:覆盖?RequestProcessor
该方法使用?org.springframework.web.struts.DelegatingRequestProcessor?类来覆盖?Struts?的?RequestProcessor?处理程序,通过?Spring?的?DelegatingRequestProcessor?进行整合,看下面的struts-config.xml文件的主要配置部分:
<form-beans>
?<controller?processorvalue="spring" />
?????? ...
</struts>
3.配置Spring监听器。在web.xml文件中增加如下内容:
<listener>
?????? <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4.Spring配置文件。默认情况下,Spring配置文件为applicationContext.xml,该文件需要保存在Web应用的WEB-INF目录下。内容示例如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
?????? "-//SPRING//DTD BEAN//EN"
?????? "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
?????? <bean id="personManager" extends="struts-default">
?????????? <action name="foo" namespace="/secure" extends="default">
?????????? <action name="bar" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
?????? "-//SPRING//DTD BEAN//EN"
?????? "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
?????? <bean id="bar" singleton="false"/>
?????? ...
</beans>
?
??? <!--? 设置Spring对象工厂为自动 -->
??? <constant name="struts.objectFactory" value="spring" />
??? <package name="spring-default">
??????? <interceptors>
??????????? <interceptor name="autowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
??????? </interceptors>
??? </package>???
</struts>
其中设置了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容器中获得相应的实例。
?
?