分类: Java
2008-10-30 20:03:56
|
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对象作为参数传给他,由它来执行请求转发或者重定向。