java

位置:IT落伍者 >> java >> 浏览文章

如何有效的集成Spring和Struts


发布日期:2020年12月31日
 
如何有效的集成Spring和Struts

本文想通过一个简单的实例阐述如何集成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

上一篇:在eclipse中使用jetty

下一篇:美国高级工程师谈Struts 2走向