假设在一个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() (如果从bar拦截器调用)之前调用action.execute(),即在调用action.execute()之前运行所有拦截器?
发布于 2013-10-11 05:25:54
在执行action.execute()方法之前,将调用堆栈中的所有拦截器。在这种情况下,以下是命令。
foo.intercept()bar.intercept()baz.intercept()action.execute()发布于 2013-10-11 05:25:50
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对象上被调用的原因,该对象很大程度上协调了整个流程。
https://stackoverflow.com/questions/19310707
复制相似问题