本文想通过一个简单的实例阐述如何集成Spring和Struts
Struts和Spring
Struts 代表了MVC第二类架构的实现在Struts中最重要的组件是ActionServlet Action和 ActionForm 子类ActionServlet 代表controller他基于配置文件接受请求和 把这些请求转发到相应的ActionForm和Action子类 ActionForm把用户输入的数据传送到Action Action调用商务层组件完成必要的操作最后提交到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