将JSP迭代器列表传递给Struts 2操作

时间:2017-04-06 20:33:19

标签: jsp struts2 ognl

您好我有一个带有迭代器列表的JSP,它使用getters / setter迭代在操作中创建的对象。我能够将动作中的映射值拉到JSP迭代器,现在我希望能够将JSP迭代器列表传递回动作类来映射对象但是,我意识到它不会调用我的set方法

这是我的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没有被召唤。

2 个答案:

答案 0 :(得分:1)

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

prepare拦截器可以调用您的操作,如果它实现Preparable来执行prepare()方法,您可以初始化要更新的对象。

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

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

答案 1 :(得分:1)

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