如何在Model Driven拦截器中设置refreshMode之前的结果?

时间:2015-01-15 09:41:30

标签: java parameters struts2 model-driven valuestack

我打算按照Struts2 Documentation中的建议使用refreshModelBeforeResult,但我很困惑是否可以在Action类或struts.xml中设置此属性。除了我在下面尝试的内容之外还有什么东西

<action name="myAction" class="com.stuff.MyActionClass" method="myMethod">
        <result name="myHome" type="tiles">MyHome</result>

        <interceptor-ref name="basicStack" />
        <interceptor-ref name="params"/>  
        <interceptor-ref name="modelDriven"> 
          <param name="refreshModelBeforeResult">true</param> 
        </interceptor-ref>
</action>

1 个答案:

答案 0 :(得分:1)

你问过

  

我很困惑是否可以在Action类或struts.xml中设置此属性

此属性称为参数,可用于参数化拦截器配置或在操作配置中覆盖拦截器。就像你所做的那样,或者喜欢你引用的文档链接中的例子。

<action name="someAction" class="com.examples.SomeAction">
    <interceptor-ref name="modelDriven"> 
      <param name="refreshModelBeforeResult">true</param> 
    </interceptor-ref>
    <interceptor-ref name="basicStack"/>
    <result name="success">good_result.ftl</result>
</action>

在此示例中,将覆盖拦截器配置,这意味着只会配置您使用interceptor-ref标记的那些拦截器。

您无法将此属性设置为该操作,因为它是拦截器参数,而不是操作参数。拦截器是单例,并且仅通过在初始化调度程序(启动时)时构建的配置使用静态参数。

  

除了我尝试过的东西之外还有什么吗

是的,您使用了不同顺序的拦截器。在动作调用期间调用拦截器链时,顺序很重要。因为拦截器可能依赖于彼此的执行。如果在modelDriven之后设置basicStack拦截器,那么包含在此堆栈中的某些拦截器(如params)可能无效。你也被包括params拦截器两次。并且它将被执行两次,更糟糕的是它在将模型推送到值堆栈之前执行。因此,http参数可能未设置为模型,因为模型驱动的操作需要在调用params拦截器之前将模型推送到值堆栈。