JavaRush /Курсы /Модуль 5. Spring /Архитектура Spring MVC: контроллеры, модели, представлени...

Архитектура Spring MVC: контроллеры, модели, представления

Модуль 5. Spring
7 уровень , 1 лекция
Открыта

Начнем с небольшой аналогии, чтобы было проще понять суть Spring MVC. Давайте сравним Spring MVC с компиляцией и запуском программы:

  • Модель — это компилятор, который обрабатывает исходный код. Он применяет логику, проверяет синтаксис, оптимизирует и создает исполняемый код. Компилятор не заботится о том, как программа будет отображаться - он фокусируется на корректной обработке данных.
  • Контроллер — это операционная система. Она получает команды пользователя, направляет их нужным процессам, управляет памятью и ресурсами, координирует работу всех компонентов.
  • Представление — это графический интерфейс программы. Он берет обработанные данные и показывает их пользователю в понятном виде — через окна, кнопки, формы. Эта архитектура, как и Spring MVC, разделяет обработку данных, управление и отображение на отдельные компоненты, делая код более организованным и поддерживаемым. Spring MVC реализует этот паттерн, разделяя ответственность между этими компонентами. Давайте же посмотрим на каждый из них в деталях.

Контроллеры: дирижеры запросов

Контроллеры — это сердце Spring MVC. Они принимают HTTP-запросы, обрабатывают их и возвращают результат. Это своего рода дирижеры, которые управляют взаимодействием между моделью и представлением.

Создание контроллера

Контроллеры в Spring обозначаются с помощью аннотации @Controller. Вот пример простейшего контроллера:


@Controller
public class HelloController {

    @GetMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Привет, Spring MVC!");
        return "hello"; // Возвращает имя представления
    }
}

Как это работает?

  1. Когда пользователь открывает ссылку /hello, этот запрос перехватывается контроллером.
  2. Контроллер добавляет данные в объект Model и возвращает имя представления hello.
  3. Представление, связанное с именем hello, будет обработано и отображено.

Типы контроллеров

  • Классические контроллеры: используют аннотацию @Controller. Они работают в связке с представлениями.
  • REST-контроллеры: используют @RestController, оптимизированы для работы с REST API и возвращают JSON или XML, а не HTML-страницы.

Пример REST-контроллера:


@RestController
public class ApiController {

    @GetMapping("/api/greeting")
    public String getGreeting() {
        return "Привет из REST API!";
    }
}
Примечание:

мы будем глубже изучать REST-контроллеры в следующих темах. Ну а пока что сосредоточимся на классическом @Controller.


Модели: передача данных

Модель в Spring MVC используется для хранения данных, которые передаются от контроллера к представлению. Основная задача модели — быть "контейнером" данных.

Давайте рассмотрим пример:


@Controller
public class UserController {

    @GetMapping("/user")
    public String getUser(Model model) {
        model.addAttribute("username", "John Doe");
        return "user"; // Имя представления
    }
}

Объект Model доступен в методах контроллера и позволяет добавлять пары "ключ-значение". Эти пары потом становятся доступны в представлении.

Почему модель так важна?

Представьте, что без модели официанту (контроллеру) пришлось бы готовить блюда (данные) самостоятельно. Это нарушает принцип разделения ответственности, усложняет код, и в итоге официант начнет путаться.

Модель позволяет четко разделить:

  • Логику обработки данных (модель).
  • Логику их представления (представление).
  • Логику маршрутизации запросов (контроллер).

Представления: красота в браузере

Представление — это конечный результат работы вашего приложения, который пользователь видит в браузере. Spring MVC поддерживает несколько технологий представления:

  • JSP (Java Server Pages)
  • Thymeleaf (рекомендуемый современный шаблонизатор)
  • FreeMarker
  • Mustache

Мы сосредоточимся на Thymeleaf, так как он активно используется в Spring Boot.

Подключение Thymeleaf

Чтобы использовать Thymeleaf, добавьте его зависимость в ваш pom.xml (если работаешь с Maven):


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Далее создайте файл представления hello.html в директории src/main/resources/templates:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Hello</title>
</head>
<body>
  <h1 th:text="'Сообщение: ' + ${message}"></h1>
</body>
</html>

Обратите внимание на атрибут th:text. Это специальный синтаксис Thymeleaf для вывода данных из модели.

Когда пользователь открывает /hello, Spring MVC рендерит это представление, и в браузере выводится: Сообщение: Привет, Spring MVC!


Взаимодействие компонентов

Давайте свяжем всё воедино. Вот как выглядит цикл обработки запросов в Spring MVC:

  1. Пользователь отправляет HTTP-запрос (например, открывает /hello).
  2. Запрос переходит в контроллер HelloController, который обрабатывает его.
  3. Контроллер добавляет необходимые данные в модель.
  4. Контроллер возвращает имя представления, которое нужно отобразить.
  5. Spring MVC находит соответствующий файл представления в папке templates (или другой настроенной директории).
  6. Thymeleaf рендерит HTML с данными из модели, и результат отправляется пользователю.

Практика: Создание базового MVC-приложения

Шаг 1: Создаём новый контроллер


@Controller
public class ProductController {

    @GetMapping("/product")
    public String getProduct(Model model) {
        model.addAttribute("name", "Ноутбук");
        model.addAttribute("price", 75000);
        return "product";
    }
}

Шаг 2: Создайте файл product.html


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Product</title>
</head>
<body>
  <h1>Продукт: <span th:text="${name}"></span></h1>
  <p>Цена: <span th:text="${price}"></span> ₽</p>
</body>
</html>

Шаг 3: Запускаем приложение

Откройте браузер, перейдите по адресу http://localhost:8080/product и увидите сгенерированную страницу.


Какие проблемы можно встретить?

  1. Пропущенные зависимости. Если вы забыли добавить Thymeleaf в зависимости, Spring MVC не найдет ваши представления, и вы получите ошибку TemplateNotFoundException.
  2. Ошибка при добавлении модели. Если вы пытаетесь вставить в модель объект, который не сериализуем (например, не переопределили toString или использовали внутренние классы), это может вызвать проблемы.
  3. Несоответствие имени представления. Если вы возвращаете имя представления, которого нет в папке templates, Spring MVC вызовет TemplateNotFoundException.

MVC — это важно

Spring MVC играет ключевую роль для создания масштабируемых веб-приложений. Разделение на контроллеры, модели и представления делает код более поддерживаемым и понятным. Вы можете легко изменить одно из представлений, не затронув логику обработки данных, или добавить новый функционал, не боясь "сломать" существующий.

Навыки работы с архитектурой MVC пригодятся вам не только в коде, но и на собеседованиях. Почти каждое интервью на позицию Java-разработчика включает вопросы о принципах MVC и их реализации в Spring.

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Александр Уровень 115
11 ноября 2025
Чтобы пример заработал - пришлось: 1. поместить product.htm в каталог src\main\resources\templates 2. добавить в application.properties: spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.htm