Username: Password:

使用Spring更好地处理Struts动作
来源:linux宝库作者:linux宝库 发布时间:2007-09-30 00:00:00


  您肯定已听说过控制反转 (IOC) 设计模式,因为很长一段时间以来一直在流传关于他的信息。假如您在任何功能中使用过 Spring 框架,那么您就知道其原理的作用。在本文中,我利用这一原理把一个 Struts 应用程式注入 Spring 框架,您将亲身体会到 IOC 模式的强大。

  将一个 Struts 应用程式整合进 Spring 框架具备多方面的长处。首先,Spring 是为解决一些关于 JEE 的真实世界问题而设计的,比如复杂性、低性能和可测试性,等等。第二,Spring 框架包含一个 AOP 实现,允许您将面向方面技术应用于面向对象的代码。第三,一些人可能会说 Spring 框架只有处理 Struts 比 Struts 处理自己好。但是这是观点问题,我演示三种将 Struts 应用程式整合到 Spring 框架的方法后,具体由您自己决定使用哪一种。

  我所演示的方法都是执行起来相对简单的,但是他们却具备明显不同的长处。我为每一种方法创建了一个单独而可用的例子,这样您就能够完全理解每种方法。请参阅 下载 部分获得完整例子源代码。请参阅 参考资料,下载 Struts MVC 和 Spring 框架。

  为什么 Spring 这么了不起?

  Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java? 企业软件研发,并且提议很多企业难题都能够通过战略地使用 IOC 模式(也称作依赖注入)来解决。当 Rod 和一个具备奉献精神的开放源码研发者团队将这个理论应用于实践时,结果就产生了 Spring 框架。简言之,Spring 是个轻型的容器,利用他能够使用一个外部 XML 配置文档方便地将对象连接在一起。每个对象都能够通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文档中把他们连接好。

  IOC 和 Spring

  IOC 是一种使应用程式逻辑外在化的设计模式,所以他是被注入而不是被写入客户机代码中。将 IOC 和接口编程应用结合,就像 Spring 框架那样,产生了一种架构,这种架构能够减少客户机对特定实现逻辑的依赖。请参阅 参考资料 了解更多关于 IOC 和 Spring 的信息。

  依赖注入是个强大的特性,但是 Spring 框架能够提供更多特性。Spring 支持可插拔的事务管理器,能够给您的事务处理提供更广泛的选择范围。他整合了领先的持久性框架,并且提供一个一致的异常层次结构。Spring 还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。

  Spring AOP 允许您使用拦截器 在一个或多个执行点上拦截应用程式逻辑。加强应用程式在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础,所以拦截器广泛用于日志记录。您很快就会看到,为了处理横切关注点,Spring AOP 发布了他自己的拦截器,您也能够编写您自己的拦截器。

  整合 Struts 和 Spring

  和 Struts 相似,Spring 能够作为一个 MVC 实现。这两种框架都具备自己的长处和缺点,尽管大部分人同意 Struts 在 MVC 方面仍然是最好的。很多研发团队已学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。Struts 具备如此大的推动力,以至于研发团队宁愿整合 Spring 框架的特性,而不愿意转换成 Spring MVC。没必要进行转换对您来说是个好消息。Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持久层。最后的结果就是现在一切条件都具备了。

  在接下来的小窍门中,您将会了解到三种将 Struts MVC 整合到 Spring 框架的方法。我将揭示每种方法的缺陷并且对比他们的长处。 一旦您了解到任何三种方法的作用,我将会向您展示一个令人兴奋的应用程式,这个程式使用的是这三种方法中我最喜欢的一种。

  三个小窍门

  接下来的每种整合技术(或窍门)都有自己的长处和特点。我偏爱其中的一种,但是我知道这三种都能够加深您对 Struts 和 Spring 的理解。在处理各种不同情况的时候,这将给您提供一个广阔的选择范围。方法如下:

  使用 Spring 的 ActionSupport 类整合 Structs

  使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor

  将 Struts Action 管理委托给 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 而不是 Struts Action 类扩展您的动作,如清单 1 所示:

  清单 1. 使用 ActionSupport 整合 Struts

  package ca.nexcel.books.actions;

  import java.io.IOException;

  import javax.servlet.ServletException;

  import javax.servlet.http.HttpServletRequest;

  import javax.servlet.http.HttpServletResponse;

  import org.apache.struts.action.ActionError;

  import org.apache.struts.action.ActionErrors;

  import org.apache.struts.action.ActionForm;

  import org.apache.struts.action.ActionForward;

  import org.apache.struts.action.ActionMapping;

  import org.apache.struts.action.DynaActionForm;

  import org.springframework.context.ApplicationContext;

  import org.springframework.web.struts.ActionSupport;

  import ca.nexcel.books.beans.Book;

  import ca.nexcel.books.business.BookService;

  public class SearchSubmit extends ActionSupport {

  |(1)

  public ActionForward execute(

  ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response)

  throws IOException, ServletException {

  DynaActionForm searchForm = (DynaActionForm) form;

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

  //the old fashion way

  //BookService bookService = new BookServiceImpl();

  ApplicationContext ctx =

  getWebApplicationContext();

  |(2)

  BookService bookService =

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

  |(3)

  Book book = bookService.read(isbn.trim());

  if (null == book) {

  ActionErrors errors = new ActionErrors();

  errors.add(ActionErrors.GLOBAL_ERROR,new ActionError

  ("message.notfound"));

  saveErrors(request, errors);

  return mapping.findForward("failure") ;

  }

  request.setAttribute("book", book);

  return mapping.findForward("success");

  }

  }

  让我们快速思考一下这里到底发生了什么。在 (1) 处,我通过从 Spring 的 ActionSupport 类而不是 Struts 的 Action 类进行扩展,创建了一个新的 Action。在 (2) 处,我使用 getWebApplicationContext() 方法获得一个 ApplicationContext。为了获得业务服务,我使用在 (2) 处获得的环境在 (3) 处查找一个 Spring bean。

  这种技术很简单并且易于理解。不幸的是,他将 Struts 动作和 Spring 框架耦合在一起。假如您想替换掉 Spring,那么您必须重写代码。并且,由于 Struts 动作不在 Spring 的控制之下,所以他不能获得 Spring AOP 的优势。当使用多重单独的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。

  窍门 2. 覆盖 RequestProcessor

  将 Spring 从 Struts 动作中分离是个更巧妙的设计选择。分离的一种方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程式,如清单 2 所示:

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

  

  
  "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

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

  

  

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

  
  type="java.lang.String"/>

  

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅