我正在将现有的 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
结束时重新填充模型属性到第二个操作。如有任何建议,我们将不胜感激。
TL;博士
chain
结果使用相同的操作bean创建一个新的valueStack
并从旧堆栈中填充它。当调用链式操作时,它有一个
params
拦截器 堆栈。当调用
params
拦截器时,它会填充来自的操作 beanActionContext
参数。
拦截器填充。如果您缺少一些属性检查请求参数,并且您有属性属性的 getter setter。
动作链正在工作,但没有传递
SuperForm
属性值
ModelDriven
根访问的一些属性应该使用这个解决方案。
拦截器将模型推送到top
的valueStack
上,因此在JSP中使用它很容易。动作对象位于 模型。因此,可以使用[1]
前缀直接引用。看OGNL 基础知识。