Struts Gossip: 简介 RequestProcessor
2009-02-19 17:00
162 查看
在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;
}
// 判断 <action> 标签的 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。
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;
}
// 判断 <action> 标签的 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。
相关文章推荐
- 【Struts】简介1 Strtus 运行机制:
- Struts2.0的标签库(简介)
- Struts旅程(一)Struts简介和原理
- 笔记1--struts简介及环境配置
- struts2.0的标签库(简介)
- struts-menu 简介
- struts2.0的标签库(简介)
- Struts中Tiles标签简介
- Struts相关jar包简介
- Struts 1 简介 执行流程 以及demo
- Struts2.0 (开发之一)--简介与简单登录的实现--CTO
- Struts1框架简介
- Struts中Title标签简介
- struts下载安装包,其安装包简介
- struts笔记000:struts简介
- struts ActionMessage简介
- Jakarta Struts简介(一)
- 【Struts】简介2strtus1 与strtus2 的区别
- 【Struts】简介信息
- Struts简介(个人见解)