文章目录
- 请求处理流程图
- 流程说明
请求处理流程图

流程说明
第 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 返回客户端一个响应。