Подготовка к Spring Professional Certification. Вопросы по Spring MVC

Автор оригинала: MrR0807
  • Перевод

Приветствую всех.


Это уже 5 статья из цикла статей для подготовки с Spring Professional Certification.


Оглавление
  1. Внедрение зависимостей, контейнер, IoC, бины
  2. AOP (аспектно-ориентированное программирование)
  3. JDBC, транзакции, JPA, Spring Data
  4. Spring Boot
  5. Spring MVC
  6. Spring Security
  7. REST
  8. Тестирование

Напомню, что эти статьи — это ответы на вопросы из официального гида от Pivotal для подготовки к сертификации.





MVC это аббревиатура специального паттерна. Что это за паттерн и для чего он нужен?

MVC — это специальный шаблон. Он делит программу на 3 вида компонентов:


  • Model — модель отвечает за хранение данных.
  • View — отвечает за вывод данных на фронтенде.
  • Controller — отвечает за обмен данными с view. Он оперирует моделями.


Что такое DispatcherServlet и где он используется?

Это одна из главных частей MVC для обмена данными. Это главный сервлет, распределяющий запросы между обычными сервлетами.


  • Он получает запросы и отправляет их зарегистрированным обработчикам
  • Обрабатывает views, сопоставляя их имена с объектами ViewResolver
  • Обрабатывает возникающие исключения


Какой жизненный цикл у запроса?
  1. Запрос приходит в DispatcherServlet
  2. DispatcherServlet отправляет запрос на один из контроллеров, основываясь на URL из запроса
  3. Контроллер обрабатывает запрос, делегирует выполнение бизнес-логике бизнес-слою (как правило это классы с аннотацией @Service), и создает модель с данными, которую и отправляет обратно в DispatcherServlet
  4. DispatcherServlet отправляет модель на фронт для вью, основываясь на интерфейсе ViewResolver(подробнее об этом ниже)

Как происходит создание DispatcherServlet’а?

DS создается перед созданием ApplicationContext’а.
Начиная со Spring 3.2 используется реализация интерфейса WebApplicationInitializer под названием AbstractAnnotationConfigDispatcherServletInitialize.


AbstractAnnotationConfigDispatcherServletInitializer создает и DispatcherServlet и ContextLoaderListener.


Настроить DS можно двумя способами:


  • Определив специальные свойства в web.xml
  • Переопределив AbstractAnnotationConfigDispatcherServletInitializer

Что такое WebApplicationContext? Какие дополнительные скоупы он привносит?

Это специальный контекст для веб-приложения.
У него есть все возможности обычного ApplicationConext(т.к. он наследуется от него), но у него также есть методы для стандартного Servlet API.


Примечание: скоуп — область видимости.


Scope Описание
Request Область видимости — 1 HTTP запрос. На каждый запрос создается новый бин
Session Область видимости — 1 сессия. На каждую сессию создается новый бин
Application Область видимости — жизненный цикл ServletContext
WebSocket Область видимости — жизненный цикл WebSocket

Зачем нужен session scope?

Session scoped bean это бин который существует пока существует сессия. Он может использоваться при создании корзины в интернет-магазине, и т.п.


Какая область видимости в MVC используется по умолчанию?

Также как в Spring без MVC — singleton.


Зачем используется аннотация @Controller?

Аннотация Controller используется для регистрации обработчиков http-запросов. Это class-level аннотация, которая содержит аннотацию Component. Класс-контроллер выглядит как обычный POJO, с методами-обработчиками и аннотациями.


Как входящие запросы сопоставляются с методами-обработчиками?
  1. DispatcherServlet получает запрос
  2. DS содержит список классов, реализующих интерфейс HandlerMapping
  3. Находит там метод обработчик и отправляет запрос к нему в класс-контроллер
  4. Метод-обработчик выполняет запрос

Расскажите про аннотацию @RequestMapping

Это аннотация в основном используется для указания URI для класс-контроллера. Раньше ее использовали методов класса, чтобы указать URI, http-метод, тип отправляемых данных, и т.п. В более новых версиях Spring ее заменили на аннотации @GetMapping, @PostMapping, и т.п. Теперь она используется только для указания URI до класса-контроллера.


Что за аннотации @GetMapping, @PostMapping, @DeleteMapping и прочие?

Это более узкие аннотации для маппинга http-методов.


  • @GetMapping — Обрабатывает get-запросы
  • @PostMapping — Обрабатывает post-запросы
  • @DeleteMapping — Обрабатывает delete-запросы
  • @PutMapping — Обрабатывает put-запросы
  • @PatchMapping — Обрабатывает patch-запросы

Все написанное ниже характерно также и для других аннотаций.


Аннотация @GetMapping — это просто аннотация которая содержит @RequestMapping(method = RequestMethod.GET).
Она также позволяет более глубоко настроить метод-обработчик.
Ее параметры(они конвертируются в аналогичные параметры @RequestMapping):


  • path — URI
  • headers — заголовки
  • name — имя обработчика
  • paramsпараметры
  • produces — тип возвращаемых данных(JSON, XML, текст). Используется в REST
  • consumes — тип принимаемых данных. Используется в REST


    По умолчанию аннотация принимает путь до метода.
    @GetMapping("managers") = @GetMapping(path = "managers")



Зачем используется аннотация @RequestParam?

Эта аннотация используется для того чтобы методы обработчики могли получить параметры из http-запроса.


Запрос с параметрами: http://localhost:8080/getByName/name=Ivan.
Следующий код поместит в переменную name строку Ivan.


@GetMapping("getByName") 
public User getUserByName(@RequestParam("name") String name) {     
    //some logic 
}

Зачем нужна аннотация @PathVariable?

Эта аннотация получает определенную часть из 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 — Указывает, что параметр связан с атрибутом из сессии.

Что за аннотация @RequestBody?

Она используется для того чтобы указать что метод оперирует не моделями, а данными. То есть отправляет JSON, XML, текст, и т.п. Обычно она неявно используется в REST-сервисах.


Что может возвращать метод контроллера?
Типы возвращаемых объектов и их описание(английский)

Что такое View?

View используется для отображения данных приложения пользователю.
Spring MVC поддерживает несколько поставщиков View(они называются шаблонизаторы) — JSP, JSF, Thymeleaf, и т.п.
Интерфейс View преобразует объекты в обычные сервлеты.


Как выбирается View в фазе рендеринга? Как отображается View?

DispatcherServlet содержит список специальных "отображателей" для view, которые основываясь на конфигурации сервлета будут содержать бины реализующие интерфейс ViewResolver.


Процесс отображения view:


  1. Контроллер возвращает имя view в DispactherServlet
  2. Имя сопоставляется с именами во ViewResolver
  3. Если находится подходящий ViewResolver, он возвращает View который должен использоваться при рендеринге.
  4. DS передает модель с данными во View и отображает вывод(html-страницу)

Что такое Model?

Это объект класса который реализует интерфейс Model и представляет коллекцию пар ключ-значение.
Содержимое модели используется для отображения данных во View.
Например, если View выводит информацию об объекте Customer, то она может ссылаться к ключам модели, например customerName, customerPhone, и получать значения для этих ключей.
Объекты-значения из модели также могут содержать бизнес-логику.

Поддержать автора
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 0

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое