首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多个Struts2拦截器调用`invocation.invoke()`?

如何使用多个Struts2拦截器调用`invocation.invoke()`?
EN

Stack Overflow用户
提问于 2013-10-11 05:15:14
回答 2查看 2.7K关注 0票数 1

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

  • foo
    • 条形
      • 巴兹

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

代码语言:javascript
复制
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()之前运行所有拦截器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-11 05:25:54

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

  1. foo.intercept()
  2. bar.intercept()
  3. baz.intercept()
  4. action.execute()
票数 2
EN

Stack Overflow用户

发布于 2013-10-11 05:25:50

Action只执行一次。所有Interceptors都有机会触发两次:一次用于预处理(在调用invoke()之前),另一次用于后处理(在调用invoke()之后)。

所以,在您的例子中,下面是发生的情况:

代码语言:javascript
复制
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对象上被调用的原因,该对象很大程度上协调了整个流程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19310707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档