我正在使用拦截器在我的基于Struts的应用程序中实现一些东西,我对它们的生命周期如何工作感到困惑。根据Struts文档("Interceptors","Writing interceptors"和"Big picture"),它应该是这样的:
FirstInterceptor NextInterceptor LastInterceptor Action Result LastInterceptor NextInterceptor FirstInterceptor
这是有道理的,但是我在如何区分在操作之前执行的拦截器调用与在渲染结果之后执行的拦截器调用(我在这里跳过PreResultListener
)之间存在绊脚石。 如果我启动一个调试器,我会收到 (< strong>更新:这部分是我最后的一个主要困惑,一旦我得到它,我能够回答下面的问题) intercept()
的两次调用,但在ActionInvocation
我被传递时找不到任何太明显的东西。
"Big picture"页面有点令人困惑地谈到了被称为“之前”和“之后”的“条款”,但我不知道该怎么做:
[...]
这包括在调用Action本身之前调用任何Interceptor(before子句)。
[...]
再次执行拦截器(以相反的顺序执行,调用after子句)。
[...]
(更新:这两句话仍然不错)
答案 0 :(得分:2)
拦截器没有两次调用:
public class MyInterceptor implements Interceptor {
public String intercept(ActionInvocation invocation) {
/*
This is before Action.execute(),
and before all interceptors down the stack
*/
String code = invocation.invoke();
/*
This is after Action.execute(),
the result rendering and all
interceptors down the stack,
but before the interceptors
higher up in the stack.
*/
return code;
}
}
(请注意,我在调试器中看到的“两次拦截调用”是由于我没有注意到的不太明显的重定向导致的结果。这让我很困惑。)