文章目录
- 请求处理流程图
- 流程说明
请求处理流程图
流程说明
第 1 步:
客户端初始化一个指向 Servlet
容器(例如 Tomcat
)的请求,例如:在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action
就是提交一个HttpServletRequest
请求。
请求会被 Tomcat
接收到,Tomcat
服务器来选择处理这个请求的 Web 应用,那就是由 helloworld
这个 web 工程来处理这个请求。
第 2 步:
Web 容器会去读取 helloworld 这个工程的 web.xml,在 web.xml 中进行匹配,最后发现需要经过一堆的过滤器。
这个请求经过一系列的过滤器(Filter),例如:ActionContextCleanUp
、其他过滤器(SiteMesh
等)、FilterDispatcher
注意:
这里是有顺序的,先 ActionContextCleanUp
,再其它过滤器,最后FilterDispatcher
。FilterDispatcher
是Struts 2 的调度中心,是 Struts 2 的控制器的核心,也就是 Struts 2 框架中的控制层(Controller
)的核心
FilterDispatcher
必须放在滤器链的最后,如果在 FilterDispatcher
前出现了如SiteMesh
这种特殊的过滤器,还必须在 SiteMesh
前引用 Struts 2 的ActionContextCleanUp
过滤器。
Struts 2.1.3 版本后核心控制器 FilterDispatcher
被弃用了,替换成 StrutsPrepareAndExecuteFilter
,因为 FilterDispatch
在执行 Action
之前不能插入自定义的过滤器, 而 StrutsPrepareAndExecuteFilter
可以在执行 Action
之前添加自己的过滤器。如果要使用 ActionContextCleanUp
,则可以通过StrutsPrepareFilter
和 StrutsExecuteFilter
进行替换。
扩展:
Struts 2 的核心控制器 FilterDispatcher
,有 3 个重要的方法:destroy()
、doFilter()
、init()
,执行顺序是:init()
⟹ doFilter()
⟹ destroy()
第 3 步:
接着 FilterDispatcher
被调用,即容器会创建 FilterDispatcher
实例,然后调 doFilter()
方法,在这个方法中,FilterDispatcher
询问 ActionMapper
是否需要调用某个 Action
来处理这个(HttpServletRequest
)请求,如果 ActionMapper
决定需要调用某个 Action
,ActionMapper
会通知 FilterDispatcher
需要处理这个请求,FilterDispatcher
会停止过滤器链以后的部分,(这也就是为什么 FilterDispatcher 应该出现在过滤器链的最后的原因)。FilterDispatcher
则把请求的处理交给 ActionProxy
,即建立一个 ActionProxy
实例,这个对象作为Action
与 xwork
之间的中间层,会代理 Action
的运行过程。
第 4 步:
ActionProxy
通过 ConfigurationManager
询问框架的配置文件(struts.xml
),找到需要调用的 Action
类
注意:
在服务器启动的时候,ConfigurationManager
就会把 struts.xml
中的所有信息读到内存里,并缓存,当 ActionProxy
带着 URL
向他询问要运行哪个 Action
的时候,就可以直接查找并返回
第 5 步:
ActionProxy
创建一个 ActionInvocation
实例,同时 ActionInvocation
通过代理模式调用 Action
。但在调用之前,ActionInvocation
会根据配置加载 Action
相关的所有 Interceptor
(拦截器),即调用 Action
的过程前后,涉及到相关拦截器的调用
第 6 步:
一旦 Action
执行完毕,ActionInvocation
负责根据 struts.xml
中的配置找到对应的返回结果 result
。返回结果通常是一个需要被表示的 JSP
或者 FreeMarker
的模版(不一定是页面,也可能是另外的一个 Action
链)。在表示的过程中可以使用 Struts 2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper
。
第 7 步:
最后,ActionInvocation
对象倒序执行拦截器。ActionInvocation
对象执行完毕后,已经得到响应对象(HttpServletResponse
)了,最后按与过滤器配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果,即通过 HTTPServletResponse
返回客户端一个响应。