struts1执行过程(非上传)

/**
* tomcat启动时,首先执行ActionServlet的init方法,生成两个map容器
*         第一个map为actionConfigs,用来存储ActionMapping对象(即整个<action-mapping>里的)
*             key值为path对应的值,value值为 new ActionMapping()
*        第二个map为formBeans,用来存储FormBeanConfig对象(即整个<form-beans>里的)
*             key值为name对应得值,value值为 new FormBeanConfig()
* 页面发请求,tomcat根据web.xml配置,把请求交给ActionServlet处理。
* ActionServlet拿到请求执行doPost()方法,通过doPost进入process()方法创建RequestProcessor对象
*         通过RequestProcessor对象调用其process()方法进行处理。
* 在process方法中首先通过processPath()方法来获取path对应的值
*         (path即为struts-config.xml中<action>标签中的path属性,
*            但这里是截取URL信息来获得path与<action>中的进行对比)
*     通过processLocale()处理国际化
* 在通过processMapping()方法需要传入上面获得的path,来获得ActionMapping对象mapping
*         根据path值从开始初始化的map容器actionConfigs中获取ActionMapping对象
* 在通过processActionForm()方法需要传入上面获得mapping,来获得ActionForm对象form
*         在processActionForm()方法中先通过RequestUtils.createActionForm()获取ActionForm instance
*             在createActionForm()方法中首先获取attribute属性值
*            (attribute与属性name是一样的,在获取attribute时如果没有配置,就会去找name属性)
*                 再通过lookupActionForm()查看scope属性对应的值中是否存在对应的ActionForm对象
*                 如果存在对应的ActionForm就返回,如果不存在就通过createActionForm()方法来创建ActionForm返回
*             获得instance后,再把instance放入scope属性对应的值中,默认为session,然后返回instance给form
* 再通过processPopulate()方法需要传入mapping、form进行表单数据的收集  (在非上传情况下)
*         在processPopulate方法中先通过form.reset()清空将要用来装表单数据的容器
*         在进入RequestUtils.populate()方法中进行数据的收集
*             先创建一个map容器properties用来装表单数据,然后创建一个Enumeration容器names
*             通过request.getParameterNames()把数据名称放入names中,然后开始循环迭代names
*             获得name并保存在stripped,创建一个Object parameterValue
*                 通过request.getParameterValues(name)把数据值保存在其中
*             最后把数据存入map容器properties中,key值为stripped,value值为parameterValue
*             最后通过BeanUtils.populate(bean,properties)方法进行数据注入,
*                 bean为对应的ActionForm,方法中会进行数据类型转换
* 再通过processActionCreate()方法需要传入mapping,来获得Action对象action
*         先通过<action>中的type属性获得className    (actions为HashMap对象 key=type  value=action对象)    
*         在actions中查找key为className的Action对象,如果存在,则返回该对象
*         如果不存在则通过RequestUtils.applicationInstance(className)方法创建一个Action对象,
*             放入actions中并返回该对象(applicationInstance(className)通过java反射机制创建相应的Action对象)
* 再通过processActionPerform()方法执行Action对象,需传入action,form,mapping
*         在方法中直接开始调用action中的execute()方法开始执行
*          如果execute抛出异常,则进入processException()方法中进行异常处理
*             先封装mapping中的<exception>标签,是通过<exception>中的type属性找到
*                 对应的<exception> 封装到ExceptionConfig config中
*             然后获取ExceptionHandler对象,通过config.getHandler()
*             再执行handler的execute方法
*                 先通过config.getPath获取跳转路径(如果没有配置,则找mapping的input属性)来创建ActionForward
*                 再通过config.getKey获取的值在国际化文件中找到对应的配置语句,
*                     通过从抛过来的Exception中获得message来填充占位符,生成ActionMessage对象error
*                 然后将error放入scope中名称Globals.ERROR_KEY 默认是session中
*                 最后返回forward
* 最后通过processForwardConfig()方法处理转向信息开始页面跳转
*         通过<action>下的<forward>中的path属性得到目标地址forwardPath
*         再得到Redirect属性,默认为false 为转发,否则为重定向
*/

猜你喜欢

转载自my.oschina.net/u/1264788/blog/318418