DispatcherServlet и web.xml в Spring Boot

1. Общ преглед

В DispatcherServlet е пред контролера през пролетта на уеб приложения. Използва се за създаване на уеб приложения и REST услуги в Spring MVC. В традиционното пролетно уеб приложение този сървлет е дефиниран във файла web.xml .

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

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

Първо, трябва да добавим зависимостта spring-boot-starter-web Maven към нашия файл pom.xml :

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

3. DispatcherServlet

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

Преди спецификацията на Servlet 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 слуша на // localhost: 8080 / demo / baeldung /.

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

Пролетните MVC уеб приложения използват файла web.xml като файл с дескриптор за разполагане. Също така, той определя съпоставяния между URL пътеките и сървлетите във файла web.xml .

Това вече не е така при Spring Boot. Ако се нуждаем от специален филтър, можем да го регистрираме в конфигурация на 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 бихме конфигурирали нашия CustomFilterвъв файла 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 бихме конфигурирали нашия CustomServlet във файла web.xml :

 customServlet CustomServlet   customServlet /servlet 

В приложението 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 :

 CustomListener 

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

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

И така, нека дефинираме CustomListener като боб със 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.