/**
* 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 为转发,否则为重定向
*/
struts1执行过程(非上传)
猜你喜欢
转载自my.oschina.net/u/1264788/blog/318418
今日推荐
周排行