DispatcherServlet et web.xml dans Spring Boot

1. Vue d'ensemble

Le DispatcherServlet est le contrôleur frontal des applications Web Spring. Il est utilisé pour créer des applications Web et des services REST dans Spring MVC. Dans une application Web Spring traditionnelle, ce servlet est défini dans le fichier web.xml .

Dans ce didacticiel, nous allons migrer le code d'un fichier web.xml vers DispatcherServlet dans une application Spring Boot. Nous mappons également les classes Filter , Servlet et Listener de web.xml à l'application Spring Boot.

2. Dépendance de Maven

Tout d'abord, nous devons ajouter la dépendance Maven spring-boot-starter-web à notre fichier pom.xml :

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

3. DispatcherServlet

DispatcherServlet reçoit toutes les requêtes HTTP et les délègue aux classes de contrôleur.

Avant la spécification Servlet 3.x, DispatcherServlet était enregistré dans le fichier web.xml d'une application Spring MVC. Depuis la spécification Servlet 3.x, nous pouvons enregistrer des servlets par programme à l'aide de ServletContainerInitializer .

Voyons un exemple de configuration de DispatcherServlet dans le fichier web.xml :

 dispatcher  org.springframework.web.servlet.DispatcherServlet    dispatcher / 

Spring Boot fournit la bibliothèque spring-boot-starter-web pour le développement d'applications Web à l'aide de Spring MVC. L'une des principales fonctionnalités de Spring Boot est la configuration automatique. L'autoconfiguration de Spring Boot enregistre et configure automatiquement DispatcherServlet . Par conséquent, nous n'avons pas besoin d'enregistrer le DispatcherServlet manuellement.

Par défaut, le démarreur spring-boot-starter-web configure DispatcherServlet avec le modèle d'URL «/». Ainsi, nous n'avons pas besoin de terminer de configuration supplémentaire pour l' exemple de DispatcherServlet ci-dessus dans le fichier web.xml . Cependant, nous pouvons personnaliser le modèle d'URL à l'aide de server.servlet. * dans le fichier application.properties :

server.servlet.context-path=/demo spring.mvc.servlet.path=/baeldung

Avec ces personnalisations, DispatcherServlet est configuré pour gérer le modèle d'URL / baeldung et le contextPath racine sera / demo . Ainsi, DispatcherServlet écoute sur // localhost: 8080 / demo / baeldung /.

4. Configuration de l'application

Les applications Web Spring MVC utilisent le fichier web.xml comme fichier descripteur de déploiement. En outre, il définit les mappages entre les chemins d'URL et les servlets dans le fichier web.xml .

Ce n'est plus le cas avec Spring Boot. Si nous avons besoin d'un filtre spécial, nous pouvons l'enregistrer dans une configuration de classe Java. Le fichier web.xml comprend des filtres, des servlets et des écouteurs.

Lorsque nous voulons migrer d'une application Spring MVC traditionnelle vers une application Spring Boot moderne, comment pouvons-nous porter notre web.xml vers une nouvelle application Spring Boot? Dans les applications Spring Boot, nous pouvons ajouter ces concepts de plusieurs manières.

4.1. Enregistrement d'un filtre

Créons un filtre en implémentant l' interface 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 }

Sans Spring Boot, nous configurerions notre CustomFilterdans le fichier web.xml :

 customFilter CustomFilter   customFilter /* 

Pour que Spring Boot puisse reconnaître un filtre, nous devions simplement le définir comme un bean avec l' annotation @Component .

4.2. Enregistrement d'un servlet

Définissons un servlet en étendant la classe 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); } } 

Sans Spring Boot, nous configurerions notre CustomServlet dans le fichier web.xml :

 customServlet CustomServlet   customServlet /servlet 

Dans une application Spring Boot, le servlet est enregistré en tant que Spring @Bean ou en analysant les classes annotées @WebServlet avec un conteneur intégré.

Avec l' approche Spring @Bean , nous pouvons utiliser la classe ServletRegistrationBean pour enregistrer le servlet.

Nous allons donc définir CustomServlet comme un bean avec la classe ServletRegistrationBean :

@Bean public ServletRegistrationBean customServletBean() { ServletRegistrationBean bean = new ServletRegistrationBean(new CustomServlet(), "/servlet"); return bean; } 

4.3. Enregistrement d'un auditeur

Définissons un écouteur en étendant la classe 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"); } } 

Sans Spring Boot, nous configurerions notre CustomListener dans le fichier web.xml :

 CustomListener 

Pour définir un écouteur dans une application Spring Boot, nous pouvons utiliser les annotations @Bean ou @WebListener .

Avec l' approche Spring @Bean , nous pouvons utiliser la classe ServletListenerRegistrationBean pour enregistrer le Listener .

Alors, définissons CustomListener comme un bean avec le ServletListenerRegistrationBeanclasse:

@Bean public ServletListenerRegistrationBean customListenerBean() { ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(); bean.setListener(new CustomListener()); return bean; }

Au démarrage de notre application, nous pouvons vérifier la sortie du journal pour voir la confirmation que l'écouteur a été initialisé avec succès:

2020-09-28 08:50:30.872 INFO 19612 --- [main] c.baeldung.demo.listener.CustomListener: CustomListener is initialized

5. Conclusion

Dans ce tutoriel rapide, nous avons vu comment définir les éléments DispatcherServlet et web.xml , y compris le filtre , le servlet et l' écouteur dans une application Spring Boot. Et, comme toujours, le code source de l'exemple ci-dessus peut être trouvé sur GitHub.