我正在使用拦截器在基于Struts的应用程序中实现一些功能,而对其生命周期的工作方式却感到困惑。根据Struts的文档(“拦截器”,“写拦截器”和“大图”),它应该像这样工作:
第一拦截器 下一个拦截器 LastInterceptor 行动 结果 LastInterceptor 下一个拦截器 第一拦截器
这是有道理的,但是我在如何区分在操作之前执行的拦截器调用与在结果呈现之后执行的拦截器调用之间进行了尝试(我在PreResultListener这里跳过了s)。 如果启动调试器,则会有两个调用,intercept()并且在通过时找不到任何明显的内容ActionInvocation。 ( 更新 :这部分是我的主要困惑,一旦知道,我就可以在下面回答我的问题)
PreResultListener
intercept()
ActionInvocation
在“大画面”页会谈有点混乱的一个“前”,而被称为“后”,“条款”,但我不知道用它来做什么:
[…] 这包括在调用操作本身之前调用所有拦截器(before子句)。 […] 拦截器将再次执行(以相反的顺序,调用after子句)。 […]
[…]
这包括在调用操作本身之前调用所有拦截器(before子句)。
拦截器将再次执行(以相反的顺序,调用after子句)。
( 更新 :这两个句子仍然很糟糕)
拦截器没有两个调用:
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; } }
(请注意,我在调试器中看到的“两次拦截调用”是我没有注意到的不太明显的重定向的结果。这使我很困惑。)