批量操作是企業級應用的高頻需求。Spring MVC 提供強大的集合類型綁定機制,支援數組、List、Map 等多種形式,配合包裝 POJO 可輕鬆處理批量刪除、批量修改等複雜場景。
需求:用戶勾選多個商品 ID 進行批量刪除。
Controller 定義:直接使用數組接收同名參數。
@RequestMapping("/deleteItems")
public String deleteItems(Integer[] items_id) throws Exception { ... }
前端 JSP:多個 checkbox 共用 name="items_id"。
<c:forEach items="${itemsList}" var="item">
<input name="items_id" type="checkbox" value="${item.id}" /> ${item.name}
</c:forEach>
Spring MVC 會自動將所有同名參數值轉換為 Integer[] 數組注入方法參數。
需求:頁面同時編輯多條商品記錄並一次性提交。
核心技巧:在包裝 VO 中定義 List<ItemsCustom> itemsList 屬性,前端參數名包含索引下標。
包裝類定義:
public class ItemsQueryVo {
private List<ItemsCustom> itemsList;
// getter/setter
}
Controller 方法:
@RequestMapping("/editItemsAllSubmit")
public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception {
// itemsQueryVo.getItemsList() 即包含所有提交的商品對象
return "success";
}
前端命名規則(關鍵):
<c:forEach items="${itemsList}" var="item" varStatus="status">
<input name="itemsList[${status.index}].name" value="${item.name}" />
<input name="itemsList[${status.index}].price" value="${item.price}" />
<input name="itemsList[${status.index}].detail" value="${item.detail}" />
</c:forEach>
格式:包裝VO中的List屬性名[索引].子對象屬性名。索引從 0 開始,需使用 varStatus 獲取。
同理,在包裝類中定義 Map<String, Object> 屬性,前端參數名格式為 map屬性名[key].屬性名。
public class QueryVo {
private Map<String, Object> itemInfo = new HashMap<>();
// getter/setter
}
Controller 直接接收 QueryVo 即可獲取動態提交的鍵值數據。
| 類型 | 參數名格式 | 適用場景 |
|---|---|---|
| 數組 | name="ids" | 簡單同類型值集合(如批量刪除 ID) |
| List | name="listProp[0].field" | 批量提交對象數據(如批量編輯、成績錄入) |
| Map | name="mapProp[key].field" | 動態鍵值對、非固定結構數據 |
注意:List/Map 綁定必須放在包裝 POJO 中,不能直接作為 Controller 方法參數;前端索引必須連續且從 0 開始,否則綁定失敗。