`
daha33
  • 浏览: 52466 次
社区版块
存档分类
最新评论

用Spring更好地处理Struts动作三种整合(二)---引用自http://www.bitscn.com

阅读更多
窍门 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>
  </form-beans>
 <global-forwards type="org.apache.struts.action.ActionForward">
     <forward   name="welcome"                path="/welcome.do"/>
     <forward   name="searchEntry"            path="/searchEntry.do"/>
     <forward   name="searchSubmit"           path="/searchSubmit.do"/>
 </global-forwards>
 <action-mappings>
    <action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
    <action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
    <action    path="/searchSubmit" 
               type="ca.nexcel.books.actions.SearchSubmit"
               input="/searchEntry.do"
               validate="true"
               name="searchForm">
              <forward name="success" path="/WEB-INF/pages/detail.jsp"/>
              <forward name="failure" path="/WEB-INF/pages/search.jsp"/>
    </action>  
 </action-mappings>
 <message-resources parameter="ApplicationResources"/>
 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> |(1)
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" 
      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>
 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/>
 </plug-in>
</struts-config>

     
     我利用了 <controller> 标记来用 DelegatingRequestProcessor 覆盖默认的 Struts RequestProcessor。下一步是在我的 Spring 配置文件中注册该动作,如清单 3 所示:

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
  <bean name="/searchSubmit" 
    class="ca.nexcel.books.actions.SearchSubmit"> //(1)
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
  </bean>
</beans>

     
    注意:在 (1) 处,我使用名称属性注册了一个 bean,以匹配 struts-config 动作映射名称。SearchSubmit 动作揭示了一个 JavaBean 属性,允许 Spring 在运行时填充属性,如清单 4 所示:

清单 4. 具有 JavaBean 属性的 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.Action;
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 ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;
public class SearchSubmit extends Action {
 
  private BookService bookService;
  public BookService getBookService() {
    return bookService;
  }
  public void setBookService(BookService bookService) { //(1)
    this.bookService = bookService; 
  } 
  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {
    DynaActionForm searchForm = (DynaActionForm) form;
    String isbn = (String) searchForm.get("isbn");
  
  Book book = getBookService().read(isbn.trim());  //(2)
    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");
  }
}


    在清单 4 中,您可以了解到如何创建 Struts 动作。在 (1) 处,我创建了一个 JavaBean 属性。DelegatingRequestProcessor自动地配置这种属性。这种设计使 Struts 动作并不知道它正被 Spring 管理,并且使您能够利用 Sping 的动作管理框架的所有优点。由于您的 Struts 动作注意不到 Spring 的存在,所以您不需要重写您的 Struts 代码就可以使用其他控制反转容器来替换掉 Spring。

  DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。如果您使用一个不同的 RequestProcessor,则需要手动整合 Spring 的 DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。

分享到:
评论

相关推荐

    可自主定义工具的辅助菜单

    web="C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://www.bitscn.com/ exe= 本程序由Strong编制,技术支持QQ:86055325;本程序仅供自用不含版权问题. 本程序使用方法:name项为按钮名;Web项为所要打开的...

    vncviewer远程控制

    远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息

    利用百度谷歌关键字批量检测网站

    网站检测系列教程第三课:利用百度谷歌关键字批量检测网站 关键字:inurl:asp?articleid= ----------------------------------- 关键字:网站建设公司企业网站管理系统 后缀: admin/login.asp -------------------...

    aptools-win32

    无线网络工具ApTools 文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html

    linux集群理论基础

    Linux集群是一种将多台计算机通过高速网络连接,协同工作,对外提供单一系统映像和高可用性服务的技术。集群系统可以提升系统的性能、可靠性和可伸缩性,是大型企业和组织应对高流量、高并发场景的重要解决方案。在...

    Linux phpMyAdmin 安装攻略

    在Linux环境下安装phpMyAdmin可以帮助用户更方便地管理MySQL数据库。本文将详细介绍如何在Linux系统中安装并配置phpMyAdmin,以便用户能够轻松地对MySQL数据库进行管理。 #### 二、准备工作 1. **下载phpMyAdmin...

    win8.1系统运行GTA4出现R图标闪退的解决方法介绍.docx

    - **下载地址**:[http://.bitsCN.com/os/windows/289850.html](http://.bitsCN.com/os/windows/289850.html) 3. **设置显卡优先级** - **AMD显卡**: - 打开Catalyst Control Center,进入“电源”-&gt;“可切换...

    超级嗅探狗激活码【转自bbs.bitsCN.com】

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要涉及的是“超级嗅探狗”这一软件的激活码。为了确保内容的专业性和准确性,下面将详细介绍与该...希望以上介绍能够帮助您更好地理解和使用该软件。

    mysql乱码处理

    具体步骤可以参考链接:[使用提示](http://www.bitscn.com/pdb/php/200701/95558.html)。 #### 六、总结与扩展 通过以上六个步骤,我们可以有效地解决PHP环境下MySQL的UTF-8乱码问题。除了上述方法之外,还可以...

    Cantennator

    This time we bring you the best software to hack the WiFi networks 2010. El compilado incluye potente software en detecci&#243;...文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html

    Everything-1.2.1.371

    1. Everything简介 Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name instantly)”。它体积小巧,界面简洁易用,...【转自bbs.bitsCN.com】

    oracle 性能调整 sql性能优化大全

    了解并掌握这些知识点,可以有效地提升Oracle数据库的性能,减少资源消耗,为用户提供更快速、更稳定的数据库服务。在实际工作中,结合监控工具、性能分析报告和数据库设计,对SQL进行持续优化是至关重要的。

    OicqHack--

    CK 1.2 B时间:2001-12-02 06:14来源:中国网管联盟作者:bitsCN编辑字体:[大 中 小]电脑诊所出品 正式版 1.2 B 使用帮助: From: [10001] To:[10009] 此栏为扫描的 OICQ 号码范围,选中 [V] Scan Mode 即可开启...

    informix学习资料

    - 厦门人家v2008.files" — 这个文件夹可能包含与上述文章相关的附件或补充材料,如截图、配置文件样本等,帮助读者更好地理解和实践Informix的初始化过程。 4. "INFORMIX5的安装及初始配置 配置 初始 安装 系统 ...

    emf eclipse

    EMF(Eclipse Modeling Framework)是基于OMG的MOF(Meta-Object Facility)标准,为开发人员提供了一种在Eclipse环境中构建和使用模型驱动工程(MDE)工具的方法。 【描述】虽然描述为空,但通过提供的博文链接...

    AD域的建立与图解

    实验目的:搭建一个域控制器并将客户机加入域 ...用交叉线连起来,并如图分配好ip地址  实验步骤: BBS.bitsCN.com国内最早的网管论坛  1. 配置Server  (1)配置ip地址参数 bitscn.com中国网管

    shell脚本的编写

    在IT领域,Shell脚本是Linux和Unix系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。以下是对"shell脚本的编写"这个主题的详细解释。 首先,让我们理解什么是Shell。...

    滚动字幕制作手册

    压缩包中的"滚动字幕制作手册_HTML+DIV+CSS_中国网管联盟bitsCN_com.mht"文件很可能包含了更详细的教程,包括实际的代码示例、步骤指南以及可能遇到的问题与解决方案。这份资源对于希望提升网页动态效果的开发者来说...

    shell脚本编写和源码

    在IT行业中,Shell脚本是Linux和Unix系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。这个压缩包文件包含了关于shell脚本编写和源码的相关资料,非常适合初学者和有...

    制作网络拓扑图的好工具Fpinger

    一款适合日常管理的网管软件,能实现基本的监视、定位、检测、追踪等功能。这款软件的最大特点就是可以让我们制作出自己的电子拓扑图,以后,无论是日常管理还是故障定位,只要在电子拓扑图中...【转自bbs.bitsCN.com】

Global site tag (gtag.js) - Google Analytics