Struts与Spring的集成主要有两种方式,即DelegatingRequestProcessor和DelegatingActionProxy方式,这两种方式应用了Spring IOC来管理Struts的Action,顾名思义,两者即是在代理某对象,熟释Struts的必然知晓RequestProcessor和Action,Spring在这两处切入到页面层的请求链中(通过扩展Struts中的RequestProcessor、Action类),以便将截获的请求传入到Spring管理的Action实例中,从而实现页面层到服务层的有效衔接。配置在Struts 1.2.9 + Spring 2.0环境下通过。
1 DelegatingRequestProcessor
1.1 配置ContextLoaderPlugin加载Spring配置
Spring中的ContextLoaderPlugin类实现了Struts的PlugIn接口,用于加载Spring配置。
ContextLoaderPlugin默认加载为WEB-INF\${actionServletName}-servlet.xml,如果应用部署描述文件web.xml中配置:
- <servlet>
- <servlet-name>actionServlet</servlet-name>
- <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>/WEB-INF/struts-config.xml</param-value>
- </init-param>
- </servlet>
则ContextLoaderPlugin默认加载为WEB-INF\actionServlet-servlet.xml文件。我们需要在struts-config文件中加入:
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
如果有多个
Spring
配置文件,则可以如下使用:
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/spring/applicationContext.xml,
- /WEB-INF/spring/actionContext.xml/>
- </plug-in>
1.2 配置DelegatingRequestProcessor转发请求
在
Struts
中,
ActionServlet
通过
RequestProcessor
完成实际的请求转发,
Spring
中的DelegatingRequestProcessor扩展了
Struts
下的
RequestProcessor
类,要想DelegatingRequestProcessor完成请求转发就得在struts-config.xml文件中配置:
- <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
1.3 配置Struts中的Action
Struts配置文件struts-config.xml配置片段:
- <action-mappings>
- <action path="/PreAddEditBook" name="bookForm" scope="request">
- <forward name="AddEditBookJsp" path="/AddEditBook.jsp"/>
- action>
- action-mappings>
Spring配置文件actionContext.xml配置片段:
- <bean name="/PreAddEditBook" class="com.examples.action.PreAddEditBookAction"
- scope="singleton">
- <!-- Spring服务层接口 -->
- <property name="bookManager" ref=" bookManager"/>
- </bean>
2 DelegatingActionProxy
Spring中的这个DelegatingActionProxy类扩展了Struts中的Action类。
此种方式只需要在以上方式修改两处即可:
1) 将1.2的配置注释掉;
2) 1.3中Struts配置文件struts-config.xml中的action配置里加入type=”org.springframework.web.struts.DelegatingActionProxy”属性项。
3 两种方式比较
1) 两者的目的都是将请求转发给Spring管理的Bean;
2) 在请求转发给action之前,转发给Spring的Bean;DelegatingRequestProcessor
3) 被配置为Struts的action,所有请求由ActionServlet截获再转发到action(所有action的实现类都是DelegatingActionProxy),DelegatingActionProxy再将请求转发到Spring的Bean;DelegatingActionProxy
4) 占用了一个Struts的扩展点即RequestProcessor,用户如需扩展Struts的RequestProcessor,此时只能从DelegatingRequestProcessor作为基类扩展;DelegatingRequestProcessor
5) 相对较多地侵入了Struts原有的独立的配置,所有action的实现类都是DelegatingActionProxy,页面层不方便脱离Spring。DelegatingActionProxy