如何将 JSP 迭代器列表传递给 Struts 中的操作 2

How to pass JSP iterator list to action in Struts 2

我有一个 JSP 和一个迭代器列表,该列表迭代在使用 getters/setters 的操作中创建的对象。

我能够将映射值从操作拉到 JSP 迭代器,现在我希望能够将 JSP 迭代器列表传递回操作 class 来映射对象,但是,我意识到它不会调用我的 setter 方法。

这是我的 JSP:

<s:iterator  status="stat" value="parameterList" >
    <tr id="<s:property value="#stat.index"/>">
        <td><s:textfield id="parameterList[%{#stat.index}].queryParameter" name="parameterList[%{#stat.index}].queryParameter"  cssClass="size30" labelposition="left"  ></s:textfield> </td>
        <td><s:textfield id="parameterList[%{#stat.index}].parameterValue" name="parameterList[%{#stat.index}].parameterValue"  cssClass="size30" labelposition="left"  ></s:textfield> </td>
    </tr>
</s:iterator>

这是操作的片段:

private List<QueryParameter> parameterList = new ArrayList<QueryParameter>();

public void setParameterList(List<QueryParameter> parameterList) {
    this.parameterList = parameterList;
}

public DQA getDqaObject() {
    return dqa;
}

当我导航到 JSP 时,getter 被调用得很好,但是当我从 JSP 提交时,我期待我放入文本字​​段迭代器的值应调用并更新操作文件中的对象,但未调用 setter。

OGNL 在创建新对象时不会调用 setter 方法。如果你想更新现有的对象,你也不需要它。它应该在填充操作之前进行初始化。

prepare interceptor如果实现了Preparable就可以调用你的action来执行prepare()方法,你可以在其中初始化要更新的对象。

如果您需要一个参数来从数据库中检索您的对象,您可以使用 paramsPrepareParams 拦截器的堆栈。你可以看到描述 Changing parameters after bind in Struts 2.

也不要使用 ModelDriven 接口,因为它在默认情况下无法与上述堆栈一起正常工作。它需要重新配置默认堆栈以使模型在 params interceptor 触发之前推送,否则您必须手动处理参数,即来自操作上下文或已经弃用的 ParametersAware

我解决了这个问题,问题是在我的 getter(我忘记在问题中 post)中有一些逻辑阻止 getter 继续实际调用对象 setter 来设置参数。