DispatcherServlet e web.xml in Spring Boot

1. Panoramica

Il DispatcherServlet è il front controller nelle applicazioni Web Spring. Viene utilizzato per creare applicazioni Web e servizi REST in Spring MVC. In una tradizionale applicazione web Spring, questo servlet è definito nel file web.xml .

In questo tutorial, migreremo il codice da un file web.xml a DispatcherServlet in un'applicazione Spring Boot. Inoltre, mapperemo le classi Filter , Servlet e Listener da web.xml all'applicazione Spring Boot.

2. Dipendenza da Maven

Per prima cosa, dobbiamo aggiungere la dipendenza Maven spring-boot-starter-web al nostro file pom.xml :

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

3. DispatcherServlet

DispatcherServlet riceve tutte le richieste HTTP e le delega alle classi controller.

Prima della specifica Servlet 3.x, DispatcherServlet veniva registrato nel file web.xml per un'applicazione Spring MVC. A partire dalla specifica Servlet 3.x, possiamo registrare i servlet a livello di codice utilizzando ServletContainerInitializer .

Vediamo una configurazione di esempio di DispatcherServlet nel file web.xml :

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

Spring Boot fornisce la libreria web spring-boot-starter per lo sviluppo di applicazioni web utilizzando Spring MVC. Una delle caratteristiche principali di Spring Boot è l'autoconfigurazione. L'autoconfigurazione di Spring Boot registra e configura DispatcherServlet automaticamente . Pertanto, non è necessario registrare manualmente DispatcherServlet .

Per impostazione predefinita, lo spring-boot-starter-web starter configura DispatcherServlet sul pattern URL "/". Pertanto, non è necessario completare alcuna configurazione aggiuntiva per l' esempio DispatcherServlet sopra riportato nel file web.xml . Tuttavia, possiamo personalizzare il pattern URL utilizzando server.servlet. * nel file application.properties :

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

Con queste personalizzazioni, DispatcherServlet è configurato per gestire il pattern URL / baeldung e il contextPath radice sarà / demo . Pertanto, DispatcherServlet ascolta in // localhost: 8080 / demo / baeldung /.

4. Configurazione dell'applicazione

Le applicazioni Web Spring MVC utilizzano il file web.xml come file descrittore di distribuzione. Inoltre, definisce le mappature tra i percorsi URL e i servlet nel file web.xml .

Questo non è più il caso di Spring Boot. Se abbiamo bisogno di un filtro speciale, possiamo registrarlo in una configurazione di classe Java. Il file web.xml include filtri, servlet e listener.

Quando vogliamo migrare da una tradizionale Spring MVC a una moderna applicazione Spring Boot, come possiamo portare il nostro web.xml in una nuova applicazione Spring Boot? Nelle applicazioni Spring Boot, possiamo aggiungere questi concetti in diversi modi.

4.1. Registrazione di un filtro

Creiamo un filtro implementando l' interfaccia 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 }

Senza Spring Boot, configureremmo il nostro CustomFilternel file web.xml :

 customFilter CustomFilter   customFilter /* 

Affinché Spring Boot sia in grado di riconoscere un filtro, era sufficiente definirlo come un bean con l' annotazione @Component .

4.2. Registrazione di un servlet

Definiamo un servlet estendendo 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); } } 

Senza Spring Boot, configureremmo il nostro CustomServlet nel file web.xml :

 customServlet CustomServlet   customServlet /servlet 

In un'applicazione Spring Boot, il servlet viene registrato come Spring @Bean o scansionando le classi annotate @WebServlet con un contenitore incorporato.

Con l' approccio Spring @Bean , possiamo utilizzare la classe ServletRegistrationBean per registrare il servlet.

Quindi, definiremo CustomServlet come un bean con la classe ServletRegistrationBean :

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

4.3. Registrazione di un ascoltatore

Definiamo un listener estendendo 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"); } } 

Senza Spring Boot, configureremmo il nostro CustomListener nel file web.xml :

 CustomListener 

Per definire un ascoltatore in un'applicazione primavera di avvio, siamo in grado di utilizzare sia i @Bean o @WebListener annotazioni.

Con l' approccio Spring @Bean , possiamo utilizzare la classe ServletListenerRegistrationBean per registrare il Listener .

Quindi, definiamo CustomListener come un bean con ServletListenerRegistrationBeanclasse:

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

All'avvio della nostra applicazione, possiamo controllare l'output del log per vedere la conferma che il listener è stato inizializzato con successo:

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

5. conclusione

In questo breve tutorial, abbiamo visto come definire gli elementi DispatcherServlet e web.xml inclusi filtro , servlet e listener in un'applicazione Spring Boot. E, come sempre, il codice sorgente per l'esempio sopra può essere trovato su GitHub.