技术开发 频道

使用Spring更好地处理Struts动作

    几个小窍门
  

    接下来的每种整合技术(或者窍门)都有自己的优点和特点。我偏爱其中的一种,但是我知道这三种都能够加深您对 Struts 和 Spring 的理解。在处理各种不同情况的时候,这将给您提供一个广阔的选择范围。方法如下:
  
    使用 Spring 的 ActionSupport 类整合 Structs
  
    使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor
  
    将 Struts Action 管理委托给 Spring 框架
  
    装载应用程序环境
  
    无论您使用哪种技术,都需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境。就像添加任何其他插件一样,简单地向您的 struts-config.xml 文件添加该插件,如下所示: 

<plug-in className= "org.springframework.web.struts.ContextLoaderPlugIn">

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

</plug-in>

     每个例子都为一个书籍搜索应用程序提供一种不同的 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 进行整合

<?xml version="1.0" encoding="ISO-8859-1" ?>
  
  <!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
  "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
  
  <struts-config>
  <form-beans>
  <form-bean name="searchForm"
  type="org.apache.struts.validator.DynaValidatorForm">
  <form-property name="isbn"  type="java.lang.String"/>
  </form-bean>

 

0
相关文章