1

假设在一个 struts 2 动作中有多个嵌套的拦截器:

    • 酒吧
      • 巴兹

每个拦截器都在他们的intercept()方法中执行以下操作

String result = invocation.invoke();
return result;

什么时候invocation.invoke()被调用,这个会调用intercept()队列中下一个拦截器的方法,还是真的会调用该action.execute()方法?

例如,如果fooinvocation.invoke(),会调用bar.intercept()还是会调用action.execute()

如果是后者,那么我该怎么做才能让bar.intercept()baz.intercept()(如果从 bar 拦截器调用)在调用之前调用action.execute(),即所有拦截器都在调用之前运行action.execute()

4

2 回答 2

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

于 2013-10-11T05:25:50.957 回答
2

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

  1. foo.intercept()
  2. bar.intercept()
  3. baz.intercept()
  4. action.execute()
于 2013-10-11T05:25:54.947 回答