• 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>元素中只能引用拦截器,不能声明拦截器。

  • 相关阅读:
    Error (10327): VHDL error at xd.vhd(17): can't determine definition of operator ""+"" -- found 0 pos
    FPGA 起脚nCEO/IO管教设置问题
    使用Cross-validation (CV) 调整Extreme learning Machine (ELM) 最优参数的实现(matlab)
    Tools that help you scrape web data----帮助你收集web数据的工具
    采集网页数据---Using Java
    使用正则表达式自动对文本按照字符排序
    Apriori算法实例----Weka,R, Using Weka in my javacode
    关于FP-Growth 算法一个很好的ppt-学习分享
    ARFF文件格式
    Weka-学习
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3212434.html
Copyright © 2020-2023  润新知