Spring MVC提交编辑表单后Controller无法获取List类型表单数据问题
解决方案
核心原因
Spring MVC 绑定集合类型的表单参数时,要求表单字段的name属性必须符合[索引下标].属性名的格式,且集合需要通过外层对象封装才能被@ModelAttribute正确识别。你当前遍历生成的输入框没有带索引标识,也没有对应的外层表单封装类,导致参数无法映射到ArrayList。
修复步骤
1. 修改JSP表单遍历逻辑
给<c:forEach>添加varStatus属性获取遍历索引,输入框的path属性带上索引下标:
<form:form method="POST" action="EditSpringFallPlanNumberActionForm" modelAttribute="EditSpringFallPlanNumberFormAttribute" role="form"> <!-- 添加varStatus属性获取当前遍历的索引 --> <c:forEach var="springFallPlanNumberValue" items="${SPRING_FALL_PLAN_NUMBER_LIST}" varStatus="status"> <!-- UID输入框 --> <form:input path="planNumberList[${status.index}].uid" /> <!-- Fall Plan Number输入框 --> <form:input path="planNumberList[${status.index}].fallPlanNumber" /> <!-- Spring Plan Number输入框 --> <form:input path="planNumberList[${status.index}].springPlanNumber" /> </c:forEach> <button type="submit">提交</button> </form:form>
2. 新增外层表单封装类
你不能直接用ArrayList作为@ModelAttribute的绑定对象,需要新增一个外层类封装List集合:
// 外层表单封装类 public class EditSpringFallPlanNumberForm { private List<FallSpringPlanNumber> planNumberList; // 必须保留无参构造方法,Spring初始化对象需要 public EditSpringFallPlanNumberForm() {} // 必须补全属性的Getter和Setter方法 public List<FallSpringPlanNumber> getPlanNumberList() { return planNumberList; } public void setPlanNumberList(List<FallSpringPlanNumber> planNumberList) { this.planNumberList = planNumberList; } }
3. 修改Controller接收逻辑
把接收参数替换为外层封装类即可:
@PostMapping("/EditSpringFallPlanNumberActionForm") public String editPlanNumber(@ModelAttribute("EditSpringFallPlanNumberFormAttribute") EditSpringFallPlanNumberForm form) { List<FallSpringPlanNumber> fallSpringPlanNumber = form.getPlanNumberList(); // 此时fallSpringPlanNumber即可正常获取到提交的所有表单数据 }
注意事项
FallSpringPlanNumber类必须提供无参构造方法,以及所有需要绑定属性的Getter、Setter方法- 表单提交的索引必须是连续的整数,不能出现跳号,否则索引中断后的内容会无法绑定
- 如果有动态新增/删除行的需求,提交前需要重新整理所有输入框的索引,保证连续性
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

