Struts2学习笔记(八) 拦截器(Interceptor)(上)

什么是拦截器(Interceptor

拦截器是struts2框架最重要的特性之一。它可以让你在Action 方法执行前后(Result执行之后)进行一些功能处理。在前面学习Action和学习Result的时候我们就已经开始学习拦截器了,因此现在我们对如何使用它已经不陌生了。

在学习Spring的时候我们会接触到一种设计思想,叫做面向切面编程(AOP)。也就是说我们将一些通用的功能组件抽取出来,我们在功能模块中不需要编写这些与逻辑功能无关的代码,然后我们通过某种方式(动态代理)将这些通用组件的功能附加到我们的功能模块上。Struts2中的拦截器就和这种模式差不多,Strtus2框架会将我们在配置文件中为Action配置的拦截器和Action以及Result组合在一起,附加到一个新的对象上,那么在执行的时候,只需要对这个新的对象加以操作,那么这些拦截器和Action以及Result就都可以得以执行了。这个新的对象就负责了拦截器和Action的Result的组织,它就是ActionInvocation类。

ActionInvocation代表了Action的执行状态,它持有Intercptors和Action的对象实例。通过重复的调用它的invoke方法,使得其中的Interceptors,Action和Result都得以执行。

Strtus2内建的拦截器

Strtus2内建了许多拦截器,这些可以在struts-default.xml中找到:

<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"/>

            <interceptor name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

            <interceptor name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/>

            <interceptor name="clearSession"class="org.apache.struts2.interceptor.ClearSessionInterceptor"/>

            <interceptor name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/>

            <interceptor name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor"/>

           <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"/>

            <interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

            <interceptor name="actionMappingParams"class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>

            <interceptor name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>

            <interceptor name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>

            <interceptor name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/>

            <interceptor name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

            <interceptor name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>

            <interceptor name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/>

            <interceptor name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>

            <interceptor name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

            <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"/>

            <interceptor name="annotationWorkflow"class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>

            <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor"/>

</interceptors>

下面是关于这些内建拦截器的说明:

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

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中。

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

我们通过定义拦截器栈的方式来组织这些拦截器,在前面的学习中我也接触到了struts2内建的拦截器栈drfaultStack。下面我们看一些有关拦截器的声明和配置.

拦截器的声明和配置

我们从struts-dfault.xml文件中已经看过了如何声明一个拦截器。首先拦截其的声明适应<interceptor>元素,name属性用于指定拦截器的名字,class属性用于指定拦截器的实现类。同时<interceptor>元素必须放在<interceptors>元素里。

在<interceptors>元素里可以使用<interceptor-stack>元素和<interceptor-ref>元素来定义拦截器栈和引用拦截器(或拦截器栈),还可以在使用<param>元素来向拦截器传递参数:

<interceptor-stack name="executeAndWaitStack">

      <interceptor-ref name="execAndWait">

            <param name="excludeMethods">input,back,cancel</param>

       </interceptor-ref>

       <interceptor-ref name="defaultStack"/>

       <interceptor-ref name="execAndWait">

            <param name="excludeMethods">input,back,cancel</param>

       </interceptor-ref>

 </interceptor-stack>

为action配置拦截器。这个我们在前面的学习中已经学习过了,我们可以在<package>元素中配置默认的拦截器栈,也可以在<action>元素中使用<interceptor-ref>元素来为Action配置拦截器或拦截器栈。

<package name="default" namespace="/" extends="struts-default">

       

       <interceptors>

           <interceptor-stackname="luo">

              <interceptor-refname="exception"/>

                <interceptor-refname="alias"/>

                <interceptor-refname="servletConfig"/>

                <interceptor-refname="i18n"/>

                <interceptor-ref name="prepare"/>

                <interceptor-refname="chain"/>

                <interceptor-refname="scopedModelDriven"/>

                <interceptor-refname="modelDriven"/>

                <interceptor-refname="fileUpload"/>

                <interceptor-refname="checkbox"/>

                <interceptor-refname="multiselect"/>

                <interceptor-refname="staticParams"/>

                <interceptor-refname="actionMappingParams"/>

                <interceptor-refname="params">

                  <param name="excludeParams">dojo\..*,^struts\..*</param>

                </interceptor-ref>

                <interceptor-refname="conversionError"/>

              

                <interceptor-refname="workflow">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

                <interceptor-refname="debugging"/>

            

           </interceptor-stack>

       </interceptors>  

       <default-interceptor-ref name="luo"></default-action-ref>

       <action name="hello" class="action.HelloWorld">

           <result name="success">/success.jsp</result>

           <result name="input">/input.jsp</result>

       </action>

 

    </package>


<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  

            <param name="account">test</param>  

           <result>/s2impl/welcome.jsp</result>  

            <interceptor-ref name="staticParams"/>  

          <interceptor-ref name="basicStack"/>  

 </action> 

注:如果要声明新的拦截器,那么必须声明在<package>元素下的<intercptors>元素下。<action>元素中只能引用拦截器,不能声明拦截器。

原文地址:https://www.cnblogs.com/jdluojing/p/3212434.html