假设struts 2操作中有多个嵌套拦截器:
每个拦截器在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}}被称为?
答案 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()
方法之前,将调用堆栈中的所有拦截器。在这种情况下,以下是订单。
foo.intercept()
bar.intercept()
baz.intercept()
action.execute()