动作链不会将链末端的模型属性重新填充到 Struts 2 中的第二个动作

问题描述 投票:0回答:1

我正在将现有的 Struts 1 应用程序迁移到 Struts 2。我保持

Action
s 和
ActionForm
s 类层次结构相同。

Struts 2 操作

SuperAction
ActionSupport
扩展,并具有
ModerlDriven
成员变量
SuperForm
,而
SubAction
SuperAction
扩展,并具有
ModelDriven
成员变量
SubForm

当然,

SubForm
SuperForm
的子类。
SubAction
SuperAction
都有一些动作方法。

SubAction
构造函数就像:

    public SubAction() {
      subForm = new SubForm();
      this.superForm(this.subForm);
    }

现在,我有一个场景,我从

SuperAction
的映射中调用
SubAction
方法,如下所示:

    <package name="sub-pkg" namespace="/subns" extends="struts-default" strict-method-invocation="true">
        <action name="subAction_*" method="{1}" class="com.company.SubAction">
          <result name="showArchived" type="chain">subAction_list</result>
          <result name="list">/jsps/list_logs.jsp</result>
          <allowed-methods>list, showArchived</allowed-methods>
        </action>
    </package>

SuperAction.showArchived()
操作方法在其成员变量
superForm.setLogMode()
中设置值并返回
String
showArchived
,从映射中可以看出,它与
SubAction.list()
操作方法链接在一起。

此方法利用其成员变量

SuperForm
中的
logMode
属性
subForm
并返回
String
list
来显示
list_logs.jsp

操作链接正在工作,但未传递

SuperForm
属性值
logMode
。在
SuperAction
的情况下,方法链接到
SubAction
方法。

有什么建议吗?

更新:

事实上,我发现了一个普遍的问题,并不是特定于

SuperClass/SubClass
操作。它普遍存在,因为在
type="chain"
操作中使用 ModelDriven
不适用于模型对象。

因此,

chain

 不会在 
chain
 结束时重新填充模型属性到第二个操作。

如有任何建议,我们将不胜感激。

java struts2 action chaining model-driven
1个回答
0
投票

TL;博士

chain

结果使用相同的操作bean创建一个新的
valueStack
并从旧堆栈中填充它。

当调用链式操作时,它有一个

params

 拦截器
堆栈。

当调用

params

 拦截器时,它会填充来自的操作 bean
ActionContext
参数。


您所拥有的属性由

params

 拦截器
填充。如果您缺少一些属性检查请求参数,并且您有属性属性的 getter setter。

动作链正在工作,但没有传递

SuperForm

 属性值


可以从

ModelDriven

 根访问的一些属性应该使用
这个解决方案。

modelDriven

拦截器
将模型推送到top
valueStack
上,因此在JSP中使用它很容易。动作对象位于
模型。因此,可以使用 
[1]
 前缀直接引用。看
OGNL 基础知识

© www.soinside.com 2019 - 2024. All rights reserved.