Приветствую всех.
Это уже 5 статья из цикла статей для подготовки с Spring Professional Certification.
- Внедрение зависимостей, контейнер, IoC, бины
- AOP (аспектно-ориентированное программирование)
- JDBC, транзакции, JPA, Spring Data
- Spring Boot
- Spring MVC
- Spring Security
- REST
- Тестирование
Напомню, что эти статьи — это ответы на вопросы из официального гида от Pivotal для подготовки к сертификации.
MVC — это специальный шаблон. Он делит программу на 3 вида компонентов:
- Model — модель отвечает за хранение данных.
- View — отвечает за вывод данных на фронтенде.
- Controller — отвечает за обмен данными с view. Он оперирует моделями.
Это одна из главных частей MVC для обмена данными. Это главный сервлет, распределяющий запросы между обычными сервлетами.
- Он получает запросы и отправляет их зарегистрированным обработчикам
- Обрабатывает views, сопоставляя их имена с объектами ViewResolver
- Обрабатывает возникающие исключения
- Запрос приходит в DispatcherServlet
- DispatcherServlet отправляет запрос на один из контроллеров, основываясь на URL из запроса
- Контроллер обрабатывает запрос, делегирует выполнение бизнес-логике бизнес-слою (как правило это классы с аннотацией
@Service
), и создает модель с данными, которую и отправляет обратно в DispatcherServlet - DispatcherServlet отправляет модель на фронт для вью, основываясь на интерфейсе ViewResolver(подробнее об этом ниже)
DS создается перед созданием ApplicationContext’а.
Начиная со Spring 3.2 используется реализация интерфейса WebApplicationInitializer под названием AbstractAnnotationConfigDispatcherServletInitialize.
AbstractAnnotationConfigDispatcherServletInitializer создает и DispatcherServlet и ContextLoaderListener.
Настроить DS можно двумя способами:
- Определив специальные свойства в web.xml
- Переопределив AbstractAnnotationConfigDispatcherServletInitializer
Это специальный контекст для веб-приложения.
У него есть все возможности обычного ApplicationConext(т.к. он наследуется от него), но у него также есть методы для стандартного Servlet API.
Примечание: скоуп — область видимости.
Scope | Описание |
---|---|
Request |
Область видимости — 1 HTTP запрос. На каждый запрос создается новый бин |
Session |
Область видимости — 1 сессия. На каждую сессию создается новый бин |
Application |
Область видимости — жизненный цикл ServletContext |
WebSocket |
Область видимости — жизненный цикл WebSocket |
Session scoped bean это бин который существует пока существует сессия. Он может использоваться при создании корзины в интернет-магазине, и т.п.
Также как в Spring без MVC — singleton.
Аннотация Controller используется для регистрации обработчиков http-запросов. Это class-level аннотация, которая содержит аннотацию Component. Класс-контроллер выглядит как обычный POJO, с методами-обработчиками и аннотациями.
- DispatcherServlet получает запрос
- DS содержит список классов, реализующих интерфейс
HandlerMapping
- Находит там метод обработчик и отправляет запрос к нему в класс-контроллер
- Метод-обработчик выполняет запрос
Это аннотация в основном используется для указания URI для класс-контроллера. Раньше ее использовали методов класса, чтобы указать URI, http-метод, тип отправляемых данных, и т.п. В более новых версиях Spring ее заменили на аннотации @GetMapping, @PostMapping, и т.п. Теперь она используется только для указания URI до класса-контроллера.
Это более узкие аннотации для маппинга http-методов.
@GetMapping
— Обрабатывает get-запросы@PostMapping
— Обрабатывает post-запросы@DeleteMapping
— Обрабатывает delete-запросы@PutMapping
— Обрабатывает put-запросы@PatchMapping
— Обрабатывает patch-запросы
Все написанное ниже характерно также и для других аннотаций.
Аннотация @GetMapping — это просто аннотация которая содержит @RequestMapping(method = RequestMethod.GET).
Она также позволяет более глубоко настроить метод-обработчик.
Ее параметры(они конвертируются в аналогичные параметры @RequestMapping):
path
— URIheaders
— заголовкиname
— имя обработчикаparams
— параметрыproduces
— тип возвращаемых данных(JSON, XML, текст). Используется в RESTconsumes
— тип принимаемых данных. Используется в REST
По умолчанию аннотация принимает путь до метода.
@GetMapping("managers") = @GetMapping(path = "managers")
Эта аннотация используется для того чтобы методы обработчики могли получить параметры из http-запроса.
Запрос с параметрами: http://localhost:8080/getByName/name=Ivan
.
Следующий код поместит в переменную name
строку Ivan
.
@GetMapping("getByName")
public User getUserByName(@RequestParam("name") String name) {
//some logic
}
Эта аннотация получает определенную часть из URI.
URI: http://localhost:8080/getById/23
Следующий код поместит в переменную id
значение 23
.
@GetMapping("getById/_{id}_") public User getUserById(@PathVariable("id") String id) { //some logic
}
Методы в классе-контроллере могут использовать некоторые типы объектов в качестве принимаемых аргументов. Тогда Spring автоматически внедрит их. Например, нужный объект HttpSession, Security, и т.п.
@GetMapping public User getUserById(HttpSession session) {
//some logic
//у вас будет объект нужной сессии
}
@MatrixVariable
— Указывает, что параметр должен быть связан с парой имя-значение из URI.@RequestHeader
— Указывает, что параметр должен быть связан с заголовком веб-запроса.@CookieValue
— Указывает, что параметр должен быть связан с куки.
Параметр может быть объявлен как тип Cookie или как тип значения cookie (String, int и т.д.).@ModelAttribute
— Указывает, что параметр связан с именованным атрибутом модели, доступным для view.@SessionAtribute
— Указывает, что параметр связан с атрибутом из сессии.
Она используется для того чтобы указать что метод оперирует не моделями, а данными. То есть отправляет JSON, XML, текст, и т.п. Обычно она неявно используется в REST-сервисах.
View используется для отображения данных приложения пользователю.
Spring MVC поддерживает несколько поставщиков View(они называются шаблонизаторы) — JSP, JSF, Thymeleaf, и т.п.
Интерфейс View преобразует объекты в обычные сервлеты.
DispatcherServlet содержит список специальных "отображателей" для view, которые основываясь на конфигурации сервлета будут содержать бины реализующие интерфейс ViewResolver.
Процесс отображения view:
- Контроллер возвращает имя view в DispactherServlet
- Имя сопоставляется с именами во
ViewResolver
- Если находится подходящий
ViewResolver
, он возвращает View который должен использоваться при рендеринге. - DS передает модель с данными во View и отображает вывод(html-страницу)
Это объект класса который реализует интерфейс Model и представляет коллекцию пар ключ-значение.
Содержимое модели используется для отображения данных во View.
Например, если View выводит информацию об объекте Customer
, то она может ссылаться к ключам модели, например customerName
, customerPhone
, и получать значения для этих ключей.
Объекты-значения из модели также могут содержать бизнес-логику.