一、引言
Struts框架是Apache基金会Jakarta项目组的一个Open Source(开放源代码)项目,该框架由一组相互协作的类(组件)、Servlet以及标签库组成,是对传统 MVC设计模式的一种实现和标准化,充分体现了MVC模式“分离显示逻辑和业务逻辑”的设计思想,是目前Java Web开放中广泛采用的技术。
Spring是由Rod Johnson创建的一个开源框架,目的是为了解决Java Web企业应用开发的复杂性。Spring提供了IoC(控制反转)、AOP(面向切面编程)、声明式事务等功能,提高了Java Web应用开发的效率和质量。更重要的是,Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate等)的直接支持。
虽然Spring本身可以作为一个MVC实现,但由于Struts在MVC方面的影响力,使得开发人员者更愿意将Struts整合到Spring中,而不是使用Spring MVC代替Struts。本文总结归纳了整合Struts和Spring的三种方法,并讨论了各自的优缺点。
二、整合Struts和Spring
1.使用ActionSupport类
(1)原理
当客户端发送http请求到控制器时,使用请求参数填充FormBean,并根据struts-config.xml的配置将请求转发给对应的Action,Action通过调用父类的getWebApplicationContext()方法获取ApplicationContext对象,在通过ApplicationContext对象从Spring容器中获取相关的JavaBean,通过Action处理后将处理结果会发给控制器,控制其根据struts-config.xml的配置将处理结果传回到客户端。
(2)用法
①在struts-config.xml中配置插件,代码如下:
②创建Action类,继承自ActionSupport或DispatchActionSupport;
③在Action中通过调用getWebApplicationContext()方法获取ApplicationContext对象,然后调用ApplicationContext对象的getBean()方法从Spring容器中取出相应的对象。
(3)评价
这种技术很简单并且易于理解。但是,它将Struts动作与Spring框架耦合在一起。如果想替换掉Spring,那么就必须重写代码。同时,由于Struts动作不在Spring的控制之下,所以它不能获得SpringAOP的优势。当使用多重独立的Spring环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。
2.使用DelegatingRequestProcessor类
(1)原理
客户端发送http请求到控制器ActionServlet,控制器将使用请求参数填充FormBean并根据Struts-config.xml的配置将请求转发给DelegatingResquestProcessor,DelegatingResquestProcessor根据Spring配置文件从web容器中提取ActionBean并调用相关的JavaBean,由ActionBean对请求进行处理,处理完毕后在转发给控制器,控制器再根据struts-config.xml的配置把将处理结果发挥给客户端。
(2)用法
①在struts-config.xml中配置插件,代码如下:
value="classpath:applicationContext.xml"/>
②在struts-config.xml中增加如下节点:
DelegatingRequestProcessor"/>
③创建Action,并在Spring配置文件ApplicationContext.xml中对其进行注册。
(3)评价
这种方法使Struts动作并不知道它正被Spring管理,并且使我们能够利用Spring的动作管理框架的所有优点。由于Struts动作注意不到Spring的存在,所以我们不需要重写我们的Struts代码就可以使用其他控制反转容器来替换掉Spring。看来这种方法的确比第一种方法好,但还是存在着一些问题。如果我们使用一个不同的RequestProcessor,则需要手动整合Spring的DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低的应用程序的灵活性。
3.将StrutsAction管理委托给Spring框架
(1)原理
客户端发送http请求到控制器ActionServlet,控制器将使用请求参数填充FormBean,并根据Struts-config.xml的配置将请求转发给DelegatingActionProxy,DelegatingActionProxy根据请求信息从Spring容器中获取相应的Action并由Spring为其注入相关的JavaBean,请求经Action处理完毕后在转发给DelegatingActionProxy,DelegatingActionProxy在转发处理结果给控制器,控制器根据struts-config.xml的配置把将处理结果发挥给客户端。
(2)用法
①在Struts-config.xml中配置插件,代码如下:
value=classpath:applicationContext.xml/>
②创建Action并将struts-config.xml中的Action节点的type更改为org.springframework.web.struts.DelegatingActionProxy;
③在Spring配置文件中注册ActionBean。
(3)评价
动作委托方法是这3种方法中最好的。Struts动作不了解Spring,不对代码作任何改变就可用于非Spring应用程序中。RequestProcessor的改变不会影响它,并且它可以利用SpringAOP特性的优点。
三、结束语
在本文中,主要讨论了Struts动作整合到Spring框架中的3种方法。第1种方法简单而快捷,但是会将Struts动作与Spring框架耦合在一起,当改变框架时需要重写代码。第2种方法通过委托RequestProcessor巧妙地解开代码的耦合,但是它的可扩展性不强。第3种方法是最好的,将Struts动作委托给Spring框架可以使代码解耦,从而使可以在的Struts应用程序中利用Spring的特性。