目錄
1.?ModelAndView?概述
2.?ModelAndView?的主要屬性和方法
主要屬性
主要方法
3. 場景示例
示例 1:簡單的?ModelAndView?使用
示例 2:使用?ModelAndView?處理列表數據
示例 3:使用?ModelAndView?處理異常情況
1.?ModelAndView
?概述
在 Spring MVC 中,ModelAndView
?是一個非常重要的類,它用于封裝模型數據和視圖信息,是控制器(Controller)將處理結果傳遞給視圖層的一種常用方式。具體來說:
- 模型(Model):用于存儲處理業務邏輯后得到的數據,這些數據可以在視圖層(如 JSP 頁面)中被訪問和展示。
- 視圖(View):指定最終要渲染的視圖名稱,Spring MVC 會通過視圖解析器(ViewResolver)將視圖名稱解析為具體的視圖資源。
2.?ModelAndView
?的主要屬性和方法
主要屬性
model
:一個?Map
?類型的對象,用于存儲鍵值對形式的模型數據。view
:可以是視圖名稱(String
?類型),也可以是?View
?對象,用于指定要渲染的視圖。
主要方法
ModelAndView()
:無參構造方法,創建一個空的?ModelAndView
?對象。ModelAndView(String viewName)
:通過視圖名稱創建?ModelAndView
?對象。ModelAndView(String viewName, Map<String, ?> model)
:通過視圖名稱和模型數據創建?ModelAndView
?對象。ModelAndView(View view)
:通過?View
?對象創建?ModelAndView
?對象。ModelAndView(View view, Map<String, ?> model)
:通過?View
?對象和模型數據創建?ModelAndView
?對象。addObject(String attributeName, Object attributeValue)
:向模型中添加一個鍵值對數據。addAllObjects(Map<String, ?> modelMap)
:將一個?Map
?中的所有鍵值對添加到模型中。setViewName(String viewName)
:設置視圖名稱。getViewName()
:獲取視圖名稱。getModel()
:獲取模型數據的?Map
?對象。
3. 場景示例
示例 1:簡單的?ModelAndView
?使用
以下是一個簡單的 Spring MVC 控制器示例,演示了如何使用?ModelAndView
?傳遞數據和指定視圖:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class HelloController {@GetMapping("/hello")public ModelAndView sayHello() {// 創建 ModelAndView 對象,并指定視圖名稱ModelAndView modelAndView = new ModelAndView("hello"); // 向模型中添加數據modelAndView.addObject("message", "Hello, Spring MVC!"); return modelAndView;}
}
在上述代碼中:
@GetMapping("/hello")
?注解將?/hello
?的 GET 請求映射到?sayHello
?方法。ModelAndView modelAndView = new ModelAndView("hello");
?創建了一個?ModelAndView
?對象,并指定視圖名稱為?hello
。Spring MVC 會根據視圖解析器的配置,將?hello
?解析為具體的視圖資源(如?hello.jsp
)。modelAndView.addObject("message", "Hello, Spring MVC!");
?向模型中添加了一個鍵為?message
,值為?"Hello, Spring MVC!"
?的數據。
對應的?hello.jsp
?頁面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Hello Page</title>
</head>
<body><h1>${message}</h1>
</body>
</html>
在 JSP 頁面中,可以使用 EL 表達式?${message}
?訪問模型中的數據。
示例 2:使用?ModelAndView
?處理列表數據
以下示例展示了如何使用?ModelAndView
?傳遞列表數據:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.ArrayList;
import java.util.List;@Controller
public class UserController {@GetMapping("/users")public ModelAndView getUsers() {// 模擬獲取用戶列表List<String> users = new ArrayList<>();users.add("Alice");users.add("Bob");users.add("Charlie");// 創建 ModelAndView 對象,并指定視圖名稱ModelAndView modelAndView = new ModelAndView("users");// 向模型中添加用戶列表數據modelAndView.addObject("userList", users);return modelAndView;}
}
對應的?users.jsp
?頁面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><title>User List</title>
</head>
<body><h1>User List</h1><ul><c:forEach items="${userList}" var="user"><li>${user}</li></c:forEach></ul>
</body>
</html>
在上述代碼中,控制器方法?getUsers
?獲取了一個用戶列表,并將其添加到?ModelAndView
?的模型中,視圖名稱為?users
。在?users.jsp
?頁面中,使用 JSTL 的?<c:forEach>
?標簽遍歷用戶列表并展示。
示例 3:使用?ModelAndView
?處理異常情況
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class ErrorController {@GetMapping("/errorTest")public ModelAndView handleError() {ModelAndView modelAndView = new ModelAndView();try {// 模擬拋出異常的操作throw new RuntimeException("An error occurred!");} catch (RuntimeException e) {// 設置錯誤視圖名稱modelAndView.setViewName("error");// 向模型中添加錯誤信息modelAndView.addObject("errorMessage", e.getMessage());}return modelAndView;}
}
對應的?error.jsp
?頁面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Error Page</title>
</head>
<body><h1>Error Occurred</h1><p>${errorMessage}</p>
</body>
</html>
在這個示例中,控制器方法?handleError
?模擬拋出一個異常,捕獲異常后,設置視圖名稱為?error
,并將錯誤信息添加到模型中。在?error.jsp
?頁面中,展示錯誤信息。
通過以上示例可以看出,ModelAndView
?是 Spring MVC 中一種方便的方式,用于在控制器和視圖層之間傳遞數據和指定視圖。