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>
<!-- 此处可以省略type属性 -->
<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
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>
<!-- 此处可以省略type属性 -->
<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