在提交时将多个值从spring form jsp传递给spring controller

时间:2015-10-09 11:13:48

标签: java spring jsp spring-mvc jstl

我的数据库表中有多列的表。很少有列是可编辑的,用户输入的值应在点击提交时更新回数据库。为此我有一个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());
}
}

1 个答案:

答案 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方法来获取索引和单个项目,从而允许您定义稀疏集合(如果您尚未提前构建集合)