在 Controller 中,若多個 @RequestMapping 方法需要共同的初始化邏輯(如查詢用戶信息、設置菜單數據),使用 @ModelAttribute 註解的方法會在每個請求處理方法之前自動執行,避免重複代碼。
@Controller
@RequestMapping("/user")
public class UserController {
// 在每個 @RequestMapping 方法前執行
@ModelAttribute
public void initUser(HttpServletRequest request, Model model) {
User user = getCurrentUser(request);
model.addAttribute("currentUser", user); // 所有視圖可直接訪問
model.addAttribute("menus", menuService.getUserMenus(user.getId()));
}
@RequestMapping("/profile")
public String profile() {
// 直接使用 currentUser、menus
return "user/profile";
}
@RequestMapping("/settings")
public String settings() {
return "user/settings";
}
}
@ModelAttribute 方法(按聲明順序)@RequestMapping 方法// 返回值自動放入 Model,key 為 "userVo"
@ModelAttribute("userVo")
public UserVo prepareUserVo(@RequestParam("id") Long id) {
return userService.findById(id);
}
@RequestMapping("/detail")
public String detail(@ModelAttribute("userVo") UserVo userVo) {
// 直接注入準備好的對象
return "user/detail";
}
@ModelAttribute 方法每次請求都會執行,避免耗時操作,必要時緩存@SessionAttributes 實現跨請求數據共享void 時需手動 model.addAttribute()@ExceptionHandler,不影響其他 @ModelAttribute 執行@ModelAttribute 是 Spring MVC 提供的優雅預處理機制,適合提取通用的模型準備邏輯,保持 Controller 方法專注業務處理。善用此特性可顯著減少樣板代碼。