「數據回顯」是指表單提交驗證失敗或業務異常時,將用戶剛輸入的數據重新填充到表單中,避免用戶重複錄入,提升體驗。Spring MVC 提供多種自動與手動回顯機制。
Spring MVC 默認行為:Controller 方法參數中的 POJO 對象會自動放入 Request 域,鍵名為類名首字母小寫(如 itemsCustom)。
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(ItemsCustom itemsCustom, BindingResult bindingResult) {
// 校驗失敗直接返回表單頁,頁面可直接用 ${itemsCustom.name} 取值
if (bindingResult.hasErrors()) return "items/editItems";
...
}
可用 @ModelAttribute("customKey") 自定義 Request 域鍵名。
在 Controller 類中標註 @ModelAttribute 的方法,會在每個請求處理方法執行前自動調用,返回值放入 Request 域,適用於下拉選單、字典表等公共數據。
@Controller
public class ItemsController {
// 方法返回值自動放入 request 域,key 為 "itemTypes"
@ModelAttribute("itemTypes")
public Map<String, String> getItemTypes() {
Map<String, String> map = new HashMap<>();
map.put("101", "數碼");
map.put("102", "母嬰");
return map;
}
@RequestMapping("/queryItems")
public String queryItems() {
// 頁面直接可用 ${itemTypes} 渲染下拉框
return "items/queryItems";
}
}
JSP 頁面:
<select name="itemType">
<c:forEach items="${itemTypes}" var="type">
<option value="${type.key}">${type.value}</option>
</c:forEach>
</select>
直接注入 Model 或 ModelMap,手動放入任意鍵值,不受命名約定限制:
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, ItemsCustom itemsCustom, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
model.addAttribute("items", itemsCustom); // 手動指定回顯鍵名
return "items/editItems";
}
...
}
對於非 POJO 的單個參數(如 ID、頁碼),同樣用 model.addAttribute("id", id) 手動回顯。
@ModelAttribute 方法集中管理,避免每個 Handler 重複查詢。Model 完全控制。掌握這三種層次的回顯機制,能從容應對從簡單表單到複雜向導頁的各種數據保持需求。