• Struts2学习笔记(九) 拦截器(Interceptor)(下)


    拦截器的查找顺序

    如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢:

    (1)   首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一步

    (2)   其次,查找当前Action所在的包中是否声明了默认的拦截器引用,即看<package>元素下有没有<default-intercptor-ref>元素,如果有就使用它,不再继续寻找。如果没有,则执行下一步

    (3)   最后,递归寻找Action所在包的父包中是否设置了默认拦截器引用,直到找到为止。

    注:这里的三步是覆盖的关系,即执行了(2),那么(2)(3)就不会执行了。自顶向下的优先级。一般情况下,如果我们没有在strtus.xml中对Action进行拦截器引用配置,但是我们的包继承了strtus-default包,那么就会使用定义在strtus-default包中的defaultStack拦截器栈。至于没有拦截器的情况,应该是不存在的,如果不使用拦截器,那么就失去了使用Strtus的意义了。

     

    自定义拦截器

    虽然实际使用中struts2提供的拦截器已经基本够我们使用了,一般不需要我们自己写拦截器。但是为了更加深刻的理解拦截器的实现机制。我们还是自己动手写一个自定义的拦截器。要想自定义拦截器,我们只需要实现com.opensymphony.xwork2.interceptor.Interceptor接口即可。这个接口中定义了三个方法,init方法会在对象初始化时被调用,可以用来获取一些资源;destory方法类似与c++中的析构函数(这样便于理解,实际还是有差别的);真正实拦截器功能的是interceptor方法,我们自定拦截器主要就是实现这个方法。下面我们以判断用户是否登录为例来写一个自定义拦截器:

    public class MyInterceptor implements Interceptor {
    
        public void destroy() {
        }
    
        public void init() {
        }
    
        public String intercept(ActionInvocation invocation) throws Exception {
    
            System.out.println("动作执行之前...");
            String result = invocation.invoke();
            System.out.println("结果执行之后...");
            
            return result;
        }
    
    }

    Struts.xml

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

     

           <interceptors>

               <interceptor name="myinterceptor" class="interceptor.MyInterceptor" />

               <interceptor-stack name="myStack">

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

                  <interceptor-ref name="myinterceptor"></interceptor-ref>

               </interceptor-stack>

           </interceptors>

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

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

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

           </action>

        </package>

    Hello.jsp

    <body>

        <%

            System.out.println("结果已执行...");

        %>

        This is hello.jsp. <br>

     </body>

    在浏览器中访问hello动作,hello.jsp页面呈现之后,查看控制台输出如下:

    动作执行之前...

    结果已执行...

    结果执行之后...

    由此可见,我们自定义的interceptor已经在动作执行之前和结果执行之后都被执行了。当然,如果你想在结果被执行之前做点什么,那就需要使用前面学到的PreResultListenner来实现了。

    总结:关于拦截器的学习,差不多就到这里了。拦截器的配置和使用本身不难,主要是理解拦截器的实现原理。到现在差不多就把Struts2中的几个基本的概念学完了,接下来就该学习OGNL和类型转换以及输入验证了。以前自学都只是看看书或者教程,没怎么做过笔记,现在发现其实在写笔记的过程中,会加深对所学只是的理解,有些你看书或教程没理解到的地方,在你边写笔记边做实例的过程中就理解的很清楚了。看来以后学习的时候尽量写一些笔记来加深自己的理解,记不清的时候还可以拿出来看看。

  • 相关阅读:
    JQuery插件,轻量级表单模型验证(续 二)
    关于DateTimeOffset的爱恨情仇
    JQuery插件,轻量级表单模型验证(续 一)
    asp.net 远程模型验证
    JQuery插件,轻量级表单模型验证
    Ef Core增加Sql方法
    初识依赖注入
    Core下简易WebApi
    sql语句实现行转列练习
    sql语句基本查询操作
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3212433.html
Copyright © 2020-2023  润新知