struts2 拦截器的实现机制

1 我们都知道strus2中的拦截器是struts2 的一个核心。

  想看struts2的拦截机制,我们首先要看strus2的入口,也就是在web.xml中配置的过滤器。



  首先说一下这个ActionMapping这个类,这个类的作用就是存储了action的信息,和执行流程的ActionFoward信息。所以在配置了action中信息之后,mapping的信息肯定不能为空,然后我们查看下面execute.executeAction 方法,我们跟进查看之后。

 我们再次跟进,我们可以在核心代码中,看到产生了代理对象,



 根据struts2的流程图,我们知道这个ActionProxy创建了一个ActionInvocation,也就是相当于jdk动态代理中的InvocationHandler,我们查看这个ActionInvocation,发现这个是一个接口,我们查看他的实现类,我们查看defaultActionInvocation。
 通过源代码阅读,我们查看该类中的init方法。

  List<InterceptorMapping> interceptorList = new ArrayList<InterceptorMapping>         (proxy.getConfig().getInterceptors());
        interceptors = interceptorList.iterator();

上面的就是把所有的拦截器放在了ArrayList里面,然后那个intercepts就是这个集合的迭代器。

我们查看这个便利的核心方法invoke方法,在invoke方法中我们查看核心代码,我们发现它便利了这个迭代器,

下面是我的一个拦截器。我们发现在我们自己的拦截器中,它调用了invoketion中的invoke方法,也就是上面的方法

 

 

下面让我用一张图片更好的诠释一下。这个递归。

 

  首先resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);我们发现它把自己传递了过去,然后我们调用ai.invoke的时候,它又调用了自己,这个时候是递归进行访问,然后迭代器next,运行下一个拦截器。这样操作,就完成了拦截器的操作,当拦截器访问完成之后,返回一个结果试图。也就是倒数第三张图片的resultCode。

  下面简单说一下拦截器和过滤器之间的区别

关于interceptor与Filter区别:
            1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
            2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
            3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
            4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
            5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

猜你喜欢

转载自1193355343.iteye.com/blog/2374523