Struts2--拦截器浅析

来源:互联网 发布:五轴编程用什么软件 编辑:程序博客网 时间:2024/05/09 12:39

一、拦截器工作原理

拦截器的执行过程是一个递归的过程,(intercept1,intercept2,intercept3,intercept3,intercept2,intercept1)。与在Web中过滤器的工作原理是几乎一样的。

二、自定义拦截器(有两种方式)

1、实现(implements) Interceptor接口,则需要实现(可以空实现)以下三个方法:

void init():初始化拦截器所需资源

void destory():释放在init()中分配的资源

String intercept(ActionInvocation ai) throws Exception  在调用拦截器时真正执行的方法,实现拦截器功能,利用ActionInvocation参数获取Action状态,返回result字符串作为逻辑视图

2、继承AbstractInterceptor类,AbstractInterceptor实现了Intercept接口,对init()、destory()方法做出了空实现,则它的子类就不再实现了,

只需要实现intercept()方法。


在拦截器的方法中,若本拦截器的功能执行完毕,要调用后面的拦截器(若是最后一个拦截器,则调用的是目标执行的action),只需要在方法中写上invocation.invoke();即可

-----------------------------------eg:计算执行Action花费的时间------------------------------------------

public class MyInterceptor extends AbstractInterceptor{

 //进入拦截器,会自动调用此方法

  public String intercept(ActionInvocation invocation) throws Exception{

       //执行Action之前

       long start=System.currentTimeMills();

       //执行下一个拦截器,如果 已是最后一个拦截器,则执行目标Action

      String result=   invocation.invoke();       / /result为最终的结果视图

      long end = System.currentTimeMillis();

      System.out.println("执行Action花费的时间:"+(end - start) +"ms");

      return result;

  }

}

在struts.xml中配置拦截器

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

     <!--声明拦截器-->

     <interceptors>

          <interceptor name="myInterceptor" class="com.yc.interceptor.MyInterceptor"></interceptor>

          <!--自定义拦截器栈-->

          <interceptor-stack name="mystack">

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

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

          </interceptor-stack>

     </interceptors>

    <action name="timer" class="com.yc.TimerAction">

          <result>/success.jsp</result>

          <!--引用拦截器-->

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

          <!--引用自定义的拦截器栈-->

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

    </action>

</package>

二、Struts2内建拦截器

1、params拦截器:负责将请求参数设置为Action属性

2、staticParams拦截器:可以将struts.xml配置文件中action元素的子元素param参数设置为Action属性

3、servletConfig拦截器:将源于Servlet API的各种对象注入到Action,必须实现对应接口

4、fileUpload拦截器:对文件上传提供支持,将文件和元数据设置对应的Action属性(内部有调用Commons-FileUpload组件,对这个组件做了封装)

5、exception拦截器:捕获异常,并将异常映射到用户自定义的错误页面

6、validation拦截器:调用验证框架进行数据验证

可去struts-core包中的struts-default.xml中查看所有配置的栈,

只要在定义包的过程中,继承struts-default包,那么defaultStack(struts-default.xml中配置的一个拦截器栈)将是默认为拦截器

当为包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用,要用默认的拦截器,还需要显式的引用一次

拦截器栈中的各个拦截器的顺序很重要。

0 0