3.2.2 拦截器介绍
拦截器可以实现横切(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
|
提供执行与等待栈,比如在上传文件时需要向用户显示一个等待页面时,就可以使用这个栈
|
Struts2(XWork)提供的拦截器的功能说明:
拦截器
|
名字
|
说明
|
Alias Interceptor
|
alias
|
在不同请求之间将请求参数在不同名字件转换,请求内容不变
|
Chaining Interceptor
|
chain
|
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
|
Checkbox Interceptor
|
checkbox
|
添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
|
Cookies Interceptor
|
cookies
|
使用配置的name,value来是指cookies
|
Conversion Error Interceptor
|
conversionError
|
将错误从ActionContext中添加到Action的属性字段中。
|
Create Session Interceptor
|
createSession
|
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
|
Debugging Interceptor
|
debugging
|
提供不同的调试用的页面来展现内部的数据状况。
|
Execute and Wait Interceptor
|
execAndWait
|
在后台执行Action,同时将用户带到一个中间的等待页面。
|
Exception Interceptor
|
exception
|
将异常定位到一个画面
|
File Upload Interceptor
|
fileUpload
|
提供文件上传功能
|
I18n Interceptor
|
i18n
|
记录用户选择的locale
|
Logger Interceptor
|
logger
|
输出Action的名字
|
Message Store Interceptor
|
store
|
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
|
Model Driven Interceptor
|
model-driven
|
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
|
Scoped Model Driven
|
scoped-model-driven
|
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
|
Parameters Interceptor
|
params
|
将请求中的参数设置到Action中去。
|
Prepare Interceptor
|
prepare
|
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
|
Scope Interceptor
|
scope
|
将Action状态存入session和application的简单方法。
|
Servlet Config Interceptor
|
servletConfig
|
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
|
Static Parameters Interceptor
|
staticParams
|
从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。
|
Roles Interceptor
|
roles
|
确定用户是否具有JAAS指定的Role,否则不予执行。
|
Timer Interceptor
|
timer
|
输出Action执行的时间
|
Token Interceptor
|
token
|
通过Token来避免双击
|
Token Session Interceptor
|
tokenSession
|
和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
|
Validation Interceptor
|
validation
|
使用action-validation.xml文件中定义的内容校验提交的数据。
|
Workflow Interceptor
|
workflow
|
调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
|
Parameter Filter Interceptor
|
N/A
|
从参数列表中删除不必要的参数
|
Profiling Interceptor
|
profiling
|
通过参数激活profile
|