如何将旧的Struts应用程序与Spring 3.x集成

时间:2011-04-29 18:32:04

标签: spring struts inversion-of-control integration

我想知道如何以及将Struts 1.x应用程序与Spring 3.x集成的首选方法,以便我们可以从IOC中获益。

4 个答案:

答案 0 :(得分:6)

使用ContextLoaderPlugin并将struts控制器设置为processorClass“AutowiringRequestProcessor”,如下所示(在struts-config.xml中):

<controller>
    <set-property property="processorClass" value="org.springframework.web.struts.AutowiringRequestProcessor" />
</controller>

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/config/action-servlet.xml"/>
</plug-in>

action-servlet.xml必须是空bean上下文文件:

<beans></beans>

将以下init参数添加到web.xml中的ActionServlet:

<init-param>
    <param-name>autowire</param-name>
    <param-value>byName</param-value>
</init-param>

只需编写常规struts操作,并将注释“@Component”添加到每个操作,以便spring将发现操作并从中创建bean。 “AutowiringRequestProcessor”将找到与struts-config.xml中定义的动作类相匹配的正确bean。

现在也可以在setter上使用@Autowired将其他bean注入到Action类中。

答案 1 :(得分:2)

使用ContextLoaderPlugIn。在Spring 3.0中已经弃用,但仍然存在。

我在Struts 1.x和Spring 2.5.x中使用它 - 它工作得很漂亮。这种集成方法允许将Spring bean直接注入到Struts操作中,这非常简洁明了。

答案 2 :(得分:2)

您可以使用ApplicationContextAware接口让实用程序类可以访问ApplicationContext。

public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public static Object getSpringBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public void setApplicationContext(ApplicationContext appContext)
        throws BeansException {
        applicationContext = appContext;
   }
}

然后,您可以从Action类访问静态方法。

public class MyAction extends LookupDispatchAction {
    private MyService getMyService() {
        return (MyService) SpringUtil.getSpringBean("myService");
    }
}

不是最优雅的解决方案,但它确实有效。

答案 3 :(得分:-1)

这不起作用。在Spring 2.x之后的任何版本的Spring中都没有ContextLoaderPlugin。 Struts 1.x与2.x之后的任何版本的Spring都不兼容。在2.x之后配置任何版本的Spring以使用Struts 1.x是不可能的。您可能需要降级Spring版本的Struts升级版。除非你使用超过3.x的休眠版本,否则降级Spring可能会更容易。