Struts2 框架中内置了许多拦截器,这些拦截器以 name-class 对的形式配置在 struts-default.xml 文件中,其中,name 是拦截器的名称,也就是引用的名字;class 指定了该拦截器所对应的实现。
只要自定义的包继承了 Struts2 的 struts-default 包,就可以使用包中定义的内建拦截器,否则需要自行定义拦截器。
在 struts-default.xml 中,每一个拦截器都具有不同的意义,如表 1 所示。
名 称 | 说 明 |
---|---|
alias | 在不同请求之间将请求参数在不同名称间转换,请求内容不变 |
autowiring | 用于实现 Action 的自动装配 |
chain | 让前一个 Action 的属性可以被后一个 Action 访问,现在和 chain 类型的 result() 结合使用 |
conversionError | 将错误从 ActionContext 中添加到 Action 的属性字段中 |
cookies | 使用配置的 Name 和 Value 指定 Cookies |
cookieProvider | 该类是一个 Cookie 工具,方便开发者向客户端写 Cookie |
clearSession | 用于清除一个 HttpSession 实例 |
createSession | 自动创建 HttpSession,用于为需要使用 HttpSession 的拦截器服务 |
debugging | 提供不同的调试用的页面展现内部的数据状况 |
execAndWait | 在后台执行 Action,同时将用户带到一个中间的等待页面 |
exception | 将异常定位到一个画面 |
fileUpload | 提供文件上传功能 |
il8n | 记录用户选择的 locale |
logger | 输出 Action 的名称 |
model-driven | 如果一个类实现了 Model Driven,将 get Model 得到的结果放在 Value Slack 中 |
scoped-model-driven | 如果一个 Action 实现了 ScopedModelDriven,则这个拦截器会从相应的 Scope 中取 出 model 调用 Action 的 setModel 方法,将其放入 Action 内部 |
params | 将请求中的参数设置到 Action 中 |
actionMappingParams | 用于负责在 Action 配置中传递参数 |
prepare | 如果 Action 实现了 Preparable,则该拦截器调用 Action 类的 prepare 方法 |
staticParams | 将 struts.xml 文件中 <action>标签的参数内容设置到对应的 Action 中 |
scope | 将 Action 状态存入 session 和 application 范围 |
servletConfig | 提供访问 HttpServletRequest 和 HttpServletResponse 方法,以 Map 方式访问 |
timer | 输岀 Action 执行的时间 |
token | 通过 Token 避免双击 |
tokenSession | 和 Token Interceptor 一样,不过双击时把请求的数据存储在 Session 中 |
validation | 使用 action-validation.xml 文件中定义的内容校验提交的数据 |
workflow | 调用 Action 的 validate 方法,一旦有错谋返回,则重新定位到 INPUT 画面 |
store | 存储或者访问实现 ValidalionAware 接口的 Action 类出现的消息、错误和字段错误等 |
checkbox | 添加了 checkbox 自动处理代码,将没有选中的 checkbox 的内容设定为 false,而 html 在默认情况下不提交没有选中的 checkbox |
datetime | 日期拦截器 |
profiling | 通过参数激活 profile |
roles | 确定用户是否具有 JAAS 指定的 Role,否则不予执行 |
annotationWorkflow | 利用注解代替 XML 配置,使用 annotationWorkflow 拦截器可以使用注解,执行流程为 before-execute-feforeResult-after |
multiselect | 检测是否有像 <select> 标签一样被选中的多个值,然后添加一个空参数 |
deprecation | 当日志级别设置为调试模式(debug)并且没有特殊参数时,在 devMode 模式中,会检查应用程序使用过时或未知的常量,并且显示警告 |
Struts2 框架除了提供这些有用的拦截器以外,还定义了一些拦截器栈,在开发 Web 应用时,可以直接引用这些拦截器栈,而无须自定义拦截器。
注意:随着 Struts2 版本的发展,内建拦截器的数量也在相应地增多,不同版本的 Struts2 拦截器的数量有一些差异,此版本的 Struts2 内建拦截器共有 35 个。这些内建拦截器读者不需要记忆,只需要了解即可。
为了使读者更好地掌握 Struts2 拦截器的知识,下面讲解在 struts-default.xml 中定义的拦截器的部分配置。
在 struts-core-2.3.24.jar 包中的根目录下找到 struts-default.xml 文件,打开后找到 <interceptors> 元素下的内建拦截器和拦截器栈,其部分代码如下所示:
<package name="struts-default" abstract="true">
...
<interceptors>
<!--系统内建拦截器部分,上一部分介绍的内容-->
<interceptor name="alias"
class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring"
class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain"
class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
...
<!-- 定义Basic stack拦截器栈 -->
<interceptor-stack name="basicStack">
<!--引用系统定义的exception拦截器-->
<interceptor-ref name="exception"/>
...
</interceptor-stack>
...
<!-- 定义Sample model -driven stack -->
<interceptor-stack name="modelDrivenStack">
<!--引用系统定义的modelDriven拦截器-->
<interceptor-ref name="modelDriven"/>
<!--引用系统定义的basicStack拦截器栈-->
<interceptor-ref name="basicStack"/>
</interceptor-stack>
...
<!--定义defaultStack拦截器栈-->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="il8n"/>
...
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
...
</interceptor-stack>
</interceptors>
<!--将defaulrStack拦截器栈配置为系统默认拦截器栈-->
<default-interceptor-ref name="defaultStack"/>
<!--默认action类是ActionSupport-->
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
</package>
在上述内建拦截器的配置代码中,defaultStack 拦截器组合了多个拦截器,这些拦截器可以满足大部分 Web 应用程序的需求。使用时,只要在 struts.xml 定义包的过程中继承 struts-default 包,那么 defaultStack 拦截器栈就是默认拦截器的引用。
由于本节篇幅有限,这里没有列出所有的内建拦截器和拦截器栈,读者需要时可以自行查阅 struts-default.xml 文件。