原文:http://www.cublog.cn/u2/86974/showart_1742729.html
拦截器(Interceptor)是Struts 2的核心组成部分。拦截器几乎完成了Struts2框架70%的工作,包括解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传……,Struts2设 计的灵巧性,更大程度地得益于拦截器设计,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可;如果不需要该 功能时,也只需要取消该拦截器的配置即可。这种可插拔式的设计,正是软件设计领域一直孜孜以求的目标。
实际上,Struts2的精髓就在于拦截器,掌握了Struts2的拦截器机制,你就可以说精通了Struts2。从某个角度来看,我们可以把Struts2框架理解成一个空壳,而这些拦截器像一个一个抽屉,随时可以插进入,也可以拔出来——这是软件产品一直追求的目标。
如果你喜欢,你可以把Struts2的全部插件拔出,那么Struts2就成了一个空容器——而这种空,正是 Struts2的魅力,你可以把任何自己想要的东西填入进去,甚至包括自己完全实现这个框架。另一方面,因为Struts2的插件机制,Struts2提供了无限扩展的可能性,你可以把自己想要的任何东西做成插件,然后填入Struts2——这样的结果是:一个企业,一个团队,可以把自己业务相关的东西做成插件,随时随地地复用。也就是说:如果你想要,你可以把Struts2改造成属于自己的框架。
在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在 Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方 式。
Struts 2 拦截器原理
读者可以通过 Struts 2 官方文档说明来理解拦截器,如果读者具有较强的英文阅读能力,建议查阅官方使用文档( http://struts.apache.org/2.0.11/docs/interceptors.html )。如图 所示,是拦截器在 Struts 2 中的示意图。
从图 所示内容中可以看出, Struts 2 架构的 Action 被一个或者多个拦截器(拦截器栈)所包围,所有的用户请求都会被拦截器所拦截,然后交给 Action 处理,处理结果以逻辑视图方式返回给用户。而这个调用执行流程,是由 Struts 2 的配置文件来实现的,后面会详细介绍。拦截器是 Struts 2 核心部分之一。
当用户请求到达 Struts 2 的 ServletDispatcher 时, Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表( List ),最后一个一个地调用列表中的拦截器。拦截器时序图如图 5 所示。
在 Struts 2 架构中, Action 的调用都是通过拦截器来实现的。有的读者可能会疑惑,前几章的介绍中,没有明确说明拦截器,为什么可以直接调用 Action ?那是因为 Struts 2 架构如果不做显式的拦截器配置,则系统会调用默认的拦截器来调用 Action ,在用户看来,好像没有配置拦截器。系统默认的拦截器笔者后面会详细介绍。
HelloWorld 拦截器
读者可以按照笔者的步骤,一步一步建立第一个拦截器示例,来体验 Struts 2 框架中拦截器带给读者的惊喜。
(1) 在配置文件中增加拦截器定义和在 Action 中声明拦截器。笔者建立了一个目录 ch5 来对应本章, ch5.xml 配置文件内容如代码 5.8 所示。
代码 5.8 HelloWorld 拦截器配置文件












































★ 注意 ★
需要读者在 struts.xml 文件中使用 <include file="/ch5/ch5.xml"></include> 将该配置文件包含进去。
(2) 在 ch5 包内建立一个拦截器类 Myintercepor ,如代码 5.9 所示。
代码 5.9 Helloworld 拦截器类 Myintercepor































(3) 在 ch5 包内建立一个业务控制器 Reg ,如代码 5.10 所示。
代码 5.10 HelloWorld 拦截器示例的业务控制器

















































































































(4)同样在 ch5 包内,建立一个用户注册 reg.jsp 文件和一个用于显示注册成功信息的 success.jsp 文件。内容分别如代码 5.11 和代码 5.12 所示。
代码 5.11 用户注册界面 reg.jsp





































代码 5.12 注册成功界面 success.jsp






























(5) 启动 Tomcat 服务器,在浏览器中输入: http://localhost:8080/bookcode/ch5/reg.jsp ,运行界面如图 所示。
(6)读者可以在“用户名”、“密码”、“确认密码”和“生日”输入框中填入相关字符串,单击“注册”按钮,会发现 Tomcat 控制台输出如下信息:
… …
信息 : Detected AnnotationActionValidatorManager, initializing it...
拦截器信息: HelloWorld 拦截器!
Action 信息:正在执行 Actiion... ...
拦截器信息: Action 执行完毕!
… …
到此为止,第一个拦截器 HelloWorld 示例就建立成功了,读者通过本示例,可以了解拦截器的基本功能。
★ 说明 ★
Struts 2 框架提供的拦截器功能确实给项目开发提供了一个非常有用的手段。后面笔者将会逐步深入介绍 Struts 2 的拦截器。