Struts体系结构概况

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

Struts体系结构概况
Struts体系结构概况


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

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

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

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

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

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

6ActionProxy 创建一个 ActionInvocation 的实例。

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

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

FilterDispatcher

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



本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1166343