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 ServletListenerRegistrationBeancustomListenerBean() { 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 .