【发布时间】:2012-02-03 11:11:09
【问题描述】:
在 Struts2 中,如果我们定义了一个拦截器堆栈,并且以先进先出的方式调用它。 因此,在后期处理阶段,如果较早的拦截器之一返回一个控制字符串,结果将响应呈现给客户端,会发生什么。 我想知道左边的拦截器是否会被处理。
【问题讨论】:
标签: struts2 interceptor interceptorstack
在 Struts2 中,如果我们定义了一个拦截器堆栈,并且以先进先出的方式调用它。 因此,在后期处理阶段,如果较早的拦截器之一返回一个控制字符串,结果将响应呈现给客户端,会发生什么。 我想知道左边的拦截器是否会被处理。
【问题讨论】:
标签: struts2 interceptor interceptorstack
它会像这样工作。
只有在完全调用拦截器堆栈后才会调用您的操作方法。这意味着一旦在堆栈中成功调用第一个拦截器,它将调用堆栈中定义的下一个拦截器,并且引用存储在堆栈中该链将继续调用,直到调用堆栈中的最后一个拦截器
invocation.invoke()
此调用是调用堆栈中定义的下一个拦截器的关键,或者这是最后一个它将调用您的操作类中所需的函数。
现在在其他情况下,假设某些拦截器失败说workflow,它将返回结果为INPUT,并将停止拦截器的进一步执行,框架将向用户输出所需的 JSP/Tempelate。
在这种情况下,后处理/清理会以相反的顺序调用拦截器,即最先执行或最新执行的拦截器将首先调用,然后依次调用。
这个后处理的想法是做任何清理工作或任何其他需要做的事情(比如清理资源等)
希望这能给你一些想法。
【讨论】:
invoke()返回结果已经发送回客户端。所以简而言之,我们可以说这个后处理可以用来执行某些/条件逻辑。
PreResultListener 允许拦截器在结果呈现之前获得控制权,否则这是一个合理的描述。