如何将要查看的对象列表发送回控制器中的 Post 方法

2022-09-01 07:20:46

假设我有类,我做了一个实例列表,并将这个列表添加到一个.PersonPersonModel

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>

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

@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";
}

但列表未在方法处绑定/获取。personsPOST

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


答案 1

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

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问题有一个很好的例子,也可能帮助你:List<Foo>作为使用弹簧3 mvc的表单支持对象,语法正确吗?


答案 2

正如Shri在ssn771的评论中提到的那样,如果你的绑定列表超过256,那么它会给出这样的错误

org.springframework.beans.InvalidPropertyException : Bean class [com.app.MyPageListVO]的无效属性 'mylist[256]': 属性路径 'mylist[256]' 中的越界索引;嵌套的例外是 java.lang.IndexOutOfBoundsException: Index: 256, Size: 256 at org.springframework.beans.BeanWrapperImpl.getPrope rtyValue(BeanWrapperImpl.java:830) at...

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

法典:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    // this will allow 500 size of array.
    dataBinder.setAutoGrowCollectionLimit(500);
}