Struts2内建拦截器

Struts2 框架中内置了许多拦截器,这些拦截器以 name-class 对的形式配置在 struts-default.xml 文件中,其中,name 是拦截器的名称,也就是引用的名字;class 指定了该拦截器所对应的实现。

只要自定义的包继承了 Struts2 的 struts-default 包,就可以使用包中定义的内建拦截器,否则需要自行定义拦截器。

内建拦截器的介绍

在 struts-default.xml 中,每一个拦截器都具有不同的意义,如表 1 所示。

表 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 文件。