Основы Spring MVC. Как работает DispatcherServlet

Что же такое Spring MVC?

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

Для понимания того, как работает Spring MVC необходимо вспомнить, что такое паттерн Front Controller.

Помним, что в соответствии с этим паттерном все запросы от клиентов обрабатываются централизованно. То есть все запросы должны в первую очередь приходить на один и тот же обработчик запросов, и далее этот обработчик перенаправляет клиента в другой обработчик, а в какой именно решается исходя из запроса клиента.

В Spring MVC этим центральным обработчиком запросов является специальный сервлет, он называется DispatcherServelet. Этот сервлет есть в спринг библиотеке, которую мы уже добавили в наш проект в прошлом уроке, нам нужно будет лишь настроить его в web.xml.

Example

Если подробнее то Spring MVC работает так:

  1. Все запросы сначала идут на DispatcherServlet (Front Controller).
  2. Model – это то, в чем хранятся данные при передаче в DispatcherServet и из него.
  3. DispatcherServlet исходя из запроса клиента решает в какой другой контроллер перенаправить данные клиента.
  4. В контроллере, в который данные клиента были перенаправлены, эти данные обрабатываются, и новые сформированные данные в этом контроллере сохраняются в Model и передаются в DispatcherServlet.
  5. DispatcherServlet перенаправляет клиента, который послал запрос, на View, название которого также было передано ему из контроллера.

Как видим, все запросы и ответы идут через Front Controller.

Также, исходя из описания работы выше, и, собственно, из названия "Spring MVC", очевидно, что Spring MVC тоже реализует архитектру MVC, которую мы уже рассматривали ранее.

Давайте же сконфигурируем этот DispatcherServlet в web.xml. Конфигурируется он как самый обычный сервлет. Мы это уже делали раньше.

web.xml:

spring org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/applicationContext.xml 1 spring /

Давайте теперь добавим в проект некоторые файлы и папки.

В папке classes создадим класс MVCController (имя может быть любым). В этом классе как раз и будут находиться обработчики куда DispatcherServlet перенаправляет запросы.

В папку WEB-INF добавим папку jsp, в которой будут храниться страницы на которые будет перенаправлять клиента DispatcherServlet.

И также добавим, конечно же, applicationContext.xml, в котором определяются бины.

Теперь необходимо сконфигурировать applicationContext.xml. DispatcherServlet будет считывать этот файл и создавать бины.

/WEB-INF/jsp/ .jsp

Теперь давайте создадим класс с обработчиками запросов, которым DispatcherServlet передаёт запросы и которые в ответ возвращают в DispatcherServlet имя страницы, на которую нужно перевести клиента или данные, которые запросил клиент.

package classes; import java.io.*; // Помечаем этот класс как контроллер. // То есть здесь будут находиться обработчики, // на которые DispatcherServlet будет перенаправлять // запросы клиентов. // В applicationContext мы указали, чтобы // пакет classes анализировался на наличие аннотаций. // DispatcherServlet будет создавать внутри себя // особый бин на основе класса, помеченного @Controller, // который будет передавать запросы пользователя // и возвращать название страницы // или объект класса Model с данными. @Controller public class MVCcontroller { // В этом классе можно увидеть два обработчика. // Если клиент вобьет у себя в браузере адрес // http://localhost:8080/SpringMVCap/FirstJSP // то вызовется первый метод в этом классе, // если http://localhost:8080/SpringMVCap/SecondJSP // то второй. Очевидно, что в @RequestMapping // указывается путь, по которому вызывается // обработчик. Можно вспомнить, что // путь к обработчику указывается в аннотации // @WebServlet над классом сервлета. @RequestMapping(“/FirstJSP”) // Название метода обработчика может быть любым. // Возвращать этот метод может Model // или название какой-то вьюхи. // Как уже было сказано, это название // возвращается из этого метода внутри // DispatcherServlet, и DispatcherServlet ищет // страницу с таким названием в папке, которая // ему была указана в applicationContext.xml. public String FirstJSP() { // имя jsp, на которую // переводит этот обработчик return “JSPpage”; } @RequestMapping(“/SecondJSP”) public String SecondJSP() { // имя jsp, на которую // переводит этот обработчик return “JSPpage1”; } // Как видим, для всех этих методов // есть общая область видимости в пределах класса, // что очень удобно, то есть можно создать поле // в классе и использовать его // в обоих методах-обработчиках. // Раньше такой общей области видимости не было, // поскольку каждый сервлет писался // в отдельном классе. }

Помним, что мы добавили в папку jsp два файла страницы. Давайте же перейдем по путям созданных обработчиков и проверим открываются ли эти страницы.

Для начала, запускаем сервер и перейдем в браузере по пути /FirstJSP первого обработчика.

Теперь перейдем в браузере по пути /SecondJSP второго обработчика.

Как видим, обе jsp страницы открылись успешно. Значит и обработчики, и DisparcherServlet, и всё остальное работает корректно.

Аннотация RequestMapping

Изучите аннотацию @RequestMapping в Spring MVC: как создавать несколько контроллеров с одинаковыми путями и управлять маршрутизацией запросов между ними. Примеры кода и объяснения.
Time to read: 17

Обработка дынных формы в Spring MVC, передача данных в Model

Обработка данных формы в Spring MVC: создание формы, обработчиков запросов и передача данных через Model. Разница между GET и POST запросами в Spring.
Time to read: 18

Специальный тег Form в Spring

Spring Form Tag: как использовать form:form для прямой привязки полей объекта к HTML-форме. Генерация геттеров/сеттеров в Eclipse и работа с Model в Spring MVC.
Time to read: 18