org.springframework.web.servlet.ModelAndView 是 Spring MVC 的返回值容器,封裝兩樣東西:
"user/list")或 View 實例,由 ViewResolver 解析為具體 JSP/Thymeleaf/FreeMarker 模板// 1. 空構造 + 添加
ModelAndView mav = new ModelAndView();
mav.setViewName("user/list");
mav.addObject("users", userService.findAll());
// 2. 一步到位
ModelAndView mav = new ModelAndView("user/list", "users", userService.findAll());
// 3. 多數據
ModelAndView mav = new ModelAndView("user/detail");
mav.addObject("user", user);
mav.addObject("roles", roleService.findByUserId(user.getId()));
mav.addObject("perms", permissionService.findByUserId(user.getId()));
return mav;
Controller 方法返回 ModelAndView
│
▼
DispatcherServlet 調用 ViewResolver
│
├── 邏輯視圖名 "user/list"
│ │
│ ▼
│ InternalResourceViewResolver
│ prefix="/WEB-INF/views/" + "user/list" + ".jsp"
│ │
│ ▼
│ /WEB-INF/views/user/list.jsp (最終視圖)
│
└── Model 數據自動暴露為 request 域屬性
${users} → request.getAttribute("users")
new ModelAndView("redirect:/user/list") — 觸發客戶端 302,Model 數據自動附加為 URL 參數new ModelAndView("forward:/user/list") — 服務端內部轉發,Model 保留在 requestMappingJackson2JsonView,返回 new ModelAndView(jsonView, "data", list) 直接輸出 JSON@ExceptionHandler 方法返回 ModelAndView 統一錯誤頁| 返回類型 | 適用場景 | 靈活度 |
|---|---|---|
| String | 純頁面跳轉,無數據或數據極少 | 低 |
| ModelAndView | 需攜帶多對象、指定視圖、重定向/轉發控制 | 高 |
| ResponseEntity<T> | REST API,精確控制 HTTP 狀態碼、Header、Body | 最高 |