零基础学Struts
上QQ阅读APP看书,第一时间看更新

6.5 Struts 2内建拦截器

Struts 2还提供了许多内建的拦截器,通过使用这些内建的拦截器能完成许多的应用。下面来介绍Struts 2提供了哪些内建的拦截器,以及如何配置这些拦截器。

6.5.1 内建拦截器

Sturts 2内建了大量的拦截器,并配置在struts2-core-2.0.11.1类库中的“struts-default.xml”文件中。从该文件中可以看到Struts 2中所有内建的拦截器,“struts-default.xml”文件代码如下所示。

        <! -- 该拦截器用来实现不同请求中相同参数的别名转换 -->
        <interceptor name="alias"
                        class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
        <! -- 该拦截器用来实现自动装配-->
        <interceptor name="autowiring"
                        class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
        <! -- 该拦截器用来构建一个Action -->
        <interceptor name="chain"
                        class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
        <! -- 该拦截器用来负责类型转换错误信息处理 -->
        <interceptor name="conversionError"
                        class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
        <! -- 该拦截器用来实现获得cookie信息 -->
        <interceptor name="cookie"
                        class="org.apache.struts2.interceptor.CookieInterceptor"/>
        <! -- 该拦截器用来创建一个HttpSession实例 -->
        <interceptor name="createSession"
                        class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
        <! -- 该拦截器用来提供调试信息-->
        <interceptor name="debugging"
                        class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
        <interceptor name="externalRef"
                        class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
        <! -- 该拦截器用来后台执行Action -->
        <interceptor name="execAndWait"
                        class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
        <! -- 该拦截器用来负责处理异常 -->
        <interceptor name="exception"
                        class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
        <! -- 该拦截器用来处理文件上传 -->
        <interceptor name="fileUpload"
                        class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
        <! -- 该拦截器用来支持国际化 -->
        <interceptor name="i18n"
                        class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
        <! -- 该拦截器用来处理日志记录 -->
        <interceptor name="logger"
                        class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
        <! -- 该拦截器用来负责模型驱动 -->
        <interceptor name="modelDriven"
                        class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
        <! -- 该拦截器用来负责模型驱动-->
        <interceptor name="scopedModelDriven"
                        class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
        <! -- 该拦截器用来将参数值设置成Action中对应的属性 -->
        <interceptor name="params"
                        class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
        <! -- Action实现Prepareble接口,那么将自动调用该拦截器中的prepare()方法-->
        <interceptor name="prepare"
                        class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
        <! -- 该拦截器用来负责将<param>标签中的参数传入action -->
        <interceptor name="staticParams"
                        class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
        <! -- 该拦截器用来实现范围转换 -->
        <interceptor name="scope"
                        class="org.apache.struts2.interceptor.ScopeInterceptor"/>
        <! -- 该拦截器用来实现直接访问Servlet API -->
        <interceptor name="servletConfig"
                        class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
        <interceptor name="sessionAutowiring"
                        class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
        <! -- 该拦截器用来负责输出Action执行时间 -->
        <interceptor name="timer"
                        class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
        <! -- 该拦截器用来阻止重复提交 -->
        <interceptor name="token"
                        class="org.apache.struts2.interceptor.TokenInterceptor"/>
        <! -- 该拦截器用来将token保存到HttpSession -->
        <interceptor name="tokenSession"
                        class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
        <! -- 该拦截器用来实现数据校验 -->
        <interceptor name="validation"
                        class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
        <! -- 该拦截器用来负责调用Action中的validate方法 -->
        <interceptor name="workflow"
                        class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
        <interceptor name="store"
                        class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
        <interceptor name="checkbox"
                        class="org.apache.struts2.interceptor.CheckboxInterceptor" />
        <interceptor name="profiling"
                        class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
        <interceptor name="roles"
                        class="org.apache.struts2.interceptor.RolesInterceptor" />

这么多的拦截器,要完全了解其实现机制是非常困难的。其实一般的开发人员知道如何使用这些拦截器就可以了。在定义package时一般都会选择继承struts-default包,这样就可以使用Struts 2所有的内建拦截器了。

6.5.2 内建拦截器的配置

从“struts-default.xml”文件中可以看到,在该文件中为内建的拦截器配置了许多的拦截器栈,代码如下所示。

            <! --基本拦截器栈 -->
        interceptor-stack name="basicStack">
             <interceptor-ref name="exception"/>
             <interceptor-ref name="servletConfig"/>
             <interceptor-ref name="prepare"/>
             <interceptor-ref name="checkbox"/>
             <interceptor-ref name="params"/>
             <interceptor-ref name="conversionError"/>
        </interceptor-stack>


        <! -- 该拦截器栈包括基本拦截器栈的所有拦截器,增加用于数据校验的拦截器 -->
        <interceptor-stack name="validationWorkflowStack">
              <interceptor-ref name="basicStack"/>
              <interceptor-ref name="validation"/>
              <interceptor-ref name="workflow"/>
        </interceptor-stack>


        <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于文件上传的拦截器-->
        <interceptor-stack name="fileUploadStack">
              <interceptor-ref name="fileUpload"/>
              <interceptor-ref name="basicStack"/>
        </interceptor-stack>


        <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于模型驱动的拦截器-->
        <interceptor-stack name="modelDrivenStack">
              <interceptor-ref name="modelDriven"/>
              <interceptor-ref name="basicStack"/>
        </interceptor-stack>


        <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用来构建一个Action链的拦截器-->
        <interceptor-stack name="chainStack">
             <interceptor-ref name="chain"/>
             <interceptor-ref name="basicStack"/>
        </interceptor-stack>


        <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于支持国际化的拦截器-->
        <interceptor-stack name="i18nStack">
             <interceptor-ref name="i18n"/>
             <interceptor-ref name="basicStack"/>
        </interceptor-stack>


        <! --该拦截器栈两次引用params拦截器,用于将请求对象赋值给外部对象-->
        <interceptor-stack name="paramsPrepareParamsStack">
          <interceptor-ref name="exception"/>
          <interceptor-ref name="alias"/>
          <interceptor-ref name="params"/>
          <interceptor-ref name="servletConfig"/>
          <interceptor-ref name="prepare"/>
          <interceptor-ref name="i18n"/>
          <interceptor-ref name="chain"/>
          <interceptor-ref name="modelDriven"/>
          <interceptor-ref name="fileUpload"/>
          <interceptor-ref name="checkbox"/>
          <interceptor-ref name="staticParams"/>
          <interceptor-ref name="params"/>
          <interceptor-ref name="conversionError"/>
          <interceptor-ref name="validation">
              <param name="excludeMethods">input, back, cancel</param>
          </interceptor-ref>
          <interceptor-ref name="workflow">
              <param name="excludeMethods">input, back, cancel</param>
          </interceptor-ref>
    </interceptor-stack>


    <! --默认拦截器栈,包含大部分常用拦截器的引用 -->
    <interceptor-stack name="defaultStack">
          <interceptor-ref name="exception"/>
          <interceptor-ref name="alias"/>
          <interceptor-ref name="servletConfig"/>
          <interceptor-ref name="prepare"/>
          <interceptor-ref name="i18n"/>
              <interceptor-ref name="chain"/>
              <interceptor-ref name="debugging"/>
              <interceptor-ref name="profiling"/>
              <interceptor-ref name="scopedModelDriven"/>
              <interceptor-ref name="modelDriven"/>
              <interceptor-ref name="fileUpload"/>
              <interceptor-ref name="checkbox"/>
              <interceptor-ref name="staticParams"/>
              <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*</param>
              </interceptor-ref>
              <interceptor-ref name="conversionError"/>
              <interceptor-ref name="validation">
                  <param name="excludeMethods">input, back, cancel, browse</param>
              </interceptor-ref>
              <interceptor-ref name="workflow">
                  <param name="excludeMethods">input, back, cancel, browse</param>
              </interceptor-ref>
        </interceptor-stack>


        <! --   默认拦截器的别名 -->
        <interceptor-stack name="completeStack">
              <interceptor-ref name="defaultStack"/>
        </interceptor-stack>

在上面这些拦截器中,使用最多的就是defaultStack拦截器栈。而且在“struts-default.xml”文件中配置了默认拦截器栈为defaultStack,代码如下所示。

        <default-interceptor-ref name="defaultStack"/>

就是因为在“struts-default.xml”文件中配置了默认拦截器栈为defaultStack,而且这里的包又继承struts-default,所以也就相当于定义了默认的拦截器栈为defaultStack。