«1. Обзор

DispatcherServlet — это передний контроллер в веб-приложениях Spring. Он используется для создания веб-приложений и служб REST в Spring MVC. В традиционном веб-приложении Spring этот сервлет определяется в файле web.xml.

В этом руководстве мы перенесем код из файла web.xml в DispatcherServlet в приложении Spring Boot. Кроме того, мы сопоставим классы Filter, Servlet и Listener из web.xml с приложением Spring Boot.

2. Зависимость Maven

Во-первых, мы должны добавить зависимость Maven spring-boot-starter-web в наш файл pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. DispatcherServlet

DispatcherServlet получает все HTTP-запросы и делегирует их классам контроллера.

До спецификации Servlet 3.x DispatcherServlet регистрировался в файле web.xml для приложения Spring MVC. Начиная со спецификации Servlet 3.x, мы можем регистрировать сервлеты программно, используя ServletContainerInitializer.

Давайте посмотрим пример конфигурации DispatcherServlet в файле web.xml:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Spring Boot предоставляет библиотеку spring-boot-starter-web для разработки веб-приложений с использованием Spring MVC. Одной из основных особенностей Spring Boot является автоконфигурация. Автоконфигурация Spring Boot автоматически регистрирует и настраивает DispatcherServlet. Поэтому нам не нужно регистрировать DispatcherServlet вручную.

По умолчанию пускатель spring-boot-starter-web настраивает DispatcherServlet на шаблон URL «/». Таким образом, нам не нужно выполнять какую-либо дополнительную настройку для приведенного выше примера DispatcherServlet в файле web.xml. Однако мы можем настроить шаблон URL-адреса с помощью server.servlet.* в файле application.properties:

server.servlet.context-path=/demo
spring.mvc.servlet.path=/baeldung

С этими настройками DispatcherServlet настроен на обработку шаблона URL-адреса /baeldung, а корневой contextPath будет /demo. Таким образом, DispatcherServlet прослушивает http://localhost:8080/demo/baeldung/.

4. Конфигурация приложения

Веб-приложения Spring MVC используют файл web.xml в качестве файла дескриптора развертывания. Кроме того, он определяет сопоставления между путями URL-адресов и сервлетами в файле web.xml.

Это больше не относится к Spring Boot. Если нам нужен специальный фильтр, мы можем зарегистрировать его в конфигурации класса Java. Файл web.xml включает фильтры, сервлеты и прослушиватели.

Когда мы хотим перейти с традиционного Spring MVC на современное приложение Spring Boot, как мы можем перенести наш файл web.xml в новое приложение Spring Boot? В приложениях Spring Boot мы можем добавить эти концепции несколькими способами.

4.1. Регистрация фильтра

Давайте создадим фильтр, реализовав интерфейс Filter:

@Component
public class CustomFilter implements Filter {

    Logger logger = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        logger.info("CustomFilter is invoked");
        chain.doFilter(request, response);
    }

    // other methods 
}

Без Spring Boot мы настроим наш CustomFilter в файле web.xml:

<filter>
    <filter-name>customFilter</filter-name>
    <filter-class>CustomFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>customFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Чтобы Spring Boot чтобы распознать фильтр, нам просто нужно было определить его как bean-компонент с аннотацией @Component.

4.2. Регистрация сервлета

Давайте определим сервлет, расширив класс HttpServlet:

public class CustomServlet extends HttpServlet {

    Logger logger = LoggerFactory.getLogger(CustomServlet.class);

    @Override
    protected void doGet(
        HttpServletRequest req,
        HttpServletResponse resp) throws ServletException, IOException {
            logger.info("CustomServlet doGet() method is invoked");
            super.doGet(req, resp);
    }

    @Override
    protected void doPost(
        HttpServletRequest req,
        HttpServletResponse resp) throws ServletException, IOException {
            logger.info("CustomServlet doPost() method is invoked");
            super.doPost(req, resp);
    }
}

Без Spring Boot мы бы настроили наш CustomServlet в файле web.xml:

<servlet>
    <servlet-name>customServlet</servlet-name>
    <servlet-class>CustomServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>customServlet</servlet-name>
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

В приложении Spring Boot, сервлет регистрируется либо как Spring @Bean, либо путем сканирования аннотированных классов @WebServlet с помощью встроенного контейнера.

С подходом Spring @Bean мы можем использовать класс ServletRegistrationBean для регистрации сервлета.

Итак, мы определим CustomServlet как компонент с классом ServletRegistrationBean:

@Bean
public ServletRegistrationBean customServletBean() {
    ServletRegistrationBean bean = new ServletRegistrationBean(new CustomServlet(), "/servlet");
    return bean;
}

4.3. Регистрация прослушивателя

Давайте определим прослушиватель, расширив класс ServletContextListener:

public class CustomListener implements ServletContextListener {

    Logger logger = LoggerFactory.getLogger(CustomListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("CustomListener is initialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("CustomListener is destroyed");
    }
}

Без Spring Boot мы настроим наш CustomListener в файле web.xml:

<listener>
    <listener-class>CustomListener</listener-class>
</listener>

Чтобы определить прослушиватель в Spring Boot, мы можем использовать аннотации @Bean или @WebListener.

С подходом Spring @Bean мы можем использовать класс ServletListenerRegistrationBean для регистрации Listener.

Итак, давайте определим CustomListener как bean-компонент с классом ServletListenerRegistrationBean:

@Bean
public ServletListenerRegistrationBean<ServletContextListener> customListenerBean() {
    ServletListenerRegistrationBean<ServletContextListener> bean = new ServletListenerRegistrationBean();
    bean.setListener(new CustomListener());
    return bean;
}

«

2020-09-28 08:50:30.872 INFO 19612 --- [main] c.baeldung.demo.listener.CustomListener: CustomListener is initialized

«После запуска нашего приложения мы можем проверить вывод журнала, чтобы увидеть подтверждение того, что прослушиватель был успешно инициализирован:

5. Заключение