Основы Spring MVC. Как работает DispatcherServlet
Last updated: 10 мая 2025 г.Что же такое Spring MVC?
Это набор средств для построения веб-приложений. Подобных тем приложениям, которые мы уже разрабатывали, но в отличии от разработки с помощью сервлетов разрабатывать веб-приложения с помощью Spring MVC намного удобнее и эти все удобства будут рассмотрены далее.
Для понимания того, как работает Spring MVC необходимо вспомнить, что такое паттерн Front Controller
.
Помним, что в соответствии с этим паттерном все запросы от клиентов обрабатываются централизованно. То есть все запросы должны в первую очередь приходить на один и тот же обработчик запросов, и далее этот обработчик перенаправляет клиента в другой обработчик, а в какой именно решается исходя из запроса клиента.
В Spring MVC этим центральным обработчиком запросов является специальный сервлет, он называется DispatcherServelet
. Этот сервлет есть в спринг библиотеке, которую мы уже добавили в наш проект в прошлом уроке, нам нужно будет лишь настроить его в web.xml.
Если подробнее то Spring MVC работает так:
- Все запросы сначала идут на DispatcherServlet (Front Controller).
- Model – это то, в чем хранятся данные при передаче в DispatcherServet и из него.
- DispatcherServlet исходя из запроса клиента решает в какой другой контроллер перенаправить данные клиента.
- В контроллере, в который данные клиента были перенаправлены, эти данные обрабатываются, и новые сформированные данные в этом контроллере сохраняются в Model и передаются в DispatcherServlet.
- 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
мин.
Обработка дынных формы в Spring MVC, передача данных в Model
18
мин.
Специальный тег Form в Spring
18
мин.