• 转载 Struts2 拦截器详细配置过程


    出处:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.html

    Struts2 拦截器详细配置过程

    1:所有拦截器的超级接口Interceptor ,Action去实现这个接口;

     Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):

          Init()方法:在服务器起动的时候加载一次,并且只加载一次;

          Destroy()方法:当拦截器销毁时执行的方法;

          Interceptor()方法:其中里边有一个参数invocation

    public String intercept(ActionInvocation invocation) throws xception {

           System.out.println("interceptor!!");

           String result=invocation.invoke();

           return result;

        }

    Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.

    2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:

        在拦截器类中把hello当做属性set/get方式注入到拦截器类中;

          <interceptors>

               <!-- 先定义拦截器 -->

               <interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

                  <!-- 指定系统初始化给拦截器的参数 -->

                  <param name="hello">张钊钊</param>

               </interceptor>

               <!-- 加到自己设置的拦截器栈里边去 -->

               <interceptor-stack name="myStack">

                  <interceptor-ref name="myInterceptor">

                  </interceptor-ref>

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

               </interceptor-stack>

           </interceptors>

           <!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 -->

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

           </default-interceptor-ref>

           也可以在使用拦截器的时候给它设置参数:

           就是在一个action 的reslut下面配置上如下:

        <action name="register"

               class="com.zzz.struts2.action.RegisterAction">

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

               <!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 -->

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

              

               <interceptor-ref name="myInterceptor">

                  <param name="hello">welcome</param>

               </interceptor-ref>

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

           </action>

    2.拦截器,拦截器栈和默认的拦截器之间的关系

    1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式:

    <interceptors>

               <!-- 先定义拦截器 -->

               <interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

                  <!-- 指定系统初始化给拦截器的参数 -->

                  <param name="hello">张钊钊</param>

               </interceptor>

               <!-- 加到自己设置的拦截器栈里边去 -->

               <interceptor-stack name="myStack">

                  <interceptor-ref name="myInterceptor">

                  </interceptor-ref>

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

               </interceptor-stack>

           </interceptors>

    拦截器的使用:1.先定义;2.在引用使用;

    <interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

    <interceptor-ref name="myInterceptor">

                  </interceptor-ref>

     2:struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack">

                  </interceptor-ref>

    如果想改变系统默认的拦截器栈,可以这样配置:

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

    </default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;

    如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;

     

    3:抽象的拦截器类AbstractInterceptor

    1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();

        destroy()方法,可以去继承这个抽象拦截器类;

    它的使用跟上边的没有什么区别;

     

    4:方法过滤拦截器MethodFilterInterceptor

    1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;

    它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.

    interceptor-ref name="myInterceptor3">

                  <param name="includeMethods">execute</param>

                  <param name="excludeMethods">execute</param>

               </interceptor-ref>

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

    其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;

    5:鉴听器PreResultListener接口

    1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;

    然后向需要它的拦截器中注册进去如下代码:

    publicclass MyInterceptor3 extends MethodFilterInterceptor {

        privatestaticfinallongserialVersionUID = 3756655410194005443L;

        @Override

        protected String doIntercept(ActionInvocation invocation) throws Exception {

           //把鉴听器注册到拦截中去;

           invocation.addPreResultListener(new MyListener());

           System.out.println("my Interceptor3");

           String result=arg0.invoke();

           System.out.println("my interceptor3 finshed!");

           return result;

        }

    }

  • 相关阅读:
    固定长度下随文字数量增加自动适配字体大小
    vue v-for 和 v-if 、v-else一起使用造成的bug
    火狐使用Ctrl新开窗口不生效
    js如何模拟multipart/form-data类型的请求
    centos安装nodejs
    cursor图标自定义
    解决 vs code 打开文件总是只有一个tab标签页,新打开的tab标签页会替换掉旧的tab标签页
    Devexpress Tab Control 文档
    Devexpress WPF教程
    Linq把一个DataTable根据一列去除重复数据
  • 原文地址:https://www.cnblogs.com/hyrule-link/p/4853547.html
Copyright © 2020-2023  润新知