Spring MVC 动态列表表单提交

Posted

技术标签:

【中文标题】Spring MVC 动态列表表单提交【英文标题】:Spring MVC dynamic list form submit 【发布时间】:2015-08-05 15:37:17 【问题描述】:

我有两个 POJO 用于提交 html 表单。一个是包装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].descriptioncourse[2].name/course[2].description,当spring 填充课程的日程对象时,ArrayList 中的第二个索引将是一个所有值都设置为空的 Course 对象。

我想知道如何防止这种情况发生。 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 对象,数组列表中的第二个是 name 和 description 都设置为 null 的 course 对象。

【问题讨论】:

在删除(在 JS 中)您还“重新计算”索引时会发生什么,即之后您将只有 course[0] 和 course[1]? 【参考方案1】:

您必须帮助 Spring 在 Controller 上执行此操作。发送表单时,它应该发送如下内容:

["name" :name,"description":description, 此处为第二个对象]

到带有表单发布 URL 映射的 Controller 方法。

可以让控制器方法通过 @ModelAttribute 和您的 Schedule 对象自动将上述内容映射到一个对象。 Spring 不会关心索引的差距,因为它只会关心对象是否正确发送来构建它,即您如何发送课程对象。

【讨论】:

我忘了提到我正在使用 ModelAttribute 来映射它。我只是不喜欢这样一个事实,即当我确实有一个间隙并将其发送到 Spring 时,Spring 将间隙表示为一个实例化对象,该对象中的所有属性都为 null。我只是希望 Spring 甚至不包含该对象。 只有在发送之前没有完全删除 JSP 文件中的相应 div 时才会发生这种情况。Spring 无法映射不存在的东西。它为您映射 null,因为对象 /div 仍然存在在发送时的表单中,因此它被映射。 我检查了发布请求,它正在发布这些数据:courses[0].name = "course 1" courses[0].description = "description for course 1" courses[2].name = "course 3" courses[2].description = "description for courses 3" 但我的数组列表仍然有 3 个对象

以上是关于Spring MVC 动态列表表单提交的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc 表单提交问题!!关于date类型!!

Spring MVC - 多个提交按钮到表单

spring mvc 提交表单汉字乱码

spring-mvc 如何把页面表单提交过来的值注入到对应的实体里面

动态创建的表单将 null 提交给控制器 (MVC)

由于 Spring MVC 中不存在 URL,验证表单提交按钮在第二次尝试后返回 404