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
(面向切面编程)
本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1166343