本文想通过一个简单的实例阐述如何集成Spring和Struts
Struts和Spring
Struts 代表了MVC第二类架构的实现在Struts中最重要的组件是ActionServletAction和 ActionForm 子类ActionServlet 代表controller他基于配置文件接受请求和 把这些请求转发到相应的ActionForm和Action子类 ActionForm把用户输入的数据传送到ActionAction调用商务层组件完成必要的操作最后提交到viewActionServlet使用一个配置文件(strutsconfigxml)加载Action子类的定义用以接受用户请求基于请求URL controller 找到一个action定义去接受这个请求Struts构件处理用户请求 检查配置文件 完成相应的动作
Spring是一种轻量级的容器它使得使用一个外部XML配置文件非常容易绑定对象每个对象能够通过列出JavaBean属性得到一个依赖 对象的指针通过绑定XML配置文件使剩下的工作更加简单依赖注入(DI)是非常强大的功能Spring支持可插拔的事务管理器提供事物管理方式更 多的选择 它集成了持久性的架构同时也提供了一个统一的exception 分类Spring也提供面向方面(AOP)编程的简单机制
Struts和Spring的集成
将Struts应用集成到Spring框架可以采用多种方法首先Spring明显地被设计用于解决JEE的现实问题如复杂性性能低下可测试性及其他第二Spring框架包括一个AOP实现让你可以使用面向方面的程序设计技术;第三 Spring 框架可以能够非常容易地管理和协调Struts;和Struts类似Spring也包含MVC 实现两个架构都有优缺点Struts是MVC最重要的架构很多开发团队学会了依靠Struts在规定时限内开发出高质量的软件因此开发团队宁愿 集成Spring的功能也不愿意转到Spring MVC;好消息是Spring的结构允许你集成Struts Web 框架基于Spring的业务层和持久层我们的方法是应用Spring中的ActionSupport类去集成Struts
加载应用的context
首先我们需要使用Spring中的ContextLoaderPlugin为Struts ActionServlet去装载Spring应用的上下文简单在strutsconfigxml 文件中增加plugin如下()所示
﹤ ?xml version= encoding=ISO ?﹥
﹤ !DOCTYPE strutsconfig PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
config__dtd﹥
﹤ strutsconfig﹥
﹤ formbeans﹥
﹤ formbean name=searchForm
type=orgapachestrutsvalidatorDynaValidatorForm﹥
﹤ formproperty name=cardno type=javalangString/﹥
﹤ /formbean﹥
﹤ /formbeans﹥
﹤ globalforwards type=orgapachestrutsactionActionForward﹥
﹤ forward name=welcome path=/welcomedo/﹥
﹤ forward name=searchEntry path=/searchEntrydo/﹥
﹤ forward name=searchSubmit path=/searchSubmitdo/﹥
﹤ /globalforwards﹥
﹤ actionmappings﹥
﹤ action path=/welcome forward=/WEBINF/pages//﹥
﹤ action path=/searchEntry forward=/WEBINF/pages/searchjsp/﹥
﹤ action path=/searchSubmit
type= tekCreditcardactionsSearchSubmit
input=/searchEntrydo
validate=true
name=searchForm﹥
﹤ forward name=success path=/WEBINF/pages/detailjsp/﹥
﹤ forward name=failure path=/WEBINF/pages/searchjsp/﹥
﹤ /action﹥
﹤ /actionmappings﹥
﹤ messageresources parameter=ApplicationResources/﹥
﹤ plugin className=orgapachestrutsvalidatorValidatorPlugIn﹥
﹤ setproperty property=pathnames value=/WEBINF/validatorrulesxml/WEBINF/validationxml/﹥
﹤ /plugin﹥
﹤ plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn﹥ ()
﹤ setproperty property=contextConfigLocation value=/WEBINF/beansxml/﹥
﹤ /plugin﹥
﹤ /strutsconfig﹥
使用Spring的ActionSupport类
要用Spring去集成Struts创建一个Spring 上下文是必须要做的 orgspringframeworkwebstrutsActionSupport 类提供一个 getWebApplicationContext() 方法非常容易地获得Spring上下文全部你需要去做的是从Spring的ActionSupport 代替Struts 中的Action类去延伸你的action如下所示
package tekCreditcardactions;
import javaioIOException;
import javaxservletServletException;
import javaxservlethttpHttpServletRequest;
import javaxservlethttpHttpServletResponse;
import orgapachestrutsactionActionError;
import orgapachestrutsactionActionErrors;
import orgapachestrutsactionActionForm;
import orgapachestrutsactionActionForward;
import orgapachestrutsactionActionMapping;
import orgapachestrutsactionDynaActionForm;
import orgntextApplicationContext;
import orgspringframeworkwebstrutsActionSupport;
import com infotekCreditcardbeansCreditcard;
import com infotekCreditcardbusinessCreditcardService;
public class SearchSubmit extends ActionSupport { |()
public ActionForward execute(ActionMapping mappingActionForm form
HttpServletRequest requestHttpServletResponse response)
throws IOException ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchFormget(cardno);
//the old fashion way
//CreditcardService creditcardService = new CreditcardServiceImpl();
ApplicationContext ctx = getWebApplicationContext(); |()
CreditcardService creditcardService =
(CreditcardService ) ctxgetBean(creditcardService); |()
CreditCard creditard = CreditCardServiceread(cardnotrim());
if (null == creditard) {
ActionErrors errors = new ActionErrors();
errorsadd(ActionErrorsGLOBAL_ERRORnew ActionError (messagenotfound));
saveErrors(request errors);
return mappingfindForward(failure) ;
}
requestsetAttribute(creditcard creditcard);
return mappingfindForward(success);
}
在()中我们通过延伸Spring ActionSupport 类而不是Struts Action 类创建了一个action;在()中我们使用getWebApplicationContext()方法获得一个 ApplicationContext;为了获得商务服务 在()中我们使用ApplicationContext去查找Spring bean;这个技术非常容易理解不幸的是它把Struts的action和Spring framework绑定了如果你想替换Spring你不得不重写代码而且Struts的action不在Spring的控制之下 遗憾的是这种方法无法获得Spring AOP的好处
结论
本文我们尝试使用Spring的ActionSupportContextLoaderPlugIn去集成Struts这是一种最高效的和最简单的方式另外还可用Spring中的代理子类去代理Struts中的RequestProcessor和代理Struts的actions