首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC ModelAndView 核心用法:一張圖看懂數據與視圖解耦

     編輯:程式設計綜合問答

ModelAndView 是什麼?

org.springframework.web.servlet.ModelAndView 是 Spring MVC 的返回值容器,封裝兩樣東西:

  • Model:Map<String, Object>,攜帶渲染視圖所需的數據(如列表、表單對象、分頁信息)
  • View:邏輯視圖名(如 "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 保留在 request
  • JSON 視圖:配置 MappingJackson2JsonView,返回 new ModelAndView(jsonView, "data", list) 直接輸出 JSON
  • 異常處理:@ExceptionHandler 方法返回 ModelAndView 統一錯誤頁

對比:String vs ModelAndView vs ResponseEntity

返回類型適用場景靈活度
String純頁面跳轉,無數據或數據極少低
ModelAndView需攜帶多對象、指定視圖、重定向/轉發控制高
ResponseEntity<T>REST API,精確控制 HTTP 狀態碼、Header、Body最高

參考資源

圖文詳解:Spring MVC ModelAndView 深度解析

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved