RequestProcessor详解

本文详细解析了Struts框架中的核心控制器ActionServlet及其处理流程,包括如何通过RequestProcessor处理请求,以及如何定制自己的控制器。

Struts中,担任MVC/Model 2控制器角色核心的是ActionServlet,所有的请求都必须先通过它,在Struts 1.1中,有关于请求的处理大部份已交由RequestProcessor,当ActionServlet收到GETPOST的请求,其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来定义自己的控制器请求处理意义已经不大,通常的目的是重新定义ActionServletinit()方法,增加自己的初始化动作:

代码:

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); 

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


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

if(processInclude(request, response, mapping)) { 
return; 


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


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

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



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

代码:

<controller 
contentType="text/html;charset=Big5" 
locale="true" 
nocache="true" 
processorClass="onlyfun.caterpillar.CustomRequestProcessor"/>



Struts 1.1中,新增了<controller>卷标,它用于指定给ActionServlet的一些参数,在Struts 1.1之前,这些参数是在<init-params>中加以指定,使用<controller>卷标,应用程序中不同的模块也可以指定各自的参数给ActionServlet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值