[SSH] Struts2的工作流程
Struts2在Struts的基础上 有了很多的优点 具体的不同 可以参考另一边博文-> Struts2与Struts1的比较
首先整理列出响应流程先后中的一些名词:
(1)过滤器(Filter):过滤器,接收到Url的时候就会产生作用。
(2)StrutsPrepareAndExecuteFilter(2.1.3之前用的是FilterDispatcher):名字已经很能说明问题了,prepare与execute,前者表示准备,可以说是指filter中的init方法,即配制的导入;后者表示进行过滤,指doFilter方法,即将request请求,转发给对应的 action去处理。
(3)ActionProxy:ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。归根到底,最后调用的是DefaultActionInvocation.invokeAction()方法。
(4)ConfigurationManager:一般是读取struts.xml。
(5)ActionInvocation:为每一个Action产生一个实例,进行调度。
(6)Interceptor : 同样作为拦截器,只对Action产生作用。
流程图示(对通用图的一个改进):
文字描述:
(1)客户端初始化一个指向Servlet容器(如Tomcat)的request请求。
(2)容器通过web.xml映射获得相应控制器的名字。
(3)请求首先经过一系列的过滤器(ActionContextCleanUp等)。
(4)接下来调用控制器StrutsPrepareAndExecuteFilter,通过ActionMapper获得是否要调用某个Action。
(5)将权力转交给ActionProxy,来处理相应的requset。
(6)ActionProxy通过ConfigurationManager在struts.xml中找到对应的Action信息和相应的Interceptor Stack信息。
(7)ActionProxy创建以个ActionInvocation实例。
(8)ActionInvocation采用命名模式来调用相应的Action,其中按照Interceptor Stack信息先后调用拦截器。
(9)根据Action的配置信息,对request产生result。
(10)result反向通过Interceptor返回给ActionInvocation。
(11)ActionInvocation产生一个HttpServletResponse相应。
(12)将相应发送给客户端。