Рубрики
Без рубрики

DispatcherServlet и web.xml в весеннем ботинке

Узнайте, как перенести код из web.xml файл в DispatcherServlet в приложении Spring Boot.

Автор оригинала: baeldung.

1. Обзор

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

В этом уроке мы перенесем код из web.xml файл в DispatcherServlet в приложении Spring Boot. Кроме того, мы сопоставим Фильтр , Сервлет и Прослушиватель классы из web.xml в приложение Spring Boot.

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

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


    org.springframework.boot
    spring-boot-starter-web

3. DispatcherServlet

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

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

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


    dispatcher
    
        org.springframework.web.servlet.DispatcherServlet
    



    dispatcher
    /

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

По умолчанию spring-boot-starter-web starter настраивает 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 файл.

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

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

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

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

@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 мы бы настроили наш Пользовательский фильтр в web.xml файл:


    customFilter
    CustomFilter



    customFilter
    /*

Для того, чтобы Spring Boot мог распознавать фильтр, нам просто нужно было определить его как боб с аннотацией @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 мы бы настроили наш Пользовательский сервлет в web.xml файл:


    customServlet
    CustomServlet



    customServlet
    /servlet

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

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

Итак, мы определим Пользовательский сервлет как боб с классом 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 мы бы настроили наш Пользовательский прослушиватель в web.xml файл:


    CustomListener

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

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

Итак, давайте определим Пользовательский прослушиватель как компонент с классом ServletListenerRegistrationBean |/:

@Bean
public ServletListenerRegistrationBean customListenerBean() {
    ServletListenerRegistrationBean 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. Заключение

В этом кратком руководстве мы рассмотрели, как определить DispatcherServlet и web.xml элементы, включая фильтр , сервлет и прослушиватель в приложении Spring Boot. И, как всегда, исходный код для приведенного выше примера можно найти на GitHub .