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 .