我打算按照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>
答案 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
拦截器之前将模型推送到值堆栈。