目录
[1. ModelAndView 概述](#1. ModelAndView 概述)
[2. ModelAndView 的主要属性和方法](#2. ModelAndView 的主要属性和方法)
[3. 场景示例](#3. 场景示例)
[示例 1:简单的 ModelAndView 使用](#示例 1:简单的 ModelAndView 使用)
[示例 2:使用 ModelAndView 处理列表数据](#示例 2:使用 ModelAndView 处理列表数据)
[示例 3:使用 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
传递数据和指定视图:
java
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
页面如下:
html
<%@ 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
传递列表数据:
java
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
页面如下:
html
<%@ 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
处理异常情况
java
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
页面如下:
html
<%@ 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 中一种方便的方式,用于在控制器和视图层之间传递数据和指定视图。