我打算按照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>

最佳答案

你问过


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


此属性称为参数,它可用于对拦截器配置进行参数化,或在操作配置中覆盖拦截器时使用。就像您所做的一样或喜欢您引用的doc链接中的示例。

<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标记一起使用的那些拦截器。

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


  除了我尝试过的以外,还有什么吗


是的,您以不同的顺序使用了拦截器。在操作调用期间调用拦截器链时,顺序很重要。因为拦截器可能依赖于彼此的执行。如果在modelDriven之后设置basicStack拦截器,则此堆栈中包含的某些拦截器(例如params)可能不起作用。同样,您两次包含params拦截器。而且它将执行两次,更糟糕的是,在将模型压入值堆栈之前,它会执行两次。因此,http参数可能未设置为模型,因为模型驱动的操作要求在调用params拦截器之前将模型推入值堆栈。

关于java - 如何在ModelDriven拦截器中设置refreshModelBeforeResult?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27960534/

10-12 22:31