Struts初始化之RequestProcessor

本文详细解析了Struts框架中的RequestProcessor类的工作流程。包括处理multipart请求、国际化设置、内容类型判断等关键步骤,以及如何通过重写特定方法进行框架扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于RequestProcessor这个类,有的人可能很陌生,毕竟它不象ActionSerlvet那样,在我们的面前频繁的出现。但是,RequestProcessor用的要远比ActionServlet多,那么RequestProcessor到底是干什么的呢?当ActionServlet接收到客户请求后,会进行一连串的初始化操作,然后,就会将客户请求转交给合适的处理器进行处理,这个合适的处理器就是org.apache.struts.action.RequestProcessor。既然我们知道了RequestProcessor的用处,下面我们就详细的分析下这个处理器类。
1.[color=red]调用processMultipart( )方法,[/color]如果HttpServletRequest是POST方式,且请求为multipart/form-data ,Struts框架将请求对象包装成处理multipart 请求专用的请求对象,否则,只是简单地返回原有的请求对象。一般来说,除非需要处理文件上传,否则不用关心multipart 功能的具体细节。
2.[color=red]调用processPath( ) 方法,[/color]该方法用来从请求URL中获应用取路径部分。获取到的信息在稍后的步骤中用于选择合适的Struts Action调用。
3.[color=red]调用processLocale( )方法,[/color]处理一些国际化的事务。
4.[color=red]调用方法processContent( ),[/color]来决定请求的content type编码(encoding)方式。content type可以配合在配置文件中,也可以在jsp文件中配置,默认为text/html。
5.根据noCache属性的设置[color=red]调用processNoCache( ) 方法,[/color]如果noCache设置为true。则添加合适的响应头到响应对象中,使得页面保留在浏览器的Cache中。这些响应头包含Pragma, Cache-Control, 和Expires 。
6.[color=red]调用processPreprocess( )[/color]方法,这个方法在这儿设置一个钩子,方法的默认实现只是简单地返回true,这样给了自定义处理器的开发者提供了一个合适的地方让你添加自己的业务逻辑。因为这个方法在调用Action之前被调用,如果你重载这个方法,只需要返回false,则Action就不会被调用。例如,你可以重载这个方法用户检查客户session,如果不通过就返回false。
7.[color=red]调用processMapping( )方法,[/color]根据客户请求信息中的path 信息来决定是否返回ActionMapping对象实例。如果不能够找到path 的映射,则客户将会得到一个error 响应。
8.[color=red]通过调用processRoles( )方法,[/color]检查是否为Action配置了安全角色。如果配置了角色要求,则请求对象的isUserInRole( )方法被调用,如果用户属于这些角色,则客户会得到显示一个error 响应。
9.[color=red]调用processActionForm( )方法,[/color]检查是否存在为ActionMapping配置的ActionForm 。如果存在,则在有效区域内查找是否存在该ActionForm 的实例,存在,则复用,不存在,则创建一个实例。然后将实例保存与再配置文件中配置好的有效区域(request,session,application)内,并用Action元素的name属性作为该实例的关键字。
10.[color=red]调用processPopulate( )方法,[/color]如果存在为ActionMapping配置的ActionForm,则封装请求对象中的数据到ActionForm 中,在进行封装之前,先调用ActionForm 的reset( )方法进行属性值的默认化。
11.[color=red]调用processValidate( )方法,[/color]如果ActionForm被配置好,并且action元素的属性validate被设置为true ,则进一步调用validate( )方法进行规则校验。如果validate( )方法校验失败,就会保存一个ActionErrors 对象到请求区域中,请求将会自动重定向到action映射的input属性所指定的页面中。如果校验通过或在action 映射中没有配置ActionForm,则继续处理请求。
12.根据action 映射是否配置了forward属性或include属性来决定下一步操作。如果配置了任意一个,则相应地调用RequestDispatcher对象的[color=red]forward( )方法或include( )[/color]方法,调用后,对客户请求的处理结束。否则,继续处理请求。
13.[color=red]调用processActionCreate( )方法,[/color]创建或获取一个Action对象实例处理请求。processActionCreate( )方法会在缓存中查找是否存在已经创建好的Action实例,如果存在,则复用,否则,则重新创建并将其村于缓存中。
14.[color=red]调用processActionPerform( )方法,[/color]该方法用于在一个try/catch 代码块中调用action 实例的execute( )方法,这样确保action 的execute( )方法一旦发生执行异常能够被RequestProcessor捕获。
15.[color=red]调用processActionForward( )方法,[/color]并传入action的execute( )方法所返回的ActionForward对象实例,方法通过检查ActionForward对象实例,决定采用redirect或forword方式进行重定向。究竟采用redirect还是
forword取决于forward元素的redirect属性值。

上面这些分析,也是我在网上搜集的资料并加以整理总结出来的,在实际的应用开发中,如果我们想对Struts在初始化的时候进行一些扩展,我们可以重新写ActionServlet的子类,或RequestProcessor的子类,但是不建议去写ActionServlet的子类,在RequestProcessor中为我们提供了[color=red]processPreprocess()[/color]这个钩子方法,这样,我们可以去重写这个方法,来进行扩展。虽然RequestProcessor在表面上不是很常用到,但是他给人的感觉却恰恰相反,这个类用来处理我们每一次的请求,所以,更好的了解RequestProcessor类对我们来说很重要。
127.0.0.1:7001/dcms_index.view? 华夏银行 在线客服 户管理 bjq 审会会议通知信任务池 本会会议纪要企业资产证券化管理 Error 500--Internal Server Error 受信额度停用申请放款管理 贷后管理 javax. servlet.isp.IsnException. Exception creating bean of class com.ebworx. hxb. mcif. training.struts. controller. TrainingLscCustomerActionForm:(1) 同一务人管理 跨条线副资管理 at org. apache.struts.taglib.html. FormIag. doStartTag (FornTag.java:520) at org.apache.struts. taglib.html.FormIag.initFormBean (FormTag.java:563) at org. apache.strutsel.taglib.html.ELFormTag.doStartTag(ELFormTag.java:324) 档案管理 at jsp_servlet._dcms._base._menu_interface._jsp_tag2(_menu_interface. java:204) 回收与清侃 at weblogic.servlet. jsp.JspBase.service(JspBase.java:34) at jsp_servlet._dcms._base.__menu_interface._jspService(_menu_interface.java 130) 调整业务信息 at weblogic.servlet.internal. StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 调整流星信息 at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 系统参数维护 at weblogic.servlet.internal.TailFilter.doFilter (TailFilter.java:26) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301) 报表查询 at weblogic.servlet.internal.FilterChainInpl.doFilter (FilterChainImpl.java:56) 信息与公告 at com.haian.hxb.itsm.filter.XssFilter.doFilter (XssFilter.java:30) at weblogic.servlet.internal.FilterChainImpl. doFilter (FilterChainImpl.java:56) 担保变更 at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:527) 调整用户电息 at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253) at common.web.struts.service.RequestProcessor.doForvard (RequestProcessor.java:1067) at common.web.struts. service.RequestProcessor.internalModuleRelativeForvard(RequestProcessor.java:1010) at common.web.struts. service.RequestProcessor.processForvard(RequestProcessor.java:580) at common.web.struts. service.RequestProcessor. process(RequestProcessor.java:257) at org.apache.struts.action.ActionServlet,process(ActionServlet.java:1482) at org.apache. struts.action.ActionServlet.doGet (ActionServlet.Java:507) iosyearulet rernceHetnSarx]et:7071 DevTools is now available in Chinesel Always match Chrome's language Switch DevTools to Chinese Dontsnow agan Elements Console Sources Network Performance Memory Application Security Lighthouse Recorder Performance insights A Preserve log□Disable cache No throttling Fiter 1nvert Hide data URLs☑Hide extension URLc All Fotch/XHR oos Css s Font img Meda Manifest Ws walm other o Blcked reauest 20000ms 40000
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值