Java直通车系列15【Spring MVC】(ModelAndView 使用)

目录

[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 中一种方便的方式,用于在控制器和视图层之间传递数据和指定视图。

相关推荐
JouJz6 分钟前
Java虚拟机之垃圾收集(一)
java·开发语言·jvm
uhakadotcom10 分钟前
OpenHands:AI 驱动的软件开发框架
后端·面试·github
源码姑娘18 分钟前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计
morris13123 分钟前
【redis】布隆过滤器的Java实现
java·redis·布隆过滤器
uhakadotcom24 分钟前
FinGPT:金融领域的开源语言模型框架
后端·面试·github
五行星辰37 分钟前
Java链接redis
java·开发语言·redis
编程毕设37 分钟前
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
java·微信小程序·小程序
异常驯兽师40 分钟前
Java集合框架深度解析:List、Set与Map的核心区别与应用指南
java·开发语言·list
计算机学姐1 小时前
基于Asp.net的教学管理系统
vue.js·windows·后端·sqlserver·c#·asp.net·visual studio
Asthenia04121 小时前
TCP的阻塞控制算法:无控制随便发/固定窗口/慢启动+阻塞避免/快恢复/TCP Cubic/BBR
后端