转自:http://book.51cto.com/art/200904/118552.htm
拦截器介绍
拦截器可以实现横切(crosscutting)功能并使这些实现相对action甚至Struts 2框架保持独立。这样可以使核心框架代码比以前更加简洁,且使开发人员更快捷地使用新框架的特性。实际上,松耦合机制意味着用户再也不用等着框架来实现他们所需的新特性;相反,它们可以实现和使用自己所需的特性且不用修改框架的底层源代码。
使用拦截器可以达到如下所描述的目的。
在调用action之前,提供预处理(preprocessing)逻辑。
与action进行交互,提供执行信息,比如受Spring管理的对象、设置action里的请求参数等。
在调用action之后,提供后处理(postprocessing)逻辑。
修改返回的结果,进而修改呈现给用户的内容。
捕获异常从而替换可执行的处理过程或返回一个不同结果。
很多Struts 2特性都是通过拦截器提供的。表3-1列出了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 | 提供执行与等待栈,比如在上传文件时需要向用户显示一个等待页面时,就可以使用这个栈 |