Spring结合Struts开发.docx

上传人:b****1 文档编号:13224082 上传时间:2023-06-12 格式:DOCX 页数:15 大小:22.65KB
下载 相关 举报
Spring结合Struts开发.docx_第1页
第1页 / 共15页
Spring结合Struts开发.docx_第2页
第2页 / 共15页
Spring结合Struts开发.docx_第3页
第3页 / 共15页
Spring结合Struts开发.docx_第4页
第4页 / 共15页
Spring结合Struts开发.docx_第5页
第5页 / 共15页
Spring结合Struts开发.docx_第6页
第6页 / 共15页
Spring结合Struts开发.docx_第7页
第7页 / 共15页
Spring结合Struts开发.docx_第8页
第8页 / 共15页
Spring结合Struts开发.docx_第9页
第9页 / 共15页
Spring结合Struts开发.docx_第10页
第10页 / 共15页
Spring结合Struts开发.docx_第11页
第11页 / 共15页
Spring结合Struts开发.docx_第12页
第12页 / 共15页
Spring结合Struts开发.docx_第13页
第13页 / 共15页
Spring结合Struts开发.docx_第14页
第14页 / 共15页
Spring结合Struts开发.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Spring结合Struts开发.docx

《Spring结合Struts开发.docx》由会员分享,可在线阅读,更多相关《Spring结合Struts开发.docx(15页珍藏版)》请在冰点文库上搜索。

Spring结合Struts开发.docx

Spring结合Struts开发

Spring整合Struts开发JavaEE应用程序

学术部张亚涛

同学们是否听说过控制反转(IOC)设计模式,很长一段时间以来一直在流传关于它的信息。

如果你在任何功能中使用过Spring框架,那么你就知道其原理的作用。

在本文中,我利用这一原理把一个Struts应用程序注入Spring框架,你将亲身体会到IOC模式的强大。

将一个Struts应用程序整合进Spring框架具有多方面的优点。

首先,Spring是为解决一些关于JEE的真实世界问题而设计的,比如复杂性、低性能和可测试性,等等。

第二,Spring框架包含一个AOP实现,允许你将面向方面技术应用于面向对象的代码。

第三,一些人可能会说Spring框架只有处理Struts比Struts处理自己好。

但是这是观点问题,我演示三种将Struts应用程序整合到Spring框架的方法后,具体由你自己决定使用哪一种。

为什么Spring这么了不起?

Spring的创立者RodJohnson以一种批判的眼光看待Java™企业软件开发,并且提议很多企业难题都能够通过战略地使用IOC模式(也称作依赖注入)来解决。

当Rod和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了Spring框架。

简言之,Spring是一个轻型的容器,利用它可以使用一个外部XML配置文件方便地将对象连接在一起。

每个对象都可以通过显示一个JavaBean属性收到一个到依赖对象的引用,留给你的简单任务就只是在一个XML配置文件中把它们连接好。

依赖注入是一个强大的特性,但是Spring框架能够提供更多特性。

Spring支持可插拔的事务管理器,可以给你的事务处理提供更广泛的选择范围。

它集成了领先的持久性框架,并且提供一个一致的异常层次结构。

Spring还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。

SpringAOP允许你使用拦截器在一个或多个执行点上拦截应用程序逻辑。

加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础,所以拦截器广泛用于日志记录。

你很快就会看到,为了处理横切关注点,SpringAOP发布了它自己的拦截器,你也可以编写你自己的拦截器。

整合Struts和Spring

与Struts相似,Spring可以作为一个MVC实现。

这两种框架都具有自己的优点和缺点,尽管大部分人同意Struts在MVC方面仍然是最好的。

很多开发团队已经学会在时间紧迫的时候利用Struts作为构造高品质软件的基础。

Struts具有如此大的推动力,以至于开发团队宁愿整合Spring框架的特性,而不愿意转换成SpringMVC。

没必要进行转换对你来说是一个好消息。

Spring架构允许你将Struts作为Web框架连接到基于Spring的业务和持久层。

最后的结果就是现在一切条件都具备了。

在接下来的小窍门中,你将会了解到三种将StrutsMVC整合到Spring框架的方法。

我将揭示每种方法的缺陷并且对比它们的优点。

一旦你了解到所有三种方法的作用,我将会向你展示一个令人兴奋的应用程序,这个程序使用的是这三种方法中我最喜欢的一种。

三个小窍门

接下来的每种整合技术(或者窍门)都有自己的优点和特点。

我偏爱其中的一种,但是我知道这三种都能够加深你对Struts和Spring的理解。

在处理各种不同情况的时候,这将给你提供一个广阔的选择范围。

方法如下:

∙使用Spring的ActionSupport类整合Structs

∙使用Spring的DelegatingRequestProcessor覆盖Struts的RequestProcessor

∙将StrutsAction管理委托给Spring框架

装载应用程序环境

无论你使用哪种技术,都需要使用Spring的ContextLoaderPlugin为Struts的ActionServlet装载Spring应用程序环境。

就像添加任何其他插件一样,简单地向你的struts-config.xml文件添加该插件,如下所示:

"org.springframework.web.struts.ContextLoaderPlugIn">

"contextConfigLocation"value="/WEB-INF/beans.xml"/>

前面已经提到过,在下载部分,你能够找到这三个完全可使用的例子的完整源代码。

每个例子都为一个书籍搜索应用程序提供一种不同的Struts和Spring的整合方法。

你可以在这里看到例子的要点,但是你也可以下载应用程序以查看所有的细节。

窍门1.使用Spring的ActionSupport

手动创建一个Spring环境是一种整合Struts和Spring的最直观的方式。

为了使它变得更简单,Spring提供了一些帮助。

为了方便地获得Spring环境,org.springframework.web.struts.ActionSupport类提供了一个getWebApplicationContext()方法。

你所做的只是从Spring的ActionSupport而不是StrutsAction类扩展你的动作,如清单1所示:

清单1.使用ActionSupport整合Struts

packageca.nexcel.books.actions;

importjava.io.IOException;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.struts.action.ActionError;

importorg.apache.struts.action.ActionErrors;

importorg.apache.struts.action.ActionForm;

importorg.apache.struts.action.ActionForward;

importorg.apache.struts.action.ActionMapping;

importorg.apache.struts.action.DynaActionForm;

importorg.springframework.context.ApplicationContext;

importorg.springframework.web.struts.ActionSupport;

importca.nexcel.books.beans.Book;

importca.nexcel.books.business.BookService;

publicclassSearchSubmitextendsActionSupport{|

(1)

publicActionForwardexecute(

ActionMappingmapping,

ActionFormform,

HttpServletRequestrequest,

HttpServletResponseresponse)

throwsIOException,ServletException{

DynaActionFormsearchForm=(DynaActionForm)form;

Stringisbn=(String)searchForm.get("isbn");

//theoldfashionway

//BookServicebookService=newBookServiceImpl();

ApplicationContextctx=

getWebApplicationContext();|

(2)

BookServicebookService=

(BookService)ctx.getBean("bookService");|(3)

Bookbook=bookService.read(isbn.trim());

if(null==book){

ActionErrorserrors=newActionErrors();

errors.add(ActionErrors.GLOBAL_ERROR,newActionError

("message.notfound"));

saveErrors(request,errors);

returnmapping.findForward("failure");

}

request.setAttribute("book",book);

returnmapping.findForward("success");

}

}

让我们快速思考一下这里到底发生了什么。

(1)处,我通过从Spring的ActionSupport类而不是Struts的Action类进行扩展,创建了一个新的Action。

(2)处,我使用getWebApplicationContext()方法获得一个ApplicationContext。

为了获得业务服务,我使用在

(2)处获得的环境在(3)处查找一个Springbean。

这种技术很简单并且易于理解。

不幸的是,它将Struts动作与Spring框架耦合在一起。

如果你想替换掉Spring,那么你必须重写代码。

并且,由于Struts动作不在Spring的控制之下,所以它不能获得SpringAOP的优势。

当使用多重独立的Spring环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。

窍门2.覆盖RequestProcessor

将Spring从Struts动作中分离是一个更巧妙的设计选择。

分离的一种方法是使用org.springframework.web.struts.DelegatingRequestProcessor类来覆盖Struts的RequestProcessor处理程序,如清单2所示:

清单2.通过Spring的DelegatingRequestProcessor进行整合

xmlversion="1.0"encoding="ISO-8859-1"?

>

DOCTYPEstruts-configPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN"

"http:

//jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

type="org.apache.struts.validator.DynaValidatorForm">

type="ca.nexcel.books.actions.SearchSubmit"

input="/searchEntry.do"

validate="true"

name="searchForm">

DelegatingRequestProcessor"/>|

(1)

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>

我利用了标记来用DelegatingRequestProcessor覆盖默认的StrutsRequestProcessor。

下一步是在我的Spring配置文件中注册该动作,如清单3所示:

清单3.在Spring配置文件中注册一个动作

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN"

"http:

//www.springframework.org/dtd/spring-beans.dtd">

class="ca.nexcel.books.actions.SearchSubmit">|

(1)

注意:

(1)处,我使用名称属性注册了一个bean,以匹配struts-config动作映射名称。

SearchSubmit动作揭示了一个JavaBean属性,允许Spring在运行时填充属性,如清单4所示:

清单4.具有JavaBean属性的Struts动作

packageca.nexcel.books.actions;

importjava.io.IOException;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.struts.action.Action;

importorg.apache.struts.action.ActionError;

importorg.apache.struts.action.ActionErrors;

importorg.apache.struts.action.ActionForm;

importorg.apache.struts.action.ActionForward;

importorg.apache.struts.action.ActionMapping;

importorg.apache.struts.action.DynaActionForm;

importca.nexcel.books.beans.Book;

importca.nexcel.books.business.BookService;

publicclassSearchSubmitextendsAction{

privateBookServicebookService;

publicBookServicegetBookService(){

returnbookService;

}

publicvoidsetBookService(BookServicebookService){|

(1)

this.bookService=bookService;

}

publicActionForwardexecute(

ActionMappingmapping,

ActionFormform,

HttpServletRequestrequest,

HttpServletResponseresponse)

throwsIOException,ServletException{

DynaActionFormsearchForm=(DynaActionForm)form;

Stringisbn=(String)searchForm.get("isbn");

Bookbook=getBookService().read(isbn.trim());|

(2)

if(null==book){

ActionErrorserrors=newActionErrors();

errors.add(ActionErrors.GLOBAL_ERROR,newActionError("message.notfound"));

saveErrors(request,errors);

returnmapping.findForward("failure");

}

request.setAttribute("book",book);

returnmapping.findForward("success");

}

}

在清单4中,你可以了解到如何创建Struts动作。

(1)处,我创建了一个JavaBean属性。

DelegatingRequestProcessor自动地配置这种属性。

这种设计使Struts动作并不知道它正被Spring管理,并且使你能够利用Sping的动作管理框架的所有优点。

由于你的Struts动作注意不到Spring的存在,所以你不需要重写你的Struts代码就可以使用其他控制反转容器来替换掉Spring。

DelegatingRequestProcessor方法的确比第一种方法好,但是仍然存在一些问题。

如果你使用一个不同的RequestProcessor,则需要手动整合Spring的DelegatingRequestProcessor。

添加的代码会造成维护的麻烦并且将来会降低你的应用程序的灵活性。

此外,还有过一些使用一系列命令来代替StrutsRequestProcessor的传闻。

这种改变将会对这种解决方法的使用寿命造成负面的影响。

窍门3.将动作管理委托给Spring

一个更好的解决方法是将Struts动作管理委托给Spring。

你可以通过在struts-config动作映射中注册一个代理来实现。

代理负责在Spring环境中查找Struts动作。

由于动作在Spring的控制之下,所以它可以填充动作的JavaBean属性,并为应用诸如Spring的AOP拦截器之类的特性带来了可能。

清单5中的Action类与清单4中的相同。

但是struts-config有一些不同:

清单5.Spring整合的委托方法

xmlversion="1.0"encoding="ISO-8859-1"?

>

DOCTYPEstruts-configPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN"

"http:

//jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

type="org.apache.struts.validator.DynaValidatorForm">

展开阅读全文

相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2