Struts2 的体系与 Struts1 体系的差别非常大,因为 Struts2 使用了 WebWork 的设计核心,而不是 Struts1 的设计核心。 Struts2 中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与 Servlet API 分离。
Struts2 框架的大概工作机制:



从图可以看出,一个请求在 Struts2 框架中的处理大概分为以下几个步骤:

1 、客户端初始化一个指向 Servlet 容器(例如 Tomcat )的请求;

2 、这个请求经过一系列的过滤器( Filter)( 过滤器中有一个 ActionContextCleanUp 可选过滤器,这个过滤器对于 Struts2 和其他框架的集成很有帮助);

3 、接着 FilterDispatcher 被调用, FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action

4 、如果 ActionMapper 决定需要调用某个 Action FilterDispatcher 把请求的处理交给 ActionProxy

5 ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调用的 Action 类;

6 ActionProxy 创建一个 ActionInvocation 的实例。

7 ActionInvocation 实例使用命令模式来调用,在调用 Action 的过程前后,涉及到相关拦截器( Intercepter )的调用。

8 、一旦 Action 执行完毕, ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果返回结果通常是(但不总是,也可能是另外的一个 Action 链)一个需要被表示的 JSP 或者 FreeMarke 的模版。在表示的过程中可以使用 Struts2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper

FilterDispatcher

FilterDispatcher 是运行在 Web 应用中的,负责拦截所有的用户请求,当用户的请求中有以 .action 结尾的,就会转到 Struts2 框架处理。最后根据具体的 action 的名来在 struts.xml 中调用哪一个 Action Struts2 真正用于处理用户请求的 Action 实例,并不是用户实现的业务控制器,而是 Action 代理 。因为用户实现的业务控制器完全与 Servlet API 解耦,所以它并不能处理用户的请求参数,而 Struts 提供了一系列拦截器,该系列拦截器负责将 HttpServletRequest 参数解析出来,传入到最后的用户定义的业务控制器中。这一系列过程其实就是典型的 AOP (面向切面编程)