Spring MVC — основные понятия, архитектура.
Рассмотрим один из самых главных разделов фреймворка Spring — Spring MVC.
Фреймворк Spring Web model-view-controller (MVC) или по нашему модель-представление-контроллер построен вокруг DispatcherServlet, который распределяет запросы по обработчикам. В нём настраивается мэппинг запросов, локали, временные зоны и многое другое. Обработчик по умолчанию строится на аннотациях @Controller и @RequestMapping, которые предоставляют широкий набор гибких методов для обработки запросов. После версии Spring 3.0. механизм @Controller так же позволяет создавать RESTful веб сайты и приложения, используя аннотацию @PathVariable и другие возможности.
В Spring Web MVC вы можете использовать любой объект в качестве команды или объекта с обратной связью; вам нет необходимости реализовывать какой-либо специальный интерфейс фреймворка или базовый класс. Связывание данных в Spring является очень гибким: например, оно рассматривает несоответствие типов как ошибки валидации и поэтому это может быть обработано в приложении, а не в качестве системных ошибок. Таким образом, вам не нужно дублировать свойства бизнес-объектов, в качестве простых нетипизированных строк для ваших объектов форм. Поэтому можно легко обрабатывать неправильные подтверждения (сабмиты) или правильно конвертировать их в строки. Вместо этого, желательно связывать такие объекты напрямую с объектами бизнес логики.
DispatcherServlet
Spring MVC построен вокруг центрального сервлета, который распределяет запросы по контроллерам, а также предоставляет другие широкие возможности при разработке веб приложений. На самом деле DispatcherServlet — полностью интегрированный сервлет в Spring IoC контейнер и таким образом получает доступ ко всем возможностям Spring.
Обработка запросов в DispatcherServlet показана на рисунке ниже. Используется паттерн «pattern-savvy reader», который распознает DispatcherServlet как выражение из шаблона проектирования «Front Controller».
DispatcherServlet — это обычный сервлет (наследуется от базового класса HttpServlet), и его также необходимо описывать в web.xml вашего веб приложения. Вам необходимо указать мэппинг запросов, которые будут обрабатываться в DispatcherServlet, путем указания URL в web.xml. Ниже показана стандартная конфигурация Java EE необходимая для настройки DispatcherServlet:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>example</servlet-name> <url-pattern>/example/*</url-pattern> </servlet-mapping> </web-app> |
Все запросы, начинающиеся с /example будут обработаны в диспетчере с именем example. Также вы можете настроить его с помощью аннотаций:
1 2 3 4 5 6 7 8 9 10 |
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet()); registration.setLoadOnStartup(1); registration.addMapping("/example/*"); } } |
Где WebApplicationInitializer — интерфейс, предоставляемый Spring MVC, который гарантирует инициализацию при старте контейнера.
Краткое описание работы DispatcherServlet
Вернемся к картинке выше. В самом начале входящий запрос попадает в Front controller (для нас он не виден). Далее он перенаправляет его в Controller. Именно за эту часть и отвечает разработчик. После обработки запроса посылается ответ к Front controller, и после этого результат используется для отображения представления. Вот такое легкое описание шаблона проектирования модель-представление-контроллер:). Всё это работает в контейнере сервлетов (на картинке подпись — Tomcat)
Немного более подробно показано на следующей схеме:
Что здесь показано?
- Вначале DispatcherServlet (диспетчер сервлетов) получает запрос, далее он смотрит свои настройки, чтобы понять какой контроллер использовать (на рисунке Handler Mapping).
- После получения имени контроллера запрос передается в него (на рисунке Controller). В контроллере происходит обработка запроса и обратно посылается ModelAndView (модель — сами данные; view (представление) — как эти данные отображать).
- DispatcherServlet на основании полученного ModelAndView ищет какое представление ему использовать (View Resolver) и получает в ответе имя представления View
- В представление передаются данные (model) и обратно, если необходимо, посылается ответ от представления.
Ещё раз основы шаблона mvc:
- Model — представление данных, сами данные
- View — представление, вид, отображение
- Controller — управление, связь между моделью и видом.
Жизненный цикл запроса
Приведу картинку из интернета, которая показывает жизненный цикл запроса. Возможно по ней кому-то будет легче понять как происходит обработка запросов от начала и до конца. В принципе здесь всё тоже самое, но добавлены некоторые пункты, названия которых говорят сами за себя.
Может быть интересно
Spring MVC — WebApplicationContext. Описание интерфейса
Spring MVC – Handler Mapping. Описание интерфейса HandlerMapping
Spring MVC – описание интерфейса ViewResolver
60