zoukankan      html  css  js  c++  java
  • 拦截器的的调用顺序

    拦截器的的调用顺序

    a:首先,要找到它自己有没有声明拦截器的引用,即<action>元素有没有<interceptor-ref>子元素,如果有,则不用继续寻找(即不会再使用b,c即默认的拦截器栈等),直接使用这些拦截器,如果没有进行下一步的查找。

    b:其次,找到这个<action>所在包有没有声明默认的拦截器引用,即<package>元素的<default-interceptor-ref>子元素,如果有,则不用继续再找,直接使用这些拦截器,如果没有,则进行下一步的查找。

    c:递归的查找这个包的父包,看看有没有声明默认的拦截器引用,直到找到默认的拦截器引用为止。

    d:同一层下,拦截器的执行顺序为配置的顺序

    补充:

    abstract:把包声明为抽象包,抽象包就是用来被继承的(等待被继承)。只要是没有<action>元素的包,就可以声明为抽象包。(抽象包如果不被子包继承,它里面写的任何东西都不起作用) 

     注意:@ParentPackage("default")  值可以是一个抽象包,此时抽象包中的内容也会起作用(比如定义的拦截器等)相当于该抽象包被继承了。

    拦截器的使用方式:
    拦截器引用一般是两种方式
    1,
    如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,
    如下(这里我是引用了struts2自带的checkbox拦截器),因为<action>下配置了拦截器,所以默认就不会使用b和c:
    <package name="default" extends="struts-default" namespace="/ce">
    <interceptors>
    <interceptor name="loginInterceptor" class="com.action.LoginInterceptor"/>
    </interceptors>
    <action name="hello" class="com.action.HelloWorld" method="hello">
    <interceptor-ref name="loginInterceptor"/>
    <interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则不会使用默认拦截器栈中的拦截器)
    <result name="success">/WEB-INF/index.jsp</result>
    </action>
    </package>

    也可以改为对全局Action设置自己需要的拦截器,如下:
    2,
    struts-action.xml里面配置Action如下:
    <!-- 一个公共包 -->
    <package name="myDefault" extends="struts-default" abstract="true">
    <!-- 声明拦截器 -->
    <interceptors>
    <interceptor name="checkLogin"
    class="com.itheima.web.interceptors.CheckLoginInterceptor"/>
    <!-- 定义一个拦截器栈 -->
    <interceptor-stack name="myDefaultStack">
    <interceptor-ref name="checkLogin">
    <!-- 由于我们使用了继承MethodFilterInterceptor,
    此时我们可以告知拦截器,排除掉登录方法 -->
    <param name="excludeMethods">login</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>(同一层下,拦截器的执行顺序为配置的顺序,即先执行checkLogin,后执行defaultStack下的19个拦截器)
    </interceptor-stack>
    </interceptors>
    <!-- 修改默认拦截器栈,设置我们自定义的拦截器栈,
    这样的话我们写的所有动作都有了检查登录功能。并且排除了登录方法-->
    <default-interceptor-ref name="myDefaultStack"/>
    <!-- 全局结果视图 -->
    <global-results>
    <result name="login">/login.jsp</result>
    </global-results>
    </package>

    <!-- 配置动作,让此包继承我们自己写的公共包myDefault -->
    <package name="customer" extends="myDefault" namespace="/customer">
    <!-- 查询所有客户 -->
    <action name="findAllCustomer" class="com.itheima.web.action.CustomerAction"
    method="findAllCustomer">
    <result name="findAllCustomer">/jsp/customer/list.jsp</result>
    </action>
    </package>

    相关链接:

    https://www.cnblogs.com/wwicked/articles/4455477.html

    https://www.cnblogs.com/yw-ah/p/5761235.html

    https://www.cnblogs.com/Ant-soldier/p/5490035.html

  • 相关阅读:
    C++中数字与字符串之间的转换
    关于安卓启动eclipse错误:找不到元素‘d:devices'的声明
    linux相关解压命令
    泛型
    CRUD工程师---番外篇---反射
    CRUD工程师---设计模式
    AOP切面日志
    CRUD工程师---InnoDB存储引擎
    CRUD工程师---InnoDB存储引擎2
    CRUD工程师---InnoDB存储引擎4(表)
  • 原文地址:https://www.cnblogs.com/zxwBj/p/8552471.html
Copyright © 2011-2022 走看看