假设我有课程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 List
绑定到控制器上的POST方法..
@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
方法绑定/获取。
是否可以以这种方式绑定列表对象,或者有替代方法吗?
答案 0 :(得分:50)
我认为此链接可以帮助您设置您要执行的操作:
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>
这个问题有一个非常好的例子可能对你有所帮助:List<Foo> as form backing object using spring 3 mvc, correct syntax?
答案 1 :(得分:17)
正如Shri在他的comment ssn771回答中提到的,如果你的绑定列表超过256,那么就会出现错误,如
org.springframework.beans.InvalidPropertyException:无效的属性 bean类的“mylist [256]”[com.app.MyPageListVO]:索引的 属性路径'mylist [256]'中的边界;嵌套异常是 java.lang.IndexOutOfBoundsException:索引:256,大小:256 at org.springframework.beans.BeanWrapperImpl.getPrope rtyValue(BeanWrapperImpl.java:830)at ...
发生此错误是因为默认情况下256是数组和集合自动增长的限制以避免OutOfMemoryErrors
,但是您可以通过在该控制器的@InitBinder
中设置WebDataBinder的AutoGrowCollectionLimit属性来增加此限制。
代码:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// this will allow 500 size of array.
dataBinder.setAutoGrowCollectionLimit(500);
}