我有一个带有
<s:iterator>
标签列表的 JSP,它使用 getter/setter 迭代在操作中创建的对象。
我能够将映射值从操作拉到
<s:iterator>
标签的文本字段,现在我希望能够将文本字段值从 <s:iterator>
传递回操作类以映射对象,但我意识到它不会调用我的 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 提交表单时,我期望放入
<s:iterator>
标记内的文本字段中的值应该传递并更新操作类中的对象,但是setter 没有被调用。
我解决了这个问题,问题是在我的 getter 中(我忘记在问题中发布)有一些逻辑阻止 getter 继续实际调用对象 setter 来设置参数。
OGNL 在创建新对象时不会调用 setter 方法。如果您想更新现有对象,也不需要它。它应该在填充操作之前初始化。
prepare
拦截器可以调用您的操作,如果它实现了Preparable
来执行prepare()
方法,您可以在其中初始化要更新的对象。
如果您需要一个参数来从数据库检索对象,您可以使用
paramsPrepareParams
拦截器的堆栈。您可以查看说明在 Struts 2 中绑定后更改参数。
也不要使用
ModelDriven
接口,因为默认情况下它无法与上述堆栈一起正常工作。它需要重新配置默认堆栈以使模型在 params
拦截器 触发之前推送,否则您必须手动处理参数,即来自操作上下文或已弃用的 ParametersAware
。