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
получает все 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=/foreach
С этими настройками DispatcherServlet
настроен на обработку шаблона URL /foreach,
а корневой contextPath
будет /demo
. Таким образом, DispatcherServlet
прослушивает http://localhost:8080/demo/foreach/.
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
как bean-компонент с классом 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.foreach.demo.listener.CustomListener: CustomListener is initialized
5. Вывод
В этом кратком руководстве мы увидели, как определить элементы DispatcherServlet
и web.xml
, включая filter
, servlet
и listener
в приложении Spring Boot. И, как всегда, исходный код приведенного выше примера можно найти на GitHub .