DelegatingActionProxy

使用 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 元素为 DelegatingActionProxy --><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

时间: 2024-10-10 23:33:30

DelegatingActionProxy的相关文章

Spring与Struts1整合方式之通过Spring的DelegatingActionProxy类

Spring提供了DelegatingActionProxy类,用来代理Struts中的Action,负责在Spring配置文档中查找对应的Action映射,从而把Struts的Action与Spring分离开,并把Struts的动作置于Spring框架的控制之下. 1.创建web工程,将需要的资源包导入工程的WEB-INF/lib下,所需要的资源包包括:commons-beanutils- 1.8.0.jar.commons-chain-1.2.jar.commons-digester-1.8

使用Hibernate+MySql+native SQL的BUG,以及解决办法

本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: [java] view plaincopy String sql = "select id XXX_ID  from t_tab"; List<Map> list = session.createSQLQuery(sql) .setResultTransformer(Transformers.ALIAS_TO_ENT

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

数据库连接池的几个常见bug: 1.警告: com[email protected]76c7022e -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 十月 01, 2016 6:28:24 下午 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 80%以上原因是数据连接配置或数据库等类似问题.

Java web的几种异常处理 (转)

一.在servlet容器中处理异常 以下两种方式: 1. 在web.xml定义异常处理  如果没有在web的应用中作异常处理,那么异常就会抛给Servlet容器,应该说此时Servlet容器是处理异常的时机了.如果此时Servlet容器还不对异常处理的话,那么容器会把异常的内容直接显示给访问者.  Servlet容器通过web.xml配置对异常的处理.在web.xml中进行异常处理的配置是通过<error-page>元素来表示,支持两种类型的异常拦截. 1)依据http请求所返回的状态码来拦截

struts1老古董配置

<!--Struts1 struts-config.xml Demo --><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/str

J2EE开发工作中遇到的异常问题及解决方法总结

转自:http://blog.csdn.net/rchm8519/article/details/41624381 1.    HttpClient I/O exception: 错误信息:I/O exceptioncaught when processing request: Connection timed out:connect 错误原因:IP不正确. 解决方法:改正IP 2.    Ambiguous handler methods mapped 错误信息:java.lang.Illeg

Spring中WebApplicationContext的研究

ApplicationContext是Spring的核 心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器” 了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出,虽然我没有看过这一部分的源代码,但我想它应该是一个类似 Map的结构.在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继承自 ApplicationCont

Spring AOP面向切面编程

出处:http://yangfei520.blog.51cto.com/1041581/1273069 前两天,在给新入职的同事做技术介绍时,讲到spring的AOP.使我又一次认识到,对于AOP,特别是spring AOP的理解,虽然大家都能说上来几句,但是许多人认识并不太全面,甚至可以说是一知半解----即使是对于那些已经有过几年开发经验的工程师也是如此.所以,回来之后,我干脆对这块东西做了个肤浅的小结,以便再有类似任务时,直接拿来给大家借鉴. AOP(Aspect-Oriented Pro

java面试题001

hibernate中离线查询去除重复项怎么加条件?? dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); http协议及端口,smtp协议及端口 http:超文本传输协议    端口 80 smtp:简单邮件传输协议 端口25 编写程序,完成文件复制功能 Servlet创建过程及生命周期Servlet 在容器中运行时,其实例的创建及销毁等是由容器进行控制. Servlet 的创建有两种方法. 客户端请求对应的 Servlet 时,创建