2012-03-30 54 views
4

我读Struts2的行动,并表示,如果拦截乙拦截一个,并火灾判定:控制不应该被允许去行动(因为可能有验证错误如DefaultWorkFLowInterceptor所做的那样)。然后它返回“输入”..页面呈现给用户。该控制然后返回到拦截器A,但A现在不能修改结果,因为该页面已被发送到客户端。为什么Struts 2拦截器不能修改后续拦截器生成的'result'页面?

,但由于拦截回报只是一个字符串,拦截一个可以简单地返回它的位置另一个字符串,并将结果的变化。 DefaultWorkFLowInterceptor只返回一个字符串,它实际上并没有向响应流写任何东西,所以当控制返回到它的前面的拦截器时,他们为什么不能改变输入?

回答

0

我的印象是一个拦截调用另一个拦截器(因此,通过拦截器返回的字符串是由它的前一个接收的下,它可以修改)。实际上,拦截器会调用类的调用方法,该类调用下一个拦截器。这也意味着拦截器返回的结果字符串将首先被ActionInvocation收到,它可以在将控制权传递给上述拦截器之前实际呈现给客户端的响应页面。

7

即使您更改了结果字符串,它的结果已经呈现给客户端(UI)也为时已晚。

拦截器调用发生的顺序相反,因此任何后处理工作都可以完成,如清理任何资源或编写任何关键信息。

如果您有兴趣更改结果,您可以使用PreResultListener。PreResultListener可以影响拦截器/操作阶段和结果阶段之间的操作调用。典型的用途包括切换到不同的结果或在结果执行前以某种方式修改Result或Action对象。

有关详情,请参阅文档

+0

我想在这里提出一个小修正。拦截器可以在执行动作之前[和/或]之前执行。需要后处理的拦截器只能以相反的顺序调用,并不是所有的拦截器都不会参与。请检查你的第二点。 – 2012-03-30 13:21:53

+0

@MohanaRaoSV:同意,这是关于我们配置的拦截器堆栈,以及我如何解释S2通过拦截器层的通用流程,以及它们在过程中实际做了什么 – 2012-04-02 02:17:48