spring与strut2的三种方式

在说三种方法前,先说一点:无论使用哪种方法,都需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境。就像添加任何其他插件一样,向 struts-config.xml 文件添加该插件,如下所示:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>
一、使用 Spring 的 ActionSupport 类整合 Structs
  手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法。只需要从 Spring 的 ActionSupport 而不是 Struts Action 类扩展动作。
通过从 Spring 的 ActionSupport 类而不是 Struts 的 Action 类进行扩展;使用 getWebApplicationContext() 方法获得一个 ApplicationContext;为了获得业务服务,使用ApplicationContext的getBean方法 查找一个 Spring bean。
     这种方法很简单并且易于理解。但是它将 Struts 动作与 Spring 框架耦合在一起。如果想替换掉 Spring,那么必须重写代码。并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。 
二、使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor
     将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。分离的一种方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程序,
向 struts-config.xml 文件添加
 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
下一步是在Spring 配置文件中注册该动作;再在Struts action类中增加JavaBean 属性。DelegatingRequestProcessor自动地配置这种属性。
    这种设计使 Struts 动作并不知道它正被 Spring 管理,并且能够利用 Sping 的动作管理框架的所有优点。由于Struts 动作注意不到 Spring 的存在,所以不需要重写的 Struts 代码就可以使用其他控制反转容器来替换掉 Spring。但是仍然存在一些问题。如果使用一个不同的 RequestProcessor,则需要手动整合 Spring 的 DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低应用程序的灵活性。此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。
三、将 Struts Action管理委托给 Spring 框架
   一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 struts-config.xml 文件只有一个小小的差别。它注册 Spring 代理类的名称,而不是声明动作的类名,DelegatingActionProxy 类使用动作映射名称查找使用 ContextLoaderPlugIn 声明的Spring 环境中的动作。
     动作委托解决方法是这三种方法中最好的。Struts 动作不了解 Spring,不对代码作任何改变就可用于非 Spring 应用程序中。RequestProcessor 的改变不会影响它,并且它可以利用 Spring AOP 特性的优点。
  动作委托的优点不止如此。一旦让 Spring 控制 Struts 动作,就可以使用 Spring 给动作补充更强的活力。例如,没有 Spring 的话,所有的 Struts 动作都必须是线程安全的。如果您设置 标记的 singleton 属性为“false”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时, 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。(转载)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值