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。

-----------------------------------------------------------

 

ActionServlet类对应的类名为org.apche.struts.action.ActionServlet,它是struts框架的 核心控制器组件,所有用户的请求都先由ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。 Struts只允许一个应用中配置一个ActionServlet,但是可以将ActionServlet扩展
扩展是通过写自己的servelt来继承actionservlet
平时写程序的时候,一般只对action来写,其实acitonservlet是真正的控制器.

扩展完后,在web.xml文件中如下配置:把servlet改成自己的servlet
<servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>sample.ExtendedActionServlet</servlet-class>
</servlet>

<servlet-mapping>
       <servlet-name>sample</servlet-name>
       <url-pattern>/action/*<url-pattern>
//上面的/action/*表示负责处理所有以/action为前缀的URL,后面的/表示转义
<servlet-mapping>
============================================


首先是在<servlet-mapping>中<url-pattern>找到<servlet-name>
再<servlet>中<servlet-name>找到<servlet-class>
是这么一个actionservlet的配置过程
****************************************************************************
在struts1.2中actionservlet许多的功能都移植到了RequestProcessor中.所以,要扩展struts,没必要对ActionServlet扩展,只需对RequestProcessor扩展.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值