Struts2的执行流程:
1-1:一个请求过来,走前端控制器StrutsPrepareAndExecuteFilter
前端控制器是一个过滤器,过滤器中有doFilter()方法,在这个方法中,
首先处理了字符集,然后将request和response放到ThreadLocal,表示线程安全
1-2:接下来判断是否是一个.action请求,如果不是直接跳转视图;否则继续走struts的流程
1-3:判断ActionMapping对象是否为空,为空转向视图;不为空,继续走struts的流程
1-4:创建ActionProxy代理对象,在创建代理对象的时候,创建了一个struts2的核心对象ActionInvocation,ActionInvocation贯穿了 整个struts的执行流程,代理、目标action、拦截器、结果都在ActionInvocation的成员变量位置
1-5:代理对象调用init方法进行初始化,在init方法中创建了目标action,在创建目标action的时候,使用了struts的ObjectFactory
1-6:将创建好的action赋值给ActionInvocation对象的成员变量
取出默认的20个拦截器,放到ActionInvocation的迭代器上
1-7:ActionProxy代理执行execute方法
ActionInvocation的invoke方法会被调用
调用20个拦截器,拦截器执行完毕之后,调用目标action的execute()方法
目标action的execute()方法执行结束之后,返回一个字符串,根据这个字符串,
struts的ObjectFactory对象会封装一个Result对象,result指向了具体的视图
拦截器出栈,response响应给浏览器