如何有多个调用`invocation.invoke()`的Struts2拦截器?

时间:2013-10-11 05:15:14

标签: java struts2 struts2-interceptors

假设struts 2操作中有多个嵌套拦截器:

  • FOO
      • 巴兹

每个拦截器在intercept()方法

中执行以下操作
String result = invocation.invoke();
return result;

调用invocation.invoke()时,会调用队列中下一个拦截器的intercept()方法,还是实际调用action.execute()方法?

如果foo invocation.invoke()bar.intercept()会调用action.execute()还是实际调用bar.intercept()

如果是后者,那么在baz.intercept()之前调用action.execute()action.execute()(如果从bar拦截器调用)可以做什么,即所有拦截器都在{{}之前运行1}}被称为?

2 个答案:

答案 0 :(得分:2)

Action只执行一次。所有Interceptors都有机会点击两次:一次用于预处理(在调用invoke()之前),另一次用于后期处理(在致电invoke())之后。

所以,在你的例子中,会发生什么:

foo calls invoke() -> calls bar#intercept()
bar calls invoke() -> calls baz#intercept()
baz calls invoke() -> calls action#execute()

action#execute() returns -> baz executes lines after invoke()
baz#intercept() returns -> bar executes lines after invoke()
bar#intercept() returns -> foo executes lines after invoke()

请注意,Interceptors永远不会直接互相通话。所有调用都必须通过Struts 2框架。这就是为什么在invoke()对象上调用ActionInvocation的原因,它几乎协调了整个流程。

答案 1 :(得分:2)

在执行action.execute()方法之前,将调用堆栈中的所有拦截器。在这种情况下,以下是订单。

  1. foo.intercept()
  2. bar.intercept()
  3. baz.intercept()
  4. action.execute()