Struts1.3源码学习笔记(一)——ActionServlet(1)

ActionServlet在Struts中扮演Controler,也可以算是说整个Struts的处理中枢。客户端通过浏览器(或者其他表示层交互手段)想服务端提交一个request,提交的表单数据会被封装在一个ActionForm中,通常需要对每个form定义一个ActionForm,所有的request都会被ActionServlet拦截到,Action根据struts-config.xml文件中的Action配置信息,将request分发到相应得Action上,每个Action调用相应业务功能模块,处理业务请求,然后返回一个ActionFoward,ActionServlet根据返回的ActionForward控制转向到相应的视图曾显示,返回给客户端。

初始化过程:
1.initInternal(),处理资源绑定,返回一个MessageResources类实例
2.initOther(),初始化其它的全局描述符。
    1)调用getServletConfig().getInitParameter("config")获取Servlet初始化参数--在web.xml中初始化参数config的值就是struts的配置文件,默认为为/WEB-INF/struts-config.xml,。
3.initServlet(),初始化Servlet映射,通过使用apache commons Digester来处理web.xml
4.initChain(),处理chainConfig中的配置,默认配置文件为org/apache/struts/chain/chain-config.xml。(还不太明白做什么用)。
5.在ServletContext中添加该Servlet
6.initModuleConfigFactory(),初始化模块配置工厂,从web.xml获取工厂类配置初始化参数(可选,默认为org.apache.struts.config.impl.DefaultModuleConfigFactory)configFactory。
7.调用initModuleConfig("",config)获得需要的初始化模块配置,返回一个ModleConfig实例。
    1).首先调用 ModuleConfigFactory.createFactory()创建上步设置的工厂
    2).调用工厂的createModuleConfig(String prefix)方法创建一个MoudleConfig(注:该方法是抽象方法,有具体的工厂类实现)
    3).调用initConfigDigester()获取一个Digester实例。
    4).调用splitAndResolvePaths(paths)处理包含的多个配置文件的路径信息
    5).对于每个url使用digester进行处理
    6).将该moudleConfig添加到context中,并返回MoudleConfig的实例
8.调用initModuleMessageResources()处理MoudleConfig的MessageResources信息
9.调用initModulePlugIns()处理插件
10.调用initModuleFormBeans()处理FormBeans配置信息
11.调用initModuleForwards()处理Forward配置信息
12.调用initModuleExceptionConfigs()处理异常配置信息
13.调用initModuleActions()处理Action配置信息
14.调用MoudleConfig.freeze()方法冻结该MoudleConfig实例,即模块的配置信息,从此之后不允许修改该配置信息。

ActionServlet类处理流程
1.继承自HttpServlet
2.doGet,doPost均调用process()方法处理请求
3.process()方法从配置文件中获得一个RequestProcessor对象实例,调用其process()方法进行处理
4.process()首先从请求中获得path路径,用于查找配置信息(如果path为空,直接返回null)
5.调用processMapping()从配置文件中返回一个AcitonMapping(如果返回空,直接退出)
6.调用processRoles()用于验证当前用户是否有权执行该Action
7.调用processActionForm()从mapping中获得ActionForm:
    1).调用工具类RequestUtils.createActionForm()创建ActionForm
        a.在createActionForm()中首先判断是否为该Action配置了ActionForm
        b.调用ActionMapping的getName()方法获得ActionForm的名字
        c.调用findFormConfig()获得该ActionForm的配置信息
        d.调用lookupActionForm()在作用域内查找是否已经存在该ActionForm的实例,如果有并且允许复用,直接返回该实例。
        e.调用createActionForm()创建ActionForm,返回ActionForm,(该过程涉及动态ActionForm和BeanActionForm)
    2).根据作用域(有效期)不同,添加ActionForm实例到request属性中,默认为Session,需要显示设置为request作用域
    3).返回该ActionForm实例
8.调用processPopulate()
9.调用processValidate()对ActionForm中数据进行验证。
10.调用processForward处理mapping中的转发
11.调用processActionCreate()创建action
12.调用processActionPerform()获得一个ActionForward.
13.调用processForwardConfig()处理ActionForward。

你可能感兴趣的:(apache,struts,servlet,session,action,Path)