`

【转&批注】Struts1 控制流程

阅读更多

目前正在看Struts的源码,希望有一天能写出其中的接收转发的完整功能。
不小心看到下面的文字,感觉不错,就转过来了。
同时,有颜色的字体是我自己对其做的笔记。

 

 

Struts1.2依然是应用很广的框架,熟悉其基本的控制流程是必要的:
[
目前最新式1.3,但是也是08年更新的了。没办法,Apache已经全面停止对Struts1的更新了。]

一、ActionServlet的初始化

ActionServlet
作为Struts组件的前端控制器,由于web.xml的相应配置:

<load-on-startup>0</load-on-startup>

在应用一加载时即会被实例化并调用其init方法,init方法所做的主要工作有二:

1.
加载struts配置文件,并创建用于封装配置信息的ModuleConfig对象 
2.
加载资源文件,并创建用于封装资源文件的MessageResources对象 
需要注意两点:如果web.xml有多模块配置,将创建多个ModuleConfig对象和MessageResources对象分别用于封装各个模块的struts配置文件和资源文件。 
针对各个模块所创建的ModuleConfig对象和MessageResources对象将存储在ServletContext中,对应的属性名中有该模块名称的相应标识。 
另外,如果有相应配置的话,init方法还将初始化数据源和PlugIn

二、ActionServletprocess

所有形如*.do的请求(根据web.xml中的相关配置)将提交给ActionServlet,最终将调用其process方法。process方法的主要工作有三:
[ActionServlet
自身也有一个process()方法,作用是选择相应的Module进行处理。然后new一个RequestProcessor实例,并调用这个实例的process()方法]


1.
根据请求信息获知所请求的模块名称,从ServletContext中获得与请求模块对应的的ModuleConfig对象,并存储到request中。 
2.
根据模块信息获得相应的RequestProcessor对象,一个模块对应一个RequestProcessor对象,RequestProcessor对象将关联与所属模块对应的ModuleConfig对象。 
3.
调用RequestProcessor对象的process方法,将requestresponse作为参数传递给它。 


三、RequestProcessorprocess

RequestProcessor
对象的process方法的主要工作有五步:

1.
调用自己的 processPreprocess(request, response)方法,该方法不进行任何操作,用于子类重写扩展其功能。 

[该方法里面只有一条语句 return(true); 1.3的版本中,我没有在该process()方法里面看见对他的调用。在1.3版本中,第一步是获取映射的path。具体哪个path我不确定,不过觉得应该是对应着struts-config.xml中的<action>标签里面的type属性的值。获取path之后,处理一下其他的属性,比如localecontenttypenocache并检验是否已经预处理。]
2.
获得与请求地址所匹配的ActionMapping对象,AcionMapping对象用于封装一个特定action的配置信息。 
3.
根据ActionMapping中的配置信息获得ActionForm对象(该对象将缓存到requestsession中),并将表单数据填充到ActionForm中,然后根据ActionMapping的配置决定是否验证ActionForm,如果验证,将调用ActionFormvalidate方法,若其返回的ActionErros对象中包含ActionMessage对象则表示验证失败,将转向action配置信息input属性所指示的地址。 
4.
如果ActionForm无需验证或验证通过将创建并缓存与请求地址匹配的Action对象,将ActionMapping对象、ActionForm对象、requestresponse [以及Action对象] 作为参数调用其execute方法。 
5.
根据Action对象的execute方法返回的ActionForward对象,将请求转发或重定向到该ActionForward所封装的地址。 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics