`

[摘]Struts中RequestProcessor

阅读更多
From Gossip@caterpillar
Struts Gossip: 简介 RequestProcessor
在Struts中,担任 MVC / Model 2 中Controller角色的是ActionServlet,所有的请求都必须先通过它,然而在Struts 1.1後,有关於请求的处理大部份已交由RequestProcessor,当ActionServlet收到GET或POST的请求,其doGet() 或doPost()会呼叫process()方法来处理请求:

protected void process(HttpServletRequest request,
                        HttpServletResponse response)
                   throws IOException, ServletException {
    RequestUtils.selectApplication(request,
                                   getServletContext());
    getApplicationConfig(
         request).getProcessor().process(request, response);
}


RequestUtils是个工具类,ActionServlet呼叫其selectApplication()方法,藉由 request.getServletPath()来取得请求路径以选择应用程式模块来处理请求,之後从ApplicationConfig物件取得 RequestProcessor物件,将使用者的请求委托它来进行处理。

通常是将ActionServlet当作黑盒子,您只要使用它,然而您也可以继承ActionServlet来定义自己的控制器,但由於在Struts 1.1中大部份的请求已经委托RequestProcessor来处理,继承ActionServlet来定义自己的控制器请求处理意义已经不大,通常的 目的是重新定义ActionServlet的init()方法,增加自己的初始化动作:

public class CustomActionServlet extends ActionServlet {
    public void init() throws ServletException {
        super.init();

        // 增加自己的初始化动作
        ....
    }
}


预设的RequestProcessor物件是org.apache.struts.action.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;
    .....

    // 确定客户端的位置
    // 是否要将一个Locale物件储存在 session 中
    // 配合 <controller> 的 locale 属性使用
    processLocale(request, response);

    // 确定contentType,预设是 text/html
    processContent(request, response);

    // 判断<controller>属性nocache是否被确定
    // 若是,在 response 中加入防止快取的header
    processNoCache(request, response);

    // 前置处理,预设返回 true
    //子类可以重新定义它以决定要不要继续处理
    if(!processPreProcess(request, response)) {
        return;
    }

    // 从URI路径确定ActionMapping
    ActionMapping mapping =
                   processMapping(request, response, path);
    if(mapping == null) {
        return;
    }

    ....

    // 处理ActionForm
    // 如果没有就新增一个,之後一直使用它
    ActionForm form =
            processActionForm(request, response, mapping);
   
    // 将表单的栏位值填入ActionForm
    processPopulate(request, response, form, mapping);

    // 判断是否执行ActionForm的validate()方法
    if(!processValidate(request, response, form, mapping)) {
        return;
    }

    // 判断 标签的 forward 或 include 标签
// 是不是被设定,这两个标签在设定一个路径
// 其与 type 属性是互斥的,当设定其中一个属性时
// 调用 RequestDispatcher 的 forward() 或 include()
// 其作用与设定ForwardAction或IncludeAction相同
// 直接绕送而不再使用Action物件进行接下来的处理
    if(!processForward(request, response, mapping)) {
        return;
    }
    if(processInclude(request, response, mapping)) {
        return;
    }

    // 处理Action,如果没有就生成一个,之後一直使用它
    Action action =
            processActionCreate(request, response, mapping);
    if(action == null) {
        return;
    }

    // 呼叫Action的execute()或perform()方法
// 并返回ActionForward
    ActionForward forward =
                    processActionPerform(request,
                                         response,
                                         action,
                                         for, mapping);

    // 处理ActionForward
    processActionForward(request, response, forward);
}



您可以继承RequestProcessor,并改写其中的processXXXXX()方法来自定义请求的处理方式,如果您要使用自己的 RequestProcessor,要在struts-config.xml中使用<controller>标签来定义,例如:

struts-config.xml
... <controller     contentType="text/html;charset=Big5"     locale="true"     nocache="true"    processorClass="caterpillar.CustomRequestProcessor"/> ...

在Struts 1.1後,新增了<controller>标签,它可以用於指定ActionServlet的一些参数,在Struts 1.1之前,这些参数是在<init-params>中加以指定,使用<controller>标签,应用程式中不同的模组也可 以指定各自的参数给ActionServlet。
分享到:
评论

相关推荐

    struts1整合spring 通过代理RequestProcessor实现

    在"struts1整合spring 通过代理RequestProcessor实现"这个主题中,核心思想是利用Spring的AOP(面向切面编程)能力,对Struts1的RequestProcessor进行代理,以此来增强或扩展RequestProcessor的功能。...

    Struts中文乱码解决方案

    这里我们将详细探讨如何解决 Struts 中的中文乱码问题。 一、在 Action 类中的解决方法: 当在 Action 类中遇到中文乱码问题时,可以使用以下代码进行转换。创建一个静态工具类,如 `Chinese`,并定义一个 `...

    struts解决中文乱码问题

    `RequestProcessor`是Struts框架中的核心组件,它负责处理ActionServlet接收到的所有请求,并将请求分解为多个任务。通过自定义`RequestProcessor`,我们可以在请求处理的早期阶段就解决编码问题,使得所有后续操作...

    struts1.2 解决中文乱码

    - **自定义 RequestProcessor 类:**继承 Struts 的 RequestProcessor 类,并重写 `processPreprocess` 方法,在此方法中设置请求的字符编码。 ```java package servlets; import java.io....

    struts1和struts2中文教程

    4. **拦截器**:虽然Struts1没有正式的拦截器概念,但通过RequestProcessor可以实现类似的功能。 5. **标签库**:Struts1提供了丰富的自定义标签库,如logic、bean、html等,简化了JSP页面的编写。 **Struts2详解:...

    整合Spring与Struts的几种方法

    2. **使用DelegatingRequestProcessor替换RequestProcessor**:在`struts-config.xml`中,将Struts的RequestProcessor替换为Spring的`DelegatingRequestProcessor`,并在Spring配置文件中定义与Struts `...

    Struts中文api

    API文档是开发者理解并熟练运用任何框架的基础,Struts1.x中文API文档详细解释了框架中的各个类、接口、方法以及常量等,使得国内开发者无需英文基础也能轻松掌握Struts的核心功能。通过查阅这份文档,你可以了解到...

    DisapatchAction测试和RequestProcessor控制器类

    `DispatchAction`是Struts中的一种特殊Action,它的主要职责是根据用户请求的不同参数来调用不同的方法,从而实现多方法处理一个HTTP请求的功能。在`DispatchAction`中,每个子方法对应于一个特定的业务操作,这使得...

    struts中文帮助.CHM

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

    Struts中中文乱码的解决方法

    以下两种方法可以有效解决Struts中的中文乱码问题: 方法一: 1. **配置JSP页面**:首先确保在每个JSP页面的头部声明正确的字符编码。例如,添加以下代码: ```html ;charset=UTF-8" language="java" %&gt; ``` 这...

    Struts中文帮助文档

    3. **MVC模式**:手册会深入讲解MVC模式在Struts中的应用,包括模型(model)如何处理业务逻辑,视图(view)如何展示数据,以及控制器(controller)如何协调两者。 4. **动作(Action)**:Action是Struts中的关键组件,...

    struts1 api 帮助文档

    Struts1是一个经典的Java Web开发框架,由Apache软件基金会维护,它主要负责处理MVC(Model-View-Controller)架构中的Controller部分。Struts1 API是开发者在使用该框架时的重要参考文档,提供了详细的类、接口和...

    Struts中文手册 免费分享

    5. **RequestProcessor**:处理请求的入口,它是Struts生命周期的第一步,负责初始化和调度ActionServlet。 6. **ActionForward**:表示请求转发的对象,用于定义请求处理后转向的页面或资源。 7. **Tiles**:...

    [摘]Struts 学习笔记之ActionForm

    ActionForm是Struts中用于接收和验证用户输入的数据的类。当用户通过表单提交数据时,这些数据会被封装到一个ActionForm实例中,然后由Struts框架将这个实例传递给对应的Action进行业务逻辑处理。ActionForm类通常...

    Spring中集成Struts的三种方式

    //第一种方式:使用 Spring 的 ActionSupport 类整合 Structs ...//第二种方式:使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor //第三种方式:将 Struts Action 管理委托给 Spring 框架

    struts之中文乱码问题

    &lt;controller processorClass="org.apache.struts.action.RequestProcessor"&gt; ``` 或者在ActionForm的子类中覆盖`getServletEncoding()`方法返回"UTF-8"。 3. **修改JSP页面**:确保每个JSP页面顶部有正确的...

    Struts中文手册

    在Struts中,Model代表业务逻辑,通常由JavaBeans实现;View负责数据显示,常用JSP页面;Controller通过ActionServlet协调Model和View,处理用户请求并调用相应的业务方法。 三、配置文件 1. struts-config.xml:这...

    Eclipse开发Struts1.2

    - FormBean是Struts中的模型组件,用于在视图和控制器之间传递数据。 - 在`struts-config.xml`中定义FormBean,并在Action类中使用get和set方法访问其属性。 11. **JSP页面**: - JSP页面负责显示数据和接收用户...

    struts1.x和struts2.x区别

    Struts1.x的配置相对静态,每个Action的请求处理器(RequestProcessor)配置在web.xml中,不易修改。而Struts2.x通过拦截器栈(Interceptor Stack)实现了动态配置,可以根据需要为不同Action配置不同的拦截器,大大...

    Struts中文预处理UTF-8

    综上所述,处理Struts中的中文预处理成UTF-8编码是一个涉及多个层面的过程,包括请求处理器、响应设置、配置文件调整以及客户端设置。通过细致的配置和编码设置,我们可以确保中文字符在Struts应用中得到准确无误的...

Global site tag (gtag.js) - Google Analytics