我有两个用于html表单提交的POJO。一个是包装ArrayList
的包装器。
public Class Schedule {
private List<Course> courses;
// Getter & Setters for courses
}
public Class Course {
private String name;
private String description;
// Getter & Setters for both variables
}
因此,当用户导航到特定的计划网页时,它会查看课程并将其显示为可编辑的文本字段
<form method="post">
<c:forEach var="course" varStatus="status" items="${schedule.courses}>
<div id="${course.id}">
<input type="text" value="${course.name} name="course[${status.index}].name" />
<input type="text" value="${course.description} name="course[${status.index}].description" />
<input type="button" value="Delete"/>
</div>
</c:forEach>
<input type="submit" value="Submit"/>
</form>
当我们点击删除按钮时,我有javascript从视图中删除特定课程。
说我显示3个课程,我决定删除中间课程。提交时遗留的两个课程将发布为course.[0].name/course.[0].description
和course[2].name/course[2].description
,当spring填充课程的计划对象时,ArrayList
中的第二个索引将成为所有课程对象值设置为null。
我想知道如何防止这种情况发生。 Spring可以为我过滤,还是我必须在控制器中自己完成?
感谢。
所以我的帖子请求如下:
courses[0].name = "course 1"
courses[0].description = "description for course 1"
courses[2].name = "course 3"
courses[2].description = "description for courses 3"
但是Spring在ArrayList中填充的是3个Course对象,数组列表中的第二个是一个名称和描述都设置为null的课程对象。
答案 0 :(得分:1)
你必须帮助Spring在Controller上执行它。当表单发送时,它应该发送如下内容:
[{&#34;名称&#34; :name,&#34; description&#34;:description},这里的第二个对象]
使用表单帖子URL的映射到Controller方法。
可以让控制器方法通过@ModelAttribute和Schedule对象自动将上述内容映射到对象。 Spring不会关心索引的差距,因为它只关心对象是否正确发送以构建它,即如何发送一个课程对象。