Struts与Spring整合的方法
要使Struts与Spring协同工作需要修改Struts的配置文件struts-config.xml,以便将Spring的配置文件applicationContext.xml或者还有其它的xml文件加入上下文。
修改Struts的配置文件struts-config.xml
<struts-config>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
通过plug-in我们实现了Spring Context的加载(有多个xml文件,使用逗号隔开),我们还需要修改配置,将Struts Action交给Spring容器进行管理:
要改的地方就是struts-config.xml的关于action部分的配置,将先前的每一个action的type由原来它们所对应的具体的类修改为:org.springframework.web.struts.DelegatingActionProxy
然后在spring的配置文件中来配置action,是将action作为bean来配置的。
<!-- Action配置 -->
<bean name="/user" class="com.ctbr.springtest.web.action.UserAction"
singleton="false">
<!-- 在spring2.0中已经没有了singleton这个属性了,改用scope了 -->
<property name="userService">
<ref bean="userService"/>
</property>
</bean>
这样就将struts和spring整合好了,然后在action中要为XxxService设一个setter注入方法,在具体的方法中就可以使用getBean("fdsffsdffds")来取得业务对象了。当然这只是其中的一种方法。
总结(原理):
而在面向SS组合的配置方式中,我们用Spring提供的DelegatingActionProxy 作为Action的type属性。DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将把调用请求转交给真正的Action实现。下面是DelegatingActionProxy的execute方法代码:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//获得实际的Action实例,并将请求转交
Action delegateAction = getDelegateAction(mapping);
return delegateAction.execute(mapping, form, request, response);
}
如此一来,Struts 在运行期加载的实际上是DelegatingActionProxy , 而DelegatingActionProxy则实现了针对实际Action的调用代理,Struts最终调用的将是由Spring管理的Action实例。
通过这样的方式,Spring 获得了对Action 实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。既然Action已经由Spring全权接管,那么我们就可以将此Action看作是Spring中的一个Bean,它可享受Spring提供的所有服务(依赖注入、实例管理、事务管理等)。