`

struts中ActionServlet核心处理RequestProcessor.process()

阅读更多

public void process(HttpServletRequest request,
                    HttpServletResponse response)
    throws IOException, ServletException {

    // 处理 contentType 为 multipart/form-data 的 POST 请求,如果是则将请求包装,否则,返回原有

    //请求,一般来说,除非是要处理文件上传,否则不用关心
    request = processMultipart(request);

    //取得 URI 路径
    String path = processPath(request, response);
    if (path == null) {
        return;
    }
   
    if (log.isDebugEnabled()) {
        log.debug("Processing a '" + request.getMethod() +
                  "' for path '" + path + "'");
    }

    // 处理一些国际化的事务
    processLocale(request, response);

    // 决定请求的Content编码方式。指定响应结果内容类型和字符编码,默认是text/html
    processContent(request, response);

    //nochache如果是true在响应结果中加入特定的头参数
    processNoCache(request, response);

    // /前置处理,默认返回 true,子类可以重新定义它以決定要不要继续处理

    if (!processPreprocess(request, response)) {
        return;
    }
   
    this.processCachedMessages(request, response);

    //根据客户请求信息的path来决定是否返回ActionMapping实例。

    //如果不能找到path的映射则先看是否actionMapping中有unknown属性 有返回,没有这客户将会得到一个error响应
    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;
    }

    // 处理ActionForm,如果沒有就新增一个,之后一直使用它
   //首先先检查是否存在ActionMapping配置的ActionForm。如果存在,
   //则在有效区域查找是否存在该ActionForm实例,存在则复用,不存在则创建一个实例
   //然后将实例保存在配置文件中的有效域(request,session)内,
   //并用mapping.getAttribute()作key值


    ActionForm form = processActionForm(request, response, mapping);
    // 如果存在ActionMapping配置的ActionForm,则封装请求对象的数据
    //到ActionForm中,在封装之前,先调用ActionForm的reset()方法进行属性值的默认化


    processPopulate(request, response, form, mapping);
   
    // 如果ActionForm被配置好,并且action元素的属性Validate被设置为true,
    //则进一步调用validate()方法进行规则校验。如果validate()方法校验失败,
    //就会保存一个ActionErrors对象到请求域中,请求将自动重定向到action映射的
    //input属性所指向的页面中。如果校验通过或action映射中没有配置ActionForm,
    //则继续处理请求


    try {
        if (!processValidate(request, response, form, mapping)) {
            return;
        }
    } catch (InvalidCancelException e) {
        ActionForward forward = processException(request, response, e, form, mapping);
        processForwardConfig(request, response, forward);
        return;
    } catch (IOException e) {
        throw e;
    } catch (ServletException e) {
        throw e;
    }
       
    // 判断 <action> 标签的 forwardinclude 标签是不是被设定
   // 这两个标签在设定一個路径,其与 type 属性是互斥的,当设定
   // 其中一个属性时,调用 RequestDispatcher 的 forward() 或
   // include() ,其作用与设定ForwardAction或IncludeAction相同
   // 直接传送而不再使用Action物件进行接下来的处理
    if (!processForward(request, response, mapping)) {
        return;
    }
   
    if (!processInclude(request, response, mapping)) {
        return;
    }

   //创建或获得action实例来处理此请求
    // 处理action,如果沒有就生成一个,之后一直使用它
    Action action = processActionCreate(request, response, mapping);
    if (action == null) {
        return;
    }

    // 调用Action的execute()方法,并反回ActionForward
    ActionForward forward =
        processActionPerform(request, response,
                             action, form, mapping);

    //处理返回来的ActionForward
    processForwardConfig(request, response, forward);

}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    commons-beanutils-1.7.0

    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service...

    Struts_lesson3.ppt

    - **RequestProcessor**: 处理每个模块的请求,它负责处理ActionServlet传递过来的请求,包括验证用户角色、处理表单Bean、选择ActionMapping和执行Action等步骤。 - **Action**: 这是业务逻辑的入口点,它实现了`...

    Struts简单机制.txt

    - **请求处理阶段**:每次接收到客户端请求时,ActionServlet都会调用RequestProcessor的process方法来处理该请求。 2. **RequestProcessor**:RequestProcessor类负责协调Struts框架中的其他组件,如ActionForm、...

    struts调用流程总结,适用于初学者.

    - 当ActionServlet接收到HTTP请求,它会在`doGet()`或`doPost()`方法中调用`process()`方法,接着由RequestProcessor处理实际的请求。 2. **ActionForm**: - ActionForm用于封装来自客户端表单的数据。当请求...

    J2EE中Struts中四种解决中文乱码问题的方法

    **原理介绍**:在Struts配置文件中设置ActionServlet的初始化参数`inputEncoding`。 **具体实现**: 1. **修改struts-config.xml**: ```xml &lt;plug-in className="org.apache.struts.action.ActionServlet"&gt; ...

    struts课件2

    当ActionServlet接收到请求后,会根据`struts-config.xml`中的配置找到对应的Action实例,调用其`execute()`方法来处理请求。 4. **ActionForm**:ActionForm 类用于封装用户的请求数据,它通常对应于HTML表单中的...

    sturts运行机制

    3. **RequestProcessor的参与**:在process()方法中,ActionServlet会实例化或获取RequestProcessor对象,RequestProcessor是处理请求的核心组件。它会解析struts-config.xml配置文件,寻找与请求URI匹配的`&lt;action&gt;...

    struts1 基本流程.docx

    首先,ActionServlet是Struts1.2中的核心组件,它扮演着前端控制器的角色。当应用程序启动时,由于在web.xml配置文件中设置了`&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;`,ActionServlet会立即被实例化并调用其`init`...

    struts源码学习.pdf

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

    Struts1配置

    ActionServlet会根据`struts-config.xml`中的配置来处理请求。首先,`process()`方法被调用,接着选择合适的RequestProcessor实例。RequestProcessor会检查Action缓存,如果Action实例不存在,就会创建一个新的实例...

    struts流程

    Struts框架的核心组件之一是`ActionServlet`,它作为前端控制器处理所有的HTTP请求,并将请求分发到相应的业务逻辑层(Action)。下面我们将深入解析Struts的处理流程,以帮助开发者更好地理解和运用Struts框架。 #...

    struts面试题

    一旦捕获到请求,ActionServlet会查找与请求相关的Action,然后通过调用`ActionServlet`中的`process()`方法,进而调用`RequestProcessor`对象的`process()`方法来处理请求。最终,Action的执行结果会通过`Action...

    Struts1 控制器组件和动态表单详解

    总结,Struts1的控制器组件包括ActionServlet、RequestProcessor和Action,它们协同工作以处理用户请求并驱动业务逻辑。动态ActionForm提供了对表单数据处理的灵活性,适应了Web应用中多样化的用户输入需求。通过...

    [精选]控制器组件和控制器机制概述.pptx

    `process()`方法是ActionServlet的核心,它会根据请求的类型调用相应的处理方法。 2. **RequestProcessor**:这是一个中间层,负责处理ActionServlet接收到的请求。RequestProcessor对请求进行预处理,根据`struts-...

    struts课件3

    `RequestProcessor` 类扮演着核心角色,它处理所有客户端的请求,所有请求的处理都在 `RequestProcessor` 的 `process()` 方法中进行。`Action` 类是业务逻辑的主要载体,它的 `execute()` 方法用于根据传入的请求...

    Java程序员面试综合

    - `ActionServlet` 调用 `process()` 方法处理请求。 - `RequestProcessor` 进一步处理请求,实例化 `FormBean`。 - 填充 `FormBean` 的值,并进行验证。 - 实例化相应的 `Action` 类。 - 调用 `Action` 类中的...

Global site tag (gtag.js) - Google Analytics