struts2核心 拦截器配置

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 方法后 , 在渲染视图之前做一些事情;让某个类去实现这个接口;

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

public class MyInterceptor3 extends MethodFilterInterceptor {

    private static final long serialVersionUID = 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;

    }

}

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值