2017-04-06 70 views
0

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

这里是我的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被调用,但是当我从JSP提交,我期待我放入文本字​​段迭代器的值应该调用并更新动作文件中的对象,但不会调用setter。

+0

你错过了'getParameterList'。 –

+0

有一个getParameterList,只是忘了复制并粘贴到这个问题 – Dankwansere

+0

作为一个术语的一点,你没有通过一个“迭代器列表”,你依靠价值转换来重建你的参数列表发回请求。 –

回答

1

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

1

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

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

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

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