Spring MVC映射具有相同名称的多个动态表单元素

时间:2012-12-08 17:00:02

标签: javascript spring jsp spring-mvc

我有一个Spring MVC应用程序,我想知道如何成功地将我的JSP页面中具有相同名称的多个 动态 表单元素映射到我的对象类。例如:

在我的locations.jsp页面中,我有多个下拉框:

<form id="tabs-3-form">
    <input id="locations-1" name="location" />
    <input id="locations-2" name="location" />
    <input id="locations-3" name="location" />
    ... (more can be added or deleted dynamically by user)
</form>

我正在使用jQuery将表单发布到我的控制器:

$("#tabs-3-form").submit(function() {
    $.ajax({
        type: 'POST',
        url: '/searchResults',
        data: $(this).serialize(),
        dataType: 'json',
        success: function(data) {
           ...
        }
    });
    return false;
});

我的LocationsController.java设置如下:

@RequestMapping(value = "/locationResults", method = RequestMethod.POST)
public @ResponseBody LocationsCollection locationsCollection
(
    @ModelAttribute(value = "location") Location location,
    BindingResult result
) 
{   
    LocationsCollection locationsCollection = new LocationsCollection();
    locationsCollection.addLocation(location);

    // Anything else to do here?

    return locationsCollection;
}

LocationsCollection.java只包含Location个对象列表。

我是否需要在输入字段的名称中添加括号? MVC是否会自动映射到List,就像其他表单元素一样?如果有人能提供一个例子,我会很感激。

2 个答案:

答案 0 :(得分:3)

我能够通过以下示例来实现它:http://lifeinide.blogspot.com/2010/12/dynamic-forms-lazylist-and-transparent.html?showComment=1355160197390#c6923871316812590644

然而,我做了一次调整。对于表单名称,我使用了:

<input name="locationList[0].locationName" />

而不是文章建议:

<input name="myFormObject.elements[0].property" />

答案 1 :(得分:-1)

如果您对表单元素使用相同的名称,我认为您需要使用括号。

<c:forEach items="${expenseForm.expenseDetails}" varStatus="i">
  <tr id="expenseDetail_${i.index}" class="lineItemsClass" lineNum="${i.index}">
    <td><form:input path="expenseDetails[${i.index}].description" cssStyle="width: 200px;" /> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].description" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].quantity" cssStyle="width: 60px;" readonly="true"/> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].quantity" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].unitPrice" cssStyle="width: 60px;" readonly="true"/> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].unitPrice" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].total" cssStyle="width: 60px;" /> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].total" /></label></td>
  </tr>
</c:forEach>

这里的expenseDetails是modelAttribute类中的列表。 路径名将用作html表单名称,并将基于索引编制。 上面的代码段对我来说很好。