34

假设我有类Person,我制作了一个Person实例列表并将此列表添加到Model.

List<Person> persons = new ArrayList<Person>();
model.addAttribute("persons",persons);
return "savePersons";

View页面中,我有一个表格:

<form:form method="post" action="savePerson" modelAttribute="persons">
    <c:forEach var="person" items="${persons}">
        <form:input path="person.FName" name="FName" id="FName" value="" />
        <form:input path="person.LName" name="LName" id="LName" value="" />
    </c:forEach>

    <button type="submit"></button>
</form:form>

当我单击提交按钮时,我想将Person ListPOST 绑定到控制器上的方法..

@RequestMapping(value = { "savePerson" }, method = RequestMethod.POST)
public String savePerson(Model model, HttpServletRequest request,
        HttpSession session,@ModelAttribute("persons")List<Person> persons) {
    System.out.println(persons.length);
    return "success";
}

但该persons列表未在该POST方法处绑定/获取。

是否可以以这种方式绑定列表对象,或者是否有替代方法?

4

2 回答 2

53

我认为此链接将帮助您设置要执行的操作:

http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/

在您的表单中,您需要将其修改为:

<form:form method="post" action="savePerson" modelAttribute="persons">
    <c:forEach var="person" items="${persons}" varStatus="status">
        <form:input path="person[${status.index}].FName" name="FName" id="FName" value="" />
        <form:input path="person[${status.index}].LName" name="LName" id="LName" value="" />
    </c:forEach>

这个 SO question 有一个很好的例子,它也可以帮助你:List<Foo> as form backing object using spring 3 mvc,正确的语法?

于 2013-03-18T16:01:16.813 回答
21

正如 Shri 在他对 ssn771 答案的评论中提到的那样,如果您的绑定列表超过 256,那么它会给出错误,例如

org.springframework.beans.InvalidPropertyException:bean 类 [com.app.MyPageListVO] 的无效属性“mylist [256]”:属性路径“mylist [256]”中的越界索引;嵌套异常是 java.lang.IndexOutOfBoundsException: Index: 256, Size: 256 at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:830) at...

发生此错误是因为默认情况下 256 是数组和集合自动增长以避免的 限制,但是您可以通过在该控制器中OutOfMemoryErrors设置 WebDataBinder 的 AutoGrowCollectionLimit 属性来增加此限制。@InitBinder

代码:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    // this will allow 500 size of array.
    dataBinder.setAutoGrowCollectionLimit(500);
}
于 2014-07-11T13:32:23.003 回答