Chinaunix首页 | 论坛 | 博客
  • 博客访问: 550275
  • 博文数量: 136
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1343
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 23:18
文章分类

全部博文(136)

文章存档

2011年(28)

2009年(60)

2008年(48)

我的朋友

分类: Java

2008-10-30 20:03:56

对于多应用模块的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对象作为参数传给他,由它来执行请求转发或者重定向。

转帖于:http://jdnis.javaeye.com/blog/230070

阅读(478) | 评论(0) | 转发(0) |
0

上一篇:Struts框架控制器及流程

下一篇:扩展Struts

给主人留下些什么吧!~~