我的数据库表中有多列的表。很少有列是可编辑的,用户输入的值应在点击提交时更新回数据库。为此我有一个foreach循环,其值为bean列表的HashMap。 下面是我的foreach循环:
<c:forEach items="${feeType.value}" var="feeItem" varStatus="feeVar">
<td >[b]<form:checkbox disabled="true" class="editable${ifeeCount}" path="includeFeeValue" value="${feeVar.index}"/> [/b]</td>
<td >${feeItem.feetypeId} </td>
<td >${feeItem.feeValue} </td>
<td >[b]<form:input class="editable${ifeeCount}" disabled="true" path="${feeItem.overridenFee}" value="${feeItem.overridenFee}"/>[/b]</td>
<td><form:errors path="overriddenFee" cssClass="error" /></td>
<td >${feeItem.lastUpdatedBy} </td>
<td >${feeItem.lastUpdatedDate} </td>
<td > ${feeItem.approvedBy}</td>
<td >${feeItem.approvalDate}</td>
<td align="left">[b]<form:input class="editable${ifeeCount}" disabled="true" path="feeComments[${feeVar.index}]"/>[/b]</td>
<td><form:errors path="feeComments" cssClass="error" /></td>
我正在遍历名为feeApprovalByFundId的地图,即map&gt;。如何获取列的更新值,如复选框,输入框?我能够进入String或String数组,但我不知道映射到哪个键。 (例如,Fund1将有10个费用 - 我将在一个hashmap键下)。 我试着像这样迭代:
Collection<List<MyBaseBean>> newList = paswFeeMaintForm.getFeeApprovalByFundId().values();
for(List<MyBaseBean> myList: newList){
for(MyBaseBean myBean : myList){
System.out.println("Overriden fee : "+myBean.getOverridenFee());
}
}
答案 0 :(得分:1)
表单控件绑定中的path
是表示属性绑定表达式的字符串。呈现表单时,Spring知道feeItem
是由于呈现表单控件的JSTL上下文所致。但是在POST时,上下文丢失了,所以feeItem
没有意义。
相反,给定一个这样的表单bean:
public class FormBean {
private Map<Integer, ChildBean> children = new HashMap<>();
public Map<Integer, ChildBean> getChildren() { return children; }
}
public class ChildBean {
private String name;
private String age;
}
这样的控制器:
@ModelAttribute("formBean")
public FormBean createFormBean() {
FormBean bean = new FormBean();
bean.add(new ChildBean("Joe", 5));
bean.add(new Childbean("Sam", 10));
}
@RequestMapping(...)
public String post(@ModelAttribute("formBean") FormBean formBean) { ... }
@RequestMapping(...)
public String get(@ModelAttribute("formBean") FormBean formBean) { ... }
在视图中,您可以这样做:
<form:form modelAttribute="formBean">
<c:forEach items="${formBean.children}" varStatus="s">
<form:input path="children[${s.index}].name" />
<form:input path="children[${s.index}].age" />
</c:forEach>
</form:form>
渲染的表单元素看起来像:
<input type="text" name="children[0].name" />
<input type="text" name="children[0].age" />
<input type="text" name="children[1].name" />
<input type="text" name="children[1].age" />
请注意,这是标准的indexed property语法。现在,在服务器端,有足够的上下文来确定应该修改集合中的哪个项目。
对于地图,以下内容不再适用:
另请注意,您不必返回列表,但可以指定bean方法来获取索引和单个项目,从而允许您定义稀疏集合(如果您尚未提前构建集合)