使用 Spring 更好地处理 Struts 动作.docx
- 文档编号:23873463
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:18
- 大小:25.53KB
使用 Spring 更好地处理 Struts 动作.docx
《使用 Spring 更好地处理 Struts 动作.docx》由会员分享,可在线阅读,更多相关《使用 Spring 更好地处理 Struts 动作.docx(18页珍藏版)》请在冰豆网上搜索。
使用Spring更好地处理Struts动作
2005年11月03日
StrutsRecipes的合著者GeorgeFranciscus将介绍另一个重大的Struts整合窍门——这次是将Struts应用程序导入Spring框架。
请跟随George,他将向您展示如何改变Struts动作,使得管理Struts动作就像管理Springbeans那样。
结果是一个增强的web框架,这个框架可以方便地利用SpringAOP的优势。
您肯定已经听说过控制反转(IOC)设计模式,因为很长一段时间以来一直在流传关于它的信息。
如果您在任何功能中使用过Spring框架,那么您就知道其原理的作用。
在本文中,我利用这一原理把一个Struts应用程序注入Spring框架,您将亲身体会到IOC模式的强大。
将一个Struts应用程序整合进Spring框架具有多方面的优点。
首先,Spring是为解决一些关于JEE的真实世界问题而设计的,比如复杂性、低性能和可测试性,等等。
第二,Spring框架包含一个AOP实现,允许您将面向方面技术应用于面向对象的代码。
第三,一些人可能会说Spring框架只有处理Struts比Struts处理自己好。
但是这是观点问题,我演示三种将Struts应用程序整合到Spring框架的方法后,具体由您自己决定使用哪一种。
我所演示的方法都是执行起来相对简单的,但是它们却具有明显不同的优点。
我为每一种方法创建了一个独立而可用的例子,这样您就可以完全理解每种方法。
请参阅下载部分获得完整例子源代码。
请参阅参考资料,下载StrutsMVC和Spring框架。
为什么Spring这么了不起?
Spring的创立者RodJohnson以一种批判的眼光看待Java™企业软件开发,并且提议很多企业难题都能够通过战略地使用IOC模式(也称作依赖注入)来解决。
当Rod和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了Spring框架。
简言之,Spring是一个轻型的容器,利用它可以使用一个外部XML配置文件方便地将对象连接在一起。
每个对象都可以通过显示一个JavaBean属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个XML配置文件中把它们连接好。
IOC和Spring
IOC是一种使应用程序逻辑外在化的设计模式,所以它是被注入而不是被写入客户机代码中。
将IOC与接口编程应用结合,就像Spring框架那样,产生了一种架构,这种架构能够减少客户机对特定实现逻辑的依赖。
请参阅参考资料了解更多关于IOC和Spring的信息。
依赖注入是一个强大的特性,但是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"/> 我利用了 下一步是在我的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 一个更好的解决方法是将Strut动作管理委托给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//E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Spring 更好地处理 Struts 动作 更好 处理