您的位置:首页 > 编程语言 > Java开发

Struts整合Spring三种方式

2013-08-17 16:30 288 查看
三种整合技术(或者窍门)都有自己的优点和特点。我偏爱其中的一种,但是我知道这三种都能够加深您对 Struts 和 Spring 的理解。在处理各种不同情况的时候,这将给您提供一个广阔的选择范围。无论使用哪种技术,都需要使用 Spring 的 
ContextLoaderPlugin
 为
Struts 的 
ActionServlet
 装载 Spring 应用程序环境。方法如下:

使用 Spring 的 
ActionSupport
 类整合 Structs

使用 Spring 的 
DelegatingRequestProcessor
 覆盖 Struts 的 
RequestProcessor


将 Struts 
Action
 管理委托给 Spring 框架
1.使用Spring的ActionSupport
手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。为了使它变得更简单,Spring 提供了一些帮助。为了方便地获得 Spring 环境,
org.springframework.web.struts.ActionSupport
 类提供了一个 
getWebApplicationContext()
 方法。您所做的只是从
Spring 的 
ActionSupport
 而不是 Struts 
Action
 类扩展Action。

这种技术很简单并且易于理解。不幸的是,它将 Struts Action与 Spring 框架耦合在一起。如果您想替换掉
Spring,那么您必须重写代码。并且,由于 Struts Action不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。

2.覆盖RequestProcessor

Spring 从 Struts
Action中分离是一个更巧妙的设计选择。分离的一种方法是使用
org.springframework.web.struts.DelegatingRequestProcessor
 类来覆盖 Struts 的 
RequestProcessor
 处理程序。

DelegatingRequestProcessor
 方法的确比第一种方法好,但是仍然存在一些问题。如果您使用一个不同的
RequestProcessor
,则需要手动整合
Spring 的 
DelegatingRequestProcessor
。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外,还有过一些使用一系列命令来代替 Struts 
RequestProcessor
 的传闻。
这种改变将会对这种解决方法的使用寿命造成负面的影响。

3.将Action管理委托给Spring
一个更好的解决方法是将
Strut
Action管理委托给 Spring。您可以通过在 
struts-config
 Action映射中注册一个代理来实现。代理负责在 Spring 环境中查找 StrutsAction。由于Action在
Spring 的控制之下,所以它可以填充Action的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。

Action委托解决方法是这三种方法中最好的。StrutsAction不了解
Spring,不对代码作任何改变就可用于非 Spring 应用程序中。
RequestProcessor
 的改变不会影响它,并且它可以利用 Spring AOP 特性的优点。

Action委托的优点不止如此。一旦让 Spring 控制您的 StrutsAction,您就可以使用
Spring 给Action补充更强的活力。例如,没有 Spring 的话,所有的 StrutsAction都必须是线程安全的。如果您设置 
<bean>
 标记的
singleton 属性为“false”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的Action对象。您可能不需要这种特性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如,当实例化 StrutsAction时,
<bean>
 标记的
init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。

Action委托也有两种做法:

(1) 把Action配置在beans.xml里,利用Spring初始化Action的bean

注意:此时strut.xml中配置的action的class值,应该与spring中配置的Action
Bean id相应。

 (2) 不需要在beans.xml里配置Action,利用Struts-Spring_Plugin插件自动初始化Action

如果action不是使用Spring
ObjectFactory创建的话,插件提供了两个拦截器来自动装配action,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring中寻找与action属性名字相同的bean,可选的装配策略还有:type、auto、constructor,我们可以通过常量struts.objectFactory.spring.autoWire来进行设置。

Spring插件具体有如下几个作用:

— 允许Spring创建Action、Interceptror和Result。

— 由Struts创建的对象能够被Spring装配。

— 如果没有使用Spring ObjectFactory,提供了2个拦截器来自动装配action。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: