11-19笔记

一、Struts拦截器

拦截器(Interceptor):拦截器是struts2的核心,struts2的众多功能都是通过拦截器来实现的。

1.拦截器的配置

  编写实现Interceptor接口的类

  在struts.xml文件中定义拦截器

  在action中使用拦截器

一旦定义了自己的拦截器,将其配置到action上后,我们需要在action的最后加上默认的拦截器栈:defaultStack

2.定义拦截的三种方法

  (1)实现Interceptor接口类

public class TheInterceptor1 implements Interceptor{
  public void destroy(){}
  public void init(){}
  public String intercept(ActionInvocation invocation) throws Exception{
    String result = invocation.invoke();//如果还有拦截器,将传递给下一拦截器,否则执行Action
  return result;
  }
}

 struts.xml文件中定义拦截器

<struts>
  <package name="struts" extends="struts-default">
    <interceptors>
      <interceptor name="theInterceptor1" class="com.interceptor.TheInterceor1"></interceptor>
    </interceptors>
  <action name="action1" extends="default-struts">
    <interceptor-ref name="theInterceptor1">
    </interceptor-ref>
  </action>
  </package>

</struts>

拦截器中传递参数

public class TheInterceptor1 implements Interceptor{
  private String test;//拦截器中传递参数,在tomcat启动时,便已执行setTest(),init()方法,setTest()方法在init()方法之前执行  
  public String getTest(){
    return test;
  }
  public void setTest(String test){
    this.test = test;
  }
  public void destroy(){}
  public void init(){}
  public String intercept(ActionInvocation invocation) throws Exception{
    String result = invocation.invoke();//如果还有拦截器,将传递给下一拦截器,否则执行Action
  return result;
  }
}

  struts.xml文件中定义拦截器

<struts>
  <package name="struts" extends="struts-default">
    <interceptors>
      <interceptor name="theInterceptor1" class="com.interceptor.TheInterceor1">
        <param name="test">aaaa</param>
</interceptor>
    </interceptors>
  <action name="action1" extends="default-struts">
    <interceptor-ref name="theInterceptor1">
    </interceptor-ref>
  </action>
  </package>

</struts>

  (2)继承AbstractInterceptor抽象类(该类实现了interceptor接口,并且对init和destroy方法进行了空实现),然后实现其抽象方法intercept即可。

  (3)方法过滤拦截器(可以对指定方法进行拦截的拦截器,继承了MethodFilterInterceptor类,实现doIntercept(ActionInvocation invocation)抽象方法)

[MethodFilterInterceptor类重写了AbstractInterceptor类的intercept(ActionInvocation invocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法。从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了对Action的拦截行为(只是实现了方法过滤的逻辑),但真正的拦截逻辑还需要开发者提供,也就是通过回调doIntercept方法实现。可见,如果用户需要实现自己的拦截逻辑,则应该重写doIntercept(ActionInvocation invocation)方法]

在方法过滤拦截器中,如果没有制定includeMethods参数,也没有指定execludeMethods参数,那么所有的方法都会被拦截,也就是所有的方法都被认为是includeMethods的;如果仅仅指定了includeMethods,那么只会拦截includeMethods中的方法,没有包含在includeMethods中的方法就不会被拦截。

[如果对于相同的方法指定了execludeMethods参数,includeMethods参数,includeMethods参数优先级高,也就是说依旧会被拦截]

注:execludeMethods、includeMethods参数需要在struts.xml的interceptor标签中配置params标签。

猜你喜欢

转载自wanci.iteye.com/blog/1978233