struts-RequestProcessor

对于多应用模块的Struts应用,每个子应用模块都有各自的RequestProcessor实例。当子应用模块被选择时,就会调用子应用模块的RequestProcessor实例的process()方法来处理请求。

(1)RequestProcessor类的process()方法

Public void process(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletEXception{ 
request = processMultipart(request);
// Identify the path component we will use to select a mapping
String path = processPath(request,response);
if(path == null){
return;
}
if(log.isDebugEnabled()){
log.debug(“Processing a ” +request.getMethod()+”’ for path ‘”+path+”’”);
}
//Select a Locale for the current user if requested processLocale(request,response);
//set the content type and no-caching headers if requested processContent(request,response);
processNoCache(request,response);
//General perpse preprocessing hook
if(!processPreprocess(request,response)){ return; }
//Identify the mapping for this request
ActionMapping mapping = processMapping(request,response,path);
if(mapping == null){ return; }
//Check for any role request to perform this action
if(!processRoles(request,response,mapping){ return; }
//process any ActionForm bean related to this request ActionForm form = processActionForm(request,response,mapping);
processPopulate(request,response,form,mapping);
if(!processValidate(request,response,form,mapping){ return; }
//process a forward or include specified by this mapping
if(!processForward(request,response ,mapping){ return; }
if(!processInclude(request,response ,mapping){ return; }
//create or acquire the Action instance to process this request
Action action = processActionCreate(request,response ,mapping);
if(action == null){ return; }
//call the Action instance itself
ActionForward forward = processActionPerform(request,response,action,form,mapping);
//process the returned ActionForward instance
processForwardConfig(request,response,forward);
}


RequestProcessor类的process()方法依次执行的流程
<1>调用processMultipart():如果HTTP请求方式为POST,并且请求的contentType属性以“multipart/form-data”开头,标准的HttpServletRequest对象将被重新包装,以方便处理”multipart”类型的HTTP请求。如果请求方式为”GET”,或者contentType属性不是”multipart”,就直接返回原始的HttpServletRequest对象
<2>调用processPath():获得请求URI的路径,这一信息可以用于选择合适的Struts Action 组件
<3>调用processLocale():当ControllerConfig对象的locale属性为true,将读取用户请求中包含的Locale信息,然后把Locale实例保存在session范围内
<4>调用processContent():读取ControllerConfig对象的contentType属性,然后调用response.setContentType(contentType)方法,设置响应结果的文档类型和字符编码。
<5>调用processNoCache():读取ControllerConfig对象的nocache属性,如果nocache==true,在响应结果中将加入特定的头参数
<6>调用processPreprocess():该方法不执行任何操作,直接返回true,子类可以覆盖这个方法,执行客户化的预处理请求操作
<7>调用processMapping():寻找和用户请求的URI匹配的ActionMapping,如果不存在,就返回错误的消息
<8>调用processRoles(): 先判断是否为Action配置了安全角色,如果配置了安全角色,就调用isUserInRole()方法判断当前用户是否具备必需的角色,如果不具备,就结束处理流程,返回错误信息。
<9>调用processActionForm(): 先检查是否为ActionMapping配置了ActionForm,如果是,则找出该实例,如果不是,则创建该实例,并且保存在适当的范围中
<10>调用processPopulate(): 如果ActionMapping配置了ActionForm实例,就先调用它的reset()方法,再把数据装到ActionForm中
<11>调用processValidate(): 如果ActionMapping配置了ActionForm,并且ActionMapping的validate属性为true,就调用ActionForm的validate()方法,如果validate()方法返回的ActionErrors对象包含ActionMessage对象,说明表单验证失败,就把ActionErrors对象存储在request范围内,再把请求转发到ActionMapping的input属性指定的Web组件。要是验证成功,就继续下面的流程
<12>调用processForward(): 判断是否在ActionMapping中配置了forward属性,如果配置了就调用RequestDispatcher的forward()方法,请求流程结束,否则继续下一步。 <13>调用processInclude(): 判断是否在ActionMapping中配置了include属性,是的话接调用RequestDispatcher的include()方法,流程结束,否则继续下一步
<14>调用processActionCreate():先判断Action缓存中是否存在这个Action的实例,如果不存在就创建一个Action实例,并且保存在Action缓存中。
<15>调用processActionPerform():该方法再调用Action实例的execute()方法
<16>调用processActionForward():把Action的execute()方法返回的ActionForward对象作为参数传给他,由它来执行请求转发或者重定向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值