拦截器可以实现横切(crosscutting)功能并使这些实现相对action甚至Struts 2框架保持独立。这样可以使核心框架代码比以前更加简洁,且使开发人员更快捷地使用新框架的特性。实际上,松耦合机制意味着用户再也不用等着框架来实现他们所需的新特性;相反,它们可以实现和使用自己所需的特性且不用修改框架的底层源代码。
使用拦截器可以达到如下所描述的目的。
在调用action之前,提供预处理(preprocessing)逻辑。
与action进行交互,提供执行信息,比如受Spring管理的对象、设置action里的请求参数等。
在调用action之后,提供后处理(postprocessing)逻辑。
修改返回的结果,进而修改呈现给用户的内容。
捕获异常从而替换可执行的处理过程或返回一个不同结果。
很多Struts 2特性都是通过拦截器提供的。
表3-1 Struts 2框架提供的拦截器
拦 截 器 | 配 置 名 | 描 述 |
别名拦截器( Alias Interceptor ) | alias | 允许参数在跨越多个请求时使用不同别名,这个拦截器可将多个 action 使用不同名字链接起来,然后用于处理同一信息 |
链拦截器( Chaining Interceptor ) | chaining | 允许当前 action 能够使用上一个被执行 action 的属性,这个拦截器通常要和“ chain ”结果类型一起使用 |
多选框拦截器( Checkbox Interceptor ) | checkbox | 为没有被选定的多选框增加一个值为 false 的参数,协助管理多选框(在 HTTP 请求里,那些没有被选定的多选框通常是没有任何信息的) |
转换错误拦截器( Conversion Error Interceptor ) | conversionError | 将转换错误的信息(包括转换的字符串和参数类型等)存放到 action 的字段错误集里去 |
会话创建拦截器( Create Session Interceptor ) | createSession | 自动创建一个 HTTP 会话(如果不存在会话) |
调试拦截器( Debugging Interceptor ) | debugging | 为开发者提供几种不同调试界面 |
执行和等待拦截器( Execute and Wait Interceptor ) | execAndWait | 当 action 在后台执行时,给用户显示一个过渡性的等待页面 |
异常拦截器( Exception Interceptor ) | exception | 将 action 抛出的异常映射到结果,这样就通过重定向来自动处理异常 |
文件上传拦截器( File Upload Interceptor ) | fileUpload | 便于文件上传 |
国际化拦截器( Internatio- nalization Interceptor ) | i18n | 在用户会话中跟踪选定的区域( locale )信息 |
日志拦截器( Logging Interceptor ) | logger | 通过输出被执行 action 的名字,提供简单的日志功能 |
消息存储拦截器( Message Store Interceptor ) | store | 在会话中为 action 存储和检索消息、字段错误以及 action 错误,该拦截器要求 action 实现 ValidationAware 接口 |
模型驱动拦截器( Model Driven Interceptor ) | modelDriven | 将 action 的模型对象存放在栈里,该拦截器要求 action 实现 ModelDriven 接口 |
作用域模型驱动拦截器( Scoped Model Driven Interceptor ) | scopedModelDriven | 在 aciton 的配置作用域里存储和检索模型对象,该拦截器要求 action 实现 ScopedModelDriven 接口 |
参数拦截器( Parameters Interceptor ) | params | 在 action 里设置请求参数 |
参数过滤拦截器( Parameter Filter Interceptor ) | n/a | 控制 action 对参数的访问(非默认配置) |
(续)
拦 截 器 | 配 置 名 | 描 述 |
预备拦截器( Prepare Interceptor ) | prepare | 调用 action 的 prepare () 方法,该拦截器要求 action 实现 Preparable 接口 |
概要拦截器( Profiling Interceptor ) | profile | 允许 action 记录简单的概要信息日志 |
作用域拦截器( Scope Interceptor ) | scope | 在会话和应用作用域中存储和检索 action 的状态 |
Servlet 配置拦截器( Servlet Configuration Interceptor ) | servletConfig | 使 action 能访问 servlet 里的各种信息 |
静态参数拦截器( Static Parameters Interceptor ) | staticParams | 设置 action 里的静态定义值(通过 action 配置里的 param 标签来实现) |
角色拦截器( Roles Interceptor ) | roles | 只有在用户是配置的角色之一时才允许执行 action |
计时拦截器( Timer Interceptor ) | timer | 以执行 action 所花时间的形式,简单记录 action 概要信息 |
令牌拦截器( Token Interceptor ) | token | 检查 action 的合法令牌,以防止重复提交表单 |
令牌会话拦截器( Token Session Interceptor ) | tokenSession | 功能与令牌拦截器相同,但是对于非法令牌,提交的数据将保存在会话中 |
验证拦截器( Validation Interceptor ) | validation | 为 action 提供验证支持 |
工作流拦截器( Workflow Interceptor ) | workflow | 当验证失败时,不执行 action 然后重定向到 INPUT 视图 |
每个拦截器为action提供的特性都不一样。你可能已经猜到了,为action提供一个完备的执行环境需使用多个拦截器。为了便于使用,Struts 2允许创建拦截器栈(interceptor stack),由action来引用,而不是为每个action逐个配置所有拦截器。表3-2列出了所有Struts 2框架预配置好的栈,每个栈中包含多个拦截器。有一个很重要的问题必须注意,那就是拦截器是按照配置好的顺序来调用的。
表3-2 Struts 2框架提供的拦截器栈
已配置栈名 | 包含的拦截器 | 描 述 |
basicStack | exception 、 servletConfig 、 prepare 、 checkbox 、 params 、 conversionError | 如使用栈,最起码要使用这几个拦截器 |
validationWorkflowStack | basicStack 、 validation 、 workflow | 在基本栈的基础上增加验证和工作流特性 |
fileUploadStack | fileUpload 、 basicStack | 在基本栈的基础上增加文件上传特性 |
modelDrivenStack | modelDriven 、 basicStack | 在基本栈的基础上增加模型功能特性 |
chainStack | chain 、 basicStack | 在基本栈的基础上增加链接特性 |
i18nStack | i18n 、 basicStack | 在基本栈的基础上增加区域持久化特性 |
(续)
已配置栈名 | 包含的拦截器 | 描 述 |
paramPrepareParamsStack | exception 、 alias 、 params 、 servletConfig 、 prepare 、 i18n 、 chain 、 modelDriven 、 file- Upload 、 checkbox 、 staticParams 、 params 、 conversionError 、 vali- dation 、 workflow | 提供包括前 action ( pre-action )方法调用的完整栈。 params 栈使用两次:第一次是在调用 prepare() 方法之前提供参数,第二次是在预备阶段为可能被检索的对象重新使用参数 |
defaultStack | exception 、 alias 、 servlet- Config 、 prepare 、 i18n 、 chain 、 debugging 、 profiling 、 scoped- ModelDriven 、 modelDriven 、 fileUpload 、 checkbox 、 static- Params 、 params 、 conversion- Error 、 validation 、 workflow | 提供一个完整栈,包括调试和概要 |
executeAndWaitStack | execAndWait 、 defaultStack 、 execAndWait | 提供执行与等待栈,比如在上传文件时需要向用户显示一个等待页面时,就可以使用这个栈 |