`
jyzxwjj
  • 浏览: 8000 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Struts初始化之RequestProcessor

阅读更多
对于RequestProcessor这个类,有的人可能很陌生,毕竟它不象ActionSerlvet那样,在我们的面前频繁的出现。但是,RequestProcessor用的要远比ActionServlet多,那么RequestProcessor到底是干什么的呢?当ActionServlet接收到客户请求后,会进行一连串的初始化操作,然后,就会将客户请求转交给合适的处理器进行处理,这个合适的处理器就是org.apache.struts.action.RequestProcessor。既然我们知道了RequestProcessor的用处,下面我们就详细的分析下这个处理器类。

下面我们来介绍其中的process()方法:



pubic void process(HttpServletRequest request,HttpServletResponse reponse) throws IOException,ServletException {



//Wrap multipart requests with a special wrapper

      request=processMultipart(request);

//Identify the path component we will use to select a mapping

      String path=processPath(request,response);

      if(path==null){

         return;

        }



      if(log.isDebugEnabled()){



         log.debug(“processing a ”+request.getMethod()+”for path”+path+””)



        }



//select a locale for the current user if requested



processLocale(request,response);







//set the content type and no-caching headers if requested



processContent(request,response);



processNoCache(request,response);







//General purpose preprocessing hook



if(!processPreprocess(request,response)) {



     return;



}







//identify the mapping for this request



ActionMapping mapping=processMapping(request,response,path);



If(mapping==null) {



      return;



}







//check for any role required to perform this action



if(!processRoles(request,response,mapping)) {



      return;



}







//process any actionForm bean related to this request



ActionForm form=processActionForm(request,response,mapping);



processPopulate(request,response,form,mapping);



if(!prcessValidate(request,response,form,mapping)) {



     return;



}







//process a forward or include specified by this mapping



if(!processForward(request,response,mapping)) {



      return;



}



if(!processInclude(request,response,mapping)) {



      return;



}







//create or acquire the Action instance to process this request



Action action=processActionCreate(request,response,mapping);



If(action==null) {



    return;



}







//call the action instance itself



ActionForward forward=processActionPerform(request,response,form,mapping);







//process the returned ActionForm instance



processForwardConfig(request,response,forward);



}



其执行流程如下:



(1)                调用processMultipart()方法,如果HTTP请求方式为POST,并且请求的coutentType属性以”Multipart/form-data”开头,标准的HttpServletRequest对象将被重新包装,以方便处理“Multipart”类型的HTTP请求,如果请求方式为GET,或者contentType属性不是“multipart”,就直接返回原始的HttpServletRequest对象。



(2)                调用processPath(),获得请求URI路径,这一信息可用于选择合适的Struts Action组件。



(3)                调用processLocale()方法,当ControllerConfig对象的locale属性为true,将读取用户请求中包含的Locale信息,然后把Locale实例保存在session范围内。



(4)                 调用processContent(),读取ControllerConfig对象的contentType属性,然后调用response.setContentType(content Type)方法,设置响应结果的文档类型和字符编码。processContent()方法的代码如下:



protected void processContent(HttpServletRequest request,HttpServletResponse){



        String contentType=moduleConfig.getControllerConfig().getContentType();



If(contentType!=null) {



        Response.setContentType(contentType);



     }



}



(5)                调用processNoCache(),读取ControllerConfig对象的nocache属性,如果nocache属性为true,在响应结果中将加入特定的头参数:Pragma,Cache-Control和Expires,防止页面被存储在客户浏览器的缓存中,processNoCache()方法的代码如下:



protected void processNoCache(HttpServletRequest request,HttpServletResponse response){



     if(moduleConfig.getControllerConfig().getNoCache()) {



          response.setHeader(“Pragma”,”NoCache”);



          response.setHeader(“Cache-Control”,”no-cache”);



          response.setHeader(“Expires”,1);



        }



}



(6)                调用processPreprocess(),该方法不执行任何操作,直接返回true,子类可以覆盖这个方法,执行客户化的预处理请求操作。



(7)                调用processMapping(),寻找和用户请求的URI匹配的ActionMapping,如果不存在这样的ActionMapping,则向用户返回恰当的错误信息。



(8)                调用processRoles(),现判断是否为Action配置了安全角色,如果配置了安全角色,叫调用isUserInRole()方法判断当前用户是否具备必须的角色。如果不具备,就结束请求处理流程,向用户返回恰当的错误信息。



(9)                调用processActionForm(),现判断是否为ActionMapping配置了ActionForm,如果配置了ActionForm(),就先从ActionForm的存在范围内寻找该ActionForm的实例,如果不存在,就创建一个实例,接下来把它保存在合适的范围内,保存时使用的属性key为ActionForm的name属性。



(10)            调用processPopulate()方法,如果为ActionMapping配置了ActionForm,就先调用ActonForm的reset()方法,再把请求中的表单数据组装到ActionFrom中。



(11)            调用processValidate(),如果为ActionMapping 配置了ActionForm,并且ActionMapping 的validate属性为true,就调用ActionForm的validate()方法,如果validate()方法返回的ActionErrors对象中包含ActionMessage对象,说明表单验证失败,就把ActionErrors对象存储在request范围内,再把请求转发到ActionMapping的input属性指定的WEB组件,如果ActionForm的valildate()方法执行表单验证成功,就继续执行下一个请求处理流程。



(12)            调用processForward(),判断是否在ActionMapping中配置了forward属性,如果配置了这个属性,就调用RequestDispatcher的forward()方法,请求处理流程结束,否则进行下一步。



(13)            调用processInclude(),判断是否在ActionMapping中配置了include属性,如果配置了这个属性,就调用RequestDispatcher的include()方法,请求处理流程结束,否则进行下一步。



(14)            调用processActionCreate()方法,现判断是否在Action缓存中存在这个Action实例,如果不存在,就创建一个实例,把它保存在Action缓存中。



(15)            调用processActionPerform()方法,该方法再调用Action实例的execute()方法,execute()方法位于try/catch代码中,以便捕获异常。代码如下:



protected ActionForward processActionPerform(HttpServletRequest request,HttpServletResponse response,Action action, ActionMapping mapping)throws IOException,ServletException{



   try{



         return(action.execute(mapping,form,request,response));



       }catch(Exception e){



         return(processException(request,response,e,form,mapping));



       }



}



(16)            调用processActionForward()方法,把Action 的execute()方法返回的ActionForward对象作为参数来传给它。processActionForward()根据ActionFroward对象包含的请求转发信息来执行请求转发或重定向。



注意:在struts中,ControllerConfig类与配置文件中的<controller>元素对应,ActionMapping类和<action>元素对应,ActionForward类和<forward>元素对应



扩展RequestProcessor类



下面我们来实现用户在同一个会话的任何时候都可以改变它的Locale设置,在RequestProcessor类中定义的processLocale()方法的默认行为是: 仅仅当session范围呢不存在Locale实例的时候,才会把Locale实例保存在session内,这通发生在处理同一个对话的第一个请求时。



那么我们怎样实现在同一个会话的任何时候都可以改变它的Locale设置呢?我们扩展RequestProcessor类,检查每次用户发出的HTTP请求中包含的Locale信息,每当Locale发生变化时,就会把新的Locale实例保存在session范围内。



代码如下:



package sample;
import javax.servlet.http*;



import java.util.Locale;



import org.apache.struts.action.Action;



import org.apache.struts.action.RequestProcessor;



import org.apache.struts.action.Globals;







public class ExtendedRequestProcessor extends RequestProcessor{



      protected void processLocale(HttpServletRequest request,HttpServletResponse response){



        if(!moduleConfig.getControllerConfig().getLocale()){



           return



               }//end if



//get the locale that stored in the user’s session if any



        HttpSession session=request.getSession();



        Locale sessionLocale=(Locale)session.getAttribute(Globals.LOCALE_KEY);



        }



//get the user’s preferred Locale form the request



       Locale requestLocale=request.getLocale();







//if was never a locale in the session or it has changed ,set it



if(sessionLocale==null||(sessionLocale!=requestLocale)){



           if(log.isDebugEnabled()) {



                 log.debug(“Setting user locale”+requestLocale+””);



                   }//end if (log.isDebug)



//set new locale into the user’s session



   session.setAttribute(Globals.LOCALE_KEY,requestLocale);



           }//end if(sessionLocale==null……)



  }//end protected void processLocale(…)



}//end of ExtendedRequestProcessor class



然后在struts配置文件中,<controller>元素的processClass属性用来配置上面扩展好的类,我们就可以在struts中使用这个类



<controller



contentType=”text/html;charset=GB2312”



locale=”true”



nocache=”true”



processClass=”sample.ExtendedRequestProcessor”/>



到这里,我么就完成了对RequestProcessor类的扩展。



上面这些分析,也是我在网上搜集的资料并加以整理总结出来的,在实际的应用开发中,如果我们想对Struts在初始化的时候进行一些扩展,我们可以重新写ActionServlet的子类,或RequestProcessor的子类,但是不建议去写ActionServlet的子类,在RequestProcessor中为我们提供了processPreprocess()这个钩子方法,这样,我们可以去重写这个方法,来进行扩展。虽然RequestProcessor在表面上不是很常用到,但是他给人的感觉却恰恰相反,这个类用来处理我们每一次的请求,所以,更好的了解RequestProcessor类对我们来说很重要。
分享到:
评论

相关推荐

    struts1整合spring 通过代理RequestProcessor实现

    RequestProcessor是Struts1框架中的关键组件,它负责处理HTTP请求,初始化ActionForm,调用Action执行业务逻辑,并将结果返回给用户。 具体步骤如下: 1. **配置Spring**:首先,我们需要在Spring的配置文件中定义...

    struts的form不能初始化java.util.Date类型

    然而,在使用Struts时,可能会遇到一个问题,即无法初始化`java.util.Date`类型的表单(Form)字段。这个问题在实际开发中很常见,因为日期和时间的处理是Web应用中的核心功能。 在Struts框架中,表单通常由...

    spring和struts整合的三种方案

    这种方式使得 Spring 容器能够在 Struts 初始化时加载,从而管理应用中的所有bean。 2. **使用 ContextLoaderListener 监听器** 另一种启动 Spring 容器的方法是在 `web.xml` 中配置 `ContextLoaderListener` ...

    struts1.1源代码

    Struts 1.1 的默认 RequestProcessor 是 `org.apache.struts.action.RequestProcessor`。 6. **Tiles**: Struts 1.1 集成了 Tiles 模块,允许开发者创建可重用的页面片段(Tiles),增强了视图的组织和复用能力。...

    struts1 api 帮助文档

    另外,`RequestProcessor`是Struts1处理请求的关键类,它负责初始化Action实例,并将请求分发给相应的Action。开发者可以自定义RequestProcessor以扩展其功能。 总的来说,Struts1 API帮助文档覆盖了框架的所有关键...

    Spring整合Struts

    因为StrutsTestCase的MockStrutsTestCase不会在启动时初始化监听器,所以将所有上下文文件放置在插件中是一种变通方法。 配置完插件后,就可以让Spring管理你的Action了。Spring1.1.3提供了两种方式: 1. 覆盖...

    myEclipse创建Struts Project

    2. **web.xml**:配置Servlet,包括Struts的DispatcherServlet(Front Controller)和Filter,以及Struts的初始化参数。 **五、MyEclipse中的Struts工具** MyEclipse提供了对Struts的集成支持,包括自动创建Action...

    struts1 源码

    在这里,ActionServlet会读取web.xml中的初始化参数`config`来确定Struts的配置文件位置,默认为`/WEB-INF/struts-config.xml`。 3. `initServlet()`:初始化Servlet映射,通过Apache Commons Digester解析web.xml...

    struts 体系结构

    7. **RequestProcessor**:请求处理器负责初始化Struts框架,处理请求并调用ActionServlet。 8. **Tiles**:Tiles是Struts的一个扩展,提供了一种更灵活的方式来组织和组合页面布局。它允许将一个大的页面拆分为多...

    struts类图

    ActionServlet在初始化时会读取配置文件(struts-config.xml),并根据配置创建ActionForm和Action的实例。 2. **ActionMapping**:这个类定义了请求与Action类之间的映射关系。它包含了ActionForm和Action的路径...

    struts2面试题(个人四处搜集,吐血推荐).

    关于工作流程,Struts1首先初始化ActionServlet和ActionContext,随后根据请求参数和struts-config.xml文件中的配置,将请求参数传递给ActionForm,并且设置session。通过ActionMapping找到相应的Action类,执行后...

    Struts中文api

    8. **ActionServlet**:作为Struts的核心Servlet,负责初始化和配置ActionMapping、ActionForm等组件。 9. **配置文件**:包括struts-config.xml和web.xml,它们定义了Struts的全局配置,如Action的映射、数据源、...

    struts源码解析

    在Struts框架中,`init()`方法用于初始化ActionServlet,它会调用`initInternal()`以及其他必要的初始化操作,比如加载配置、注册事件监听器等。 5. **struts流程图方法图.vsd**: 这个文件可能是一个详细的流程图,...

    struts源码学习.pdf

    - **概述**:`RequestProcessor`类在Struts架构中扮演着核心角色之一,主要作为`ActionServlet`的助手类。`ActionServlet`的主要功能通过`RequestProcessor`类实现,尤其是在处理HTTP请求时。 - **职责**:处理...

    struts1源代码

    8. **PlugIn**:允许开发者插入自定义的初始化和销毁代码,以扩展Struts1的功能。 9. **Interceptor**:拦截器是Struts1中实现AOP(面向切面编程)的重要机制,可以定义在请求处理之前和之后执行的逻辑,例如日志...

    struts学习总结

    5. **RequestProcessor**:每个Struts应用都有一个RequestProcessor,它是请求处理的第一道防线,负责初始化ActionServlet,检查请求,以及将请求分派到相应的Action。 6. **Tiles**:Tiles是Struts的一个扩展,...

    struts2面试题(本人面试题)

    - 当部署Struts应用时,Web容器根据`web.xml`文件初始化`ActionServlet`。 - `ActionServlet`初始化`ActionContext`和其他相关组件。 2. **请求处理阶段:** - 用户发送HTTP请求至服务器。 - `ActionServlet`...

    struts中文帮助.CHM

    10. **RequestProcessor**:RequestProcessor是Struts1处理请求的起点,它负责解析请求,初始化ActionForm,调用Action,以及处理其他请求相关的任务。 "readme2.txt" 和 "readme.txt" 文件通常包含关于压缩包的...

    Struts-1.3.8

    8. **RequestProcessor**:它是请求处理的第一步,负责初始化ActionServlet,以及处理请求前的预处理工作。 9. **ValueStack**:在Struts 1.3.x版本中引入,ValueStack是一个对象栈,用于存储ActionForm和模型对象...

    Struts 1.3.8 jar包,

    6. **RequestProcessor**:处理来自请求的预处理和后处理任务,例如校验ActionForm,初始化Action实例等。 7. **ActionMapping**:描述了Action与URL之间的映射关系,决定了请求如何被路由到特定的Action。 8. **...

Global site tag (gtag.js) - Google Analytics