«1. Обзор

В этой статье мы рассмотрим использование основных org.springframework.ui.Model, org.springframework.ui.ModelMap и org.springframework.web.servlet.ModelAndView, предоставляемых Spring MVC.

2. Зависимости Maven

Начнем с зависимости spring-context в нашем файле pom.xml:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

Последнюю версию зависимости spring-context можно найти здесь.

Для ModelAndView требуется зависимость spring-web:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

Последние версии зависимости spring-web можно найти здесь.

И, если мы используем Thymeleaf в качестве нашего представления, мы должны добавить эту зависимость в pom.xml:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

Последнюю версию зависимости Thymeleaf можно найти здесь.

3. Модель

Начнем с самого основного понятия – модели.

Проще говоря, модель может предоставлять атрибуты, используемые для визуализации представлений.

Чтобы обеспечить представление полезными данными, мы просто добавляем эти данные в его объект модели. Кроме того, карты с атрибутами могут быть объединены с экземплярами модели:

@GetMapping("/showViewPage")
public String passParametersWithModel(Model model) {
    Map<String, String> map = new HashMap<>();
    map.put("spring", "mvc");
    model.addAttribute("message", "Baeldung");
    model.mergeAttributes(map);
    return "viewPage";
}

4. ModelMap

Как и интерфейс модели выше, ModelMap также используется для передачи значений для визуализации представления.

Преимущество ModelMap в том, что он дает нам возможность передавать набор значений и обрабатывать эти значения так, как если бы они находились внутри Map:

@GetMapping("/printViewPage")
public String passParametersWithModelMap(ModelMap map) {
    map.addAttribute("welcomeMessage", "welcome");
    map.addAttribute("message", "Baeldung");
    return "viewPage";
}

5. ModelAndView

Последний интерфейс для передачи значений в представление — это ModelAndView.

Этот интерфейс позволяет нам передавать всю информацию, требуемую Spring MVC, за один возврат:

@GetMapping("/goToViewPage")
public ModelAndView passParametersWithModelAndView() {
    ModelAndView modelAndView = new ModelAndView("viewPage");
    modelAndView.addObject("message", "Baeldung");
    return modelAndView;
}

6. Представление

Все данные, которые мы размещаем в этих моделях, используются представлением — «В общем, шаблонное представление для отображения веб-страницы.

Если у нас есть файл шаблона Thymeleaf, предназначенный для методов нашего контроллера в качестве их представления. Параметр, переданный через модель, будет доступен из HTML-кода тимелеафа:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
    <div>Web Application. Passed parameter : th:text="${message}"</div>
</body>
</html>

Параметр, переданный здесь, используется с помощью синтаксиса ${message}, известного как заполнитель. Механизм шаблонов Thymeleaf заменит этот заполнитель фактическим значением атрибута с тем же именем, прошедшего через модель.

7. Заключение

В этом кратком руководстве мы обсудили три основные концепции Spring MVC — Model, ModelMap и ModelAndView. Мы также рассмотрели примеры того, как представление может использовать эти значения.

Как всегда, реализацию всех этих примеров и фрагментов кода можно найти на Github.