Spring MVC可自动将前端表单数组绑定为List,关键在于命名规范(如items[0].id)与后端接收方式(推荐@ModelAttribute包装类),需Item有无参构造、字段名严格匹配、合理初始化List。

Spring MVC 能自动将前端提交的表单数组(如 name="items[0].id"、name="items[1].name")绑定为后端的 List<item></item>,关键在于命名规范 + 合理的接收方式。
前端表单命名必须符合索引格式
Spring MVC 依赖参数名中的方括号索引识别集合结构。支持以下两种常见写法:
-
显式索引:如
<input name="items[0].id" value="1">、<input name="items[0].name" value="苹果">、<input name="items[1].id" value="2">—— 索引连续或不连续均可,Spring 会按序创建 List 元素 -
无索引但同名前缀(需配合初始化):如
<input name="items.id" value="1">、<input name="items.name" value="苹果">多组重复 —— 此时需在 Controller 中提前初始化空 List,否则可能绑定失败或忽略后续项
后端接收需用 @ModelAttribute 或直接方法参数
推荐使用 @ModelAttribute 注解的包装对象,更清晰且支持校验:
public class OrderForm {
private List<Item> items = new ArrayList<>(); // 建议初始化
// getter/setter
}
Controller 方法中直接接收:
立即学习“前端免费学习笔记(深入)”;
@PostMapping("/order")
public String submit(@ModelAttribute OrderForm form) {
List<Item> items = form.getItems(); // 自动填充完成
return "success";
}
也可直接接收 List(较少用,缺乏上下文封装):
@PostMapping("/items")
public String saveItems(@ModelAttribute("items") List<Item> items) { ... }
注意边界情况与常见问题
绑定失败往往不是框架问题,而是细节疏漏:
-
Item 类必须有无参构造函数,否则实例化失败,抛
InstantiationException -
字段名需严格匹配:前端
items[0].itemName对应 Java 的item.setNameName(...)(即 setter 名为setItemName),大小写敏感 -
空值/缺失索引处理:若提交
items[0]和items[2],Spring 会创建长度为 3 的 List,索引 1 处为null(除非配置webDataBinder.setIgnoreInvalidFields(true)) -
类型转换异常:如字符串转数字失败,默认返回 0 或抛异常,可加
@InitBinder自定义 Converter 或使用@NumberFormat注解
进阶:支持动态增删的表单建议
前端 JS 动态添加行时,确保新字段名索引递增且不跳号(如新增第 3 行用 items[2].xxx),或改用「无索引 + 初始化」方式更鲁棒:
在 Controller 中手动初始化:
@GetMapping("/edit")
public String edit(Model model) {
OrderForm form = new OrderForm();
form.setItems(Arrays.asList(new Item(), new Item())); // 预置两条
model.addAttribute("form", form);
return "order-edit";
}
这样即使前端只填了部分字段,List 长度固定,避免因索引缺失导致绑定截断。
















