Топ-100Основы Spring MVC. Как работает DispatcherServlet - CodOrbits
LogoCodOrbits

Раздел: Spring MVC

Раздел расскажет о Spring MVC — компоненте Spring для разработки веб-приложений с использованием архитектуры MVC.

Все разделы
Иконка Spring MVC

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

Last updated: 10 мая 2025 г.

Что же такое 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:

1<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
3         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
4                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
5         id="WebApp_ID" version="4.0">
6    
7    <!-- Нам просто нужно определить в web.xml путь к классу DispatcherServlet,
8         передать ему параметром файл конфигурации спринга applicationContext.xml
9         и указать по какому пути будет совершаться переход к DispatcherServlet. Как можно
10         увидеть это обычная конфигурация любого сервлета, которую мы проходили ранее. -->
11    
12    <servlet>
13        <servlet-name>spring</servlet-name>
14        <!-- путь к классу этого сервлета -->
15        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
16        <init-param>
17            <param-name>contextConfigLocation</param-name>
18            <!-- передаем ему параметром файл конфигурации
19                 спринга биннов applicationContext.xml. Там в сервлете DispatcherServlet
20                 этот параметр будет считываться и имя файлика конфигурации биннов
21                 будет там использоваться для создания объекта BeanFactory и биннов
22                 в нем и эти бинны будут в этом сервлете использоваться. -->
23            <param-value>/WEB-INF/applicationContext.xml</param-value>
24        </init-param>
25        <load-on-startup>1</load-on-startup>
26    </servlet>
27
28    <servlet-mapping>
29        <servlet-name>spring</servlet-name>
30        <!-- указать по какому пути будет совершаться переход к DispatcherServlet.
31             слеш означает что переход в DispatcherServlet будет совершаться
32             по любой ссылке, которая начинается с корневого пути
33             то есть с http://localhost:8080/SpringMVCap, а сервлет
34             уже сам будет перенаправлять клиента по тому пути, который указан
35             после SpringMVCap. То есть например ссылка
36             http://localhost:8080/SpringMVCap/FirstJSP/ направит запрос клиента
37             в DispatcherServlet, и уже оттуда запрос клиента будет перенаправлен
38             по пути FirstJSP/. Это уже другой обработчик, не центральный. -->
39        <url-pattern>/</url-pattern>
40    </servlet-mapping>
41</web-app>

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

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

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

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

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

1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3       xmlns:context="http://www.springframework.org/schema/context"
4       xmlns:mvc="http://www.springframework.org/schema/mvc"
5       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6       xsi:schemaLocation="
7       http://www.springframework.org/schema/beans
8       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
9       http://www.springframework.org/schema/context
10       http://www.springframework.org/schema/context/spring-context-3.0.xsd
11       http://www.springframework.org/schema/mvc
12       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
13
14    <!-- DispatcherServlet будет искать классы 
15         с аннотациями в classes чтобы создавать бины-->
16    <context:component-scan base-package="classes"/>
17
18    <!-- с помощью mvc:annotation-driven 
19         указываем DispatcherServlet чтобы он также искал 
20         классы с mvc аннотациями такими как @Controller и другие 
21         и тоже создавал на основе них бины-->
22    <mvc:annotation-driven/>
23
24    <!-- Обработчики (контроллеры) те которые в папке classes будут 
25         перенаправлять клиента на jsp страницу через DispatcherServlet 
26         понятное дело, а не напрямую. Поэтому DispatcherServlet должен 
27         знать где искать страницы и какого формата страницы он должен 
28         искать, название которых ему передают обработчики из папки classes. 
29         То есть какой либо обработчик просит DispatcherServlet 
30         "переведи пожалуйста клиента на страницу с вот таким названием" 
31         и DispatcherServlet это делает производя поиск страницы в папке 
32         которая указана в бине который определен ниже и с расширением 
33         которое указано в бине ниже. -->
34    <!-- Бин ниже ясно дело будет создаваться внутри DispatcherServlet 
35         и использоваться там для целей описанных выше. -->
36    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
37        <property name="prefix">
38            <value>/WEB-INF/jsp/</value>
39        </property>
40        <property name="suffix">
41            <value>.jsp</value>
42        </property>
43    </bean>
44
45    <!-- таким образом если например в контроллере в папке classes 
46         будет передано имя jsp файла "FirstJSP" то в итоге получится 
47         следующее: "/WEB-INF/jsp/FirstJSP.jsp". -->
48</beans>

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

1package classes;
2
3import java.io.*;
4
5// Помечаем этот класс как контроллер.
6// То есть здесь будут находиться обработчики,
7// на которые DispatcherServlet будет перенаправлять
8// запросы клиентов.
9// В applicationContext мы указали, чтобы
10// пакет classes анализировался на наличие аннотаций.
11// DispatcherServlet будет создавать внутри себя
12// особый бин на основе класса, помеченного @Controller,
13// который будет передавать запросы пользователя
14// и возвращать название страницы
15// или объект класса Model с данными.
16@Controller
17public class MVCcontroller {
18    // В этом классе можно увидеть два обработчика.
19    // Если клиент вобьет у себя в браузере адрес
20    // http://localhost:8080/SpringMVCap/FirstJSP
21    // то вызовется первый метод в этом классе,
22    // если http://localhost:8080/SpringMVCap/SecondJSP
23    // то второй. Очевидно, что в @RequestMapping
24    // указывается путь, по которому вызывается
25    // обработчик. Можно вспомнить, что
26    // путь к обработчику указывается в аннотации
27    // @WebServlet над классом сервлета.
28    @RequestMapping("/FirstJSP")
29    // Название метода обработчика может быть любым.
30    // Возвращать этот метод может Model
31    // или название какой-то вьюхи.
32    // Как уже было сказано, это название
33    // возвращается из этого метода внутри
34    // DispatcherServlet, и DispatcherServlet ищет
35    // страницу с таким названием в папке, которая
36    // ему была указана в applicationContext.xml.
37    public String FirstJSP() {
38        // имя jsp, на которую
39        // переводит этот обработчик
40        return "JSPpage";
41    }
42
43    @RequestMapping("/SecondJSP")
44    public String SecondJSP() {
45        // имя jsp, на которую
46        // переводит этот обработчик
47        return "JSPpage1";
48    }
49
50    // Как видим, для всех этих методов
51    // есть общая область видимости в пределах класса,
52    // что очень удобно, то есть можно создать поле
53    // в классе и использовать его
54    // в обоих методах-обработчиках.
55    // Раньше такой общей области видимости не было,
56    // поскольку каждый сервлет писался
57    // в отдельном классе.
58}

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

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

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

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


Следующие уроки

Аннотация RequestMapping

17
мин.

Similar Articles Icon
Divider

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

18
мин.

Similar Articles Icon
Divider

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

18
мин.

Similar Articles Icon