使用 DelegatingActionProxy

使用 DelegatingRequestProcesso 非常简单方便,但有一个缺点:RequestProcessor 是Struts 的一个扩展点,也许应用程序本身就需要扩展RequestProcessor ,而DelegatingRequest Processor 已经使用了这个扩展点。

为了重新利用 Struts 的 RequestProcessor 这个扩展点,有以下两个方法:使应用程序的 RequestProcessor 不再继承 Struts 的 RequestProcessor ,改为继承DelegatingRequestProcessor 。

使用 DelegatingActionProxy。

前者常常有一些未知的风险,而后者是 Spring 推荐的整合策略。使用 DelegatingActionProxy 与DelegatingRequestProcessor 的目的只有一个,都是将请求转发给 Spring管理的 bean。

DelegatingRequestProcessor 可直接替换了原有的 RequestProcessor,并在请求转发给action 之前,转发给 Spring 管理的 bean; 而 DelegatingActionProxy 则被配置成 Struts 的action,即所有的请求先被 ActionServlet拦截,然后将请求转发到对应的 action,而 action的实现类全都是 DelegatingActionProxy; 最后由 DelegatingActionProxy 将请求转发给Spring 容器的 bean。

可以看出:使用 DelegatingActionProxy 比使用 DelegatingRequestProcessor 要晚一步转发到 Spring 的 contexto 但通过这种方式可以避免占用扩展点。与使用 DelegatingRequestProcessor 对比,使用 DelegatingActionProxy 仅需要去掉controller 配置元素,并将所有的 action 实现类改为 DelegatingActionProxy 即可。其详细的配置文件如:

<!--XML 文件版本,编码集-->
<?xml version="1.0" encoding="gb2312"?><!--struts配置文件的文件头,包括dtd等信息--〉
<!DOCTYPE struts-configPUBLiC
'-//Apache SoftwareFoundation//DTDStrutsCornlfiguration1.2
//EN"'http://struts.apache.org/dtds/struts-config_l_2.dtd''>
<! --struts配置文件的根元素--〉
<struts-config>
<!-- 配置 formbean,所有的 formbean都放在 form-beans元素里定义-->
<form-beans>
<!-- 定义了一个formbean. 确定 formbean名和实现类--〉
<form-bean name="loginForm" type="lee.LoginForm"/>
</form-beans><1-定义 action部分,所有的action都放在 action-mapping元素里定义->
<action-mappings>
<!--这里只定义了一个action,必须配置action的 type 元素为 Delegating
ActionProxy --><actionpath="/login"type="org.springframework.web.struts.
DelegatingActionProxy"
name="loginForm" scope="request" validate="true"
input="/login.jsp" ><!--定义 action内的两个局部forward元素--〉
<forward name="input"path=" /1ogin.jsp"/><forward
name="welcome" path="/welcome.html"/><faction><faction-mappings>
<!--加载国际化的资源包--〉
<message-resources parameter="mess"/>
<!--- 装载验证的资源文件--><plug-inclassName="org.
apache.struts.validator.ValidatorPluginil>
<set-property property="pathnames" value=" /WEB-INF/
validator-rules.xml, /WEB-INF/validation.xml" />
<set-property property="stopOnFirstError" value="true"/></plug-in>
<!--装载 Spring配置文件,随应用启动创建ApplicationContext实例--〉
<plug-in className="org.springframework.web.struts.
ContextLoaderPlugIn"><set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml,
/WEB-INF/action-servlet.xml"/></plug-in></struts-config>

DelegatingActionProxy 接受 ActionServlet 转发过来的请求,然后转发给ApplicationContext管理的bean,这是典型的链式处理。

通过配置文件可看出,在struts-config.xml文件中配置了大量DelegatingActionProxy实例, Spring 容器中也配置了同名的Action。即 Struts 的业务控制器分成了两个部分:

第一个部分是Spring 的 DelegatingActionProxy,这个部分没有实际意义,仅仅完成转发:

第二个部分是用户的Action实现类,负责实际的处理工作。

这种策略的性能比前一种的策略要差一些,因为需要多创建一个DelegatingActionProxy实例。而且在J2EE应用中的Action非常多,这将导致需要大量创建DelegatingActionProxy实例,在使用一次之后,要等待垃圾回收机制回收,从而降低了其性能。

DelegatingActionProxy 的执行效果如图7.6所示。

 
图 7.6 DelegatingActionProxy
整合策略登录成功的效果

DelegatingActionProxy的更多相关文章

  1. org.springframework.web.struts.DelegatingActionProxy

    之前也不知道用的是哪个版本的spring jar 包,后来换了之后发现问题出来了, 00:08:00,364 ERROR RequestProcessor:296 - No action instan ...

  2. SSH加载顺序问题

    http://bbs.csdn.net/topics/390299835 个人总结 1.项目启动首先加载WEB.xml文件 wen.xml文件中有     <!-- tomcat默认生成的地方是 ...

  3. struts1

    1.简单应用示例 导入struts1的jar包,然后配置xml,写java和jsp /struts/WebRoot/Login.jsp <%@ page language="java& ...

  4. Hibernate总结

    SSH原理总结 Hibernate工作原理及为什么要用: 原理: hibernate,通过对jdbc进行封装,对 java类和 关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改 ...

  5. struts1老古董配置

    <!--Struts1 struts-config.xml Demo --><?xml version="1.0" encoding="UTF-8&qu ...

  6. Struts+Spring+Hibernate整合入门详解

    Java 5.0 Struts 2.0.9 Spring 2.0.6 Hibernate 3.2.4 作者:  Liu Liu 转载请注明出处 基本概念和典型实用例子. 一.基本概念       St ...

  7. Spring学习笔记之整合struts

    1.现有项目是通过 <action    path="/aaaaAction"                type="org.springframework.w ...

  8. Cannot retrieve definition for form bean null on action错误

    Cannot retrieve definition for form bean null on action错误 1. 如果jsp页面中要用到<html:form action="& ...

  9. C3P0数据库连接池的相关bug解决

    数据库连接池的几个常见bug: 1.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76c7022e -- ...

随机推荐

  1. NBUT 1118 Marisa's Affair (排序统计,水)

    题意: 每行给出一个人名和一个int值,人名可重复出现.要求对同一个人名统计int值,最大的先输出,若相同,则按照人名出现次数,若再相同,则按照人名字典序. 思路: 输入完全部进行排序,写个比较函数传 ...

  2. 运行powershell 脚本 在此系统上禁止运行脚本

    解决方法: 首次在计算机上启动 Windows PowerShell 时,现用执行策略很可能是 Restricted(默认设置). Restricted 策略不允许任何脚本运行. 若要了解计算机上的现 ...

  3. TLint for 虎扑体育应用源码项目

    虎扑非官方客户端TLint全新Material Design设计,简洁美观支持论坛全部操作,浏览帖子.点亮.回复.引用.收藏等多项个性化设置(不同主题,不同阅读模式) TLint For 虎扑体育 更 ...

  4. 自己太水了—HDOJ_2212

    Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every d ...

  5. PyCharm如何配置断点调试功能

    1. 点击菜单 PyCharm -> Preferences.. 2. 在左侧菜单栏找到Project:Django - > Project Interpreter 并点击配置 Proje ...

  6. 数据库_7_SQL基本操作——表操作

    SQL基本操作——表操作 建表的过程就是声明列的过程. 表与字段是密不可分的. 一.新增数据表 create table [if not exists] 表名( 字段名字 数据类型, 字段名字 数据类 ...

  7. python之道05

    1.写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...

  8. javase(11)_juc并发库

    一.传统线程技术 public static void main(String[] args) { Thread thread = new Thread(){ @Override public voi ...

  9. 响应式web设计视图工具及插件总结----20150113

    响应式web设计可以说火不火是迟早的,下面就对于最开始的视口调试的方法汇总,希望有好的方法大家一起交流. 1.火狐:从Firefox升级到29.0之后就不直接支持Firesizer了. 先安装Add- ...

  10. Leetcode 7 反转整数Reverse Integer

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...