DispatcherServlet und web.xml im Spring Boot

1. Übersicht

Das DispatcherServlet ist der Front-Controller in Spring-Webanwendungen. Es wird zum Erstellen von Webanwendungen und REST-Services in Spring MVC verwendet. In einer herkömmlichen Spring-Webanwendung ist dieses Servlet in der Datei web.xml definiert .

In diesem Tutorial migrieren wir Code aus einer web.xml- Datei nach DispatcherServlet in einer Spring Boot-Anwendung. Außerdem ordnen wir der Spring Boot-Anwendung Filter- , Servlet- und Listener- Klassen aus web.xml zu.

2. Maven-Abhängigkeit

Zuerst müssen wir die Spring-Boot-Starter-Web- Maven-Abhängigkeit zu unserer pom.xml- Datei hinzufügen :

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

3. DispatcherServlet

DispatcherServlet empfängt alle HTTP-Anforderungen und delegiert sie an Controller-Klassen.

Vor der Servlet 3.x-Spezifikation wurde DispatcherServlet in der Datei web.xml für eine Spring MVC-Anwendung registriert . Seit der Servlet 3.x-Spezifikation können wir Servlets programmgesteuert mit ServletContainerInitializer registrieren .

Sehen wir uns eine DispatcherServlet- Beispielkonfiguration in der Datei web.xml an :

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

Spring Boot bietet die Spring-Boot-Starter-Webbibliothek zum Entwickeln von Webanwendungen mit Spring MVC. Eine der Hauptfunktionen von Spring Boot ist die automatische Konfiguration. Die automatische Konfiguration von Spring Boot registriert und konfiguriert das DispatcherServlet automatisch . Daher müssen wir das DispatcherServlet nicht manuell registrieren .

Standardmäßig konfiguriert der Spring-Boot-Starter-Web- Starter DispatcherServlet mit dem URL-Muster "/". Daher müssen wir keine zusätzliche Konfiguration für das obige DispatcherServlet- Beispiel in der Datei web.xml vornehmen . Wir können das URL-Muster jedoch mit server.servlet anpassen. * in der Datei application.properties :

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

Mit diesen Anpassungen DispatcherServlet konfiguriert ist, die URL - Muster zu handhaben / baeldung und die Wurzel contextPath wird / Demo . Daher hört DispatcherServlet unter // localhost: 8080 / demo / baeldung / zu.

4. Anwendungskonfiguration

Spring MVC-Webanwendungen verwenden die Datei web.xml als Bereitstellungsdeskriptordatei. Außerdem werden Zuordnungen zwischen URL-Pfaden und den Servlets in der Datei web.xml definiert .

Dies ist bei Spring Boot nicht mehr der Fall. Wenn wir einen speziellen Filter benötigen, können wir ihn in einer Java-Klassenkonfiguration registrieren. Die Datei web.xml enthält Filter, Servlets und Listener.

Wie können wir unsere web.xml auf eine neue Spring Boot-Anwendung portieren, wenn wir von einer herkömmlichen Spring MVC zu einer modernen Spring Boot-Anwendung migrieren möchten ? In Spring Boot-Anwendungen können wir diese Konzepte auf verschiedene Arten hinzufügen.

4.1. Registrieren eines Filters

Lassen Sie uns einen Filter erstellen , indem die Umsetzung der Filter - Schnittstelle:

@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 }

Ohne Spring Boot würden wir unseren CustomFilter konfigurierenin der Datei web.xml :

 customFilter CustomFilter   customFilter /* 

Damit Spring Boot einen Filter erkennen kann, müssen wir ihn nur als Bean mit der Annotation @Component definieren .

4.2. Servlet registrieren

Definieren wir ein Servlet, indem wir die HttpServlet- Klasse erweitern:

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); } } 

Ohne Spring Boot würden wir unser CustomServlet in der Datei web.xml konfigurieren :

 customServlet CustomServlet   customServlet /servlet 

In einer Spring Boot-Anwendung wird das Servlet entweder als Spring @ Bean oder durch Scannen der mit @ WebServlet annotierten Klassen mit einem eingebetteten Container registriert .

Mit dem Spring @ Bean- Ansatz können wir die ServletRegistrationBean- Klasse verwenden, um das Servlet zu registrieren.

Daher definieren wir CustomServlet als Bean mit der ServletRegistrationBean- Klasse:

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

4.3. Registrieren eines Listeners

Definieren wir einen Listener, indem wir die ServletContextListener- Klasse erweitern:

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"); } } 

Ohne Spring Boot würden wir unseren CustomListener in der Datei web.xml konfigurieren :

 CustomListener 

Um einen Listener in einer Spring Boot-Anwendung zu definieren, können Sie entweder die Annotationen @Bean oder @WebListener verwenden .

Mit dem Spring @ Bean- Ansatz können wir die ServletListenerRegistrationBean- Klasse verwenden, um den Listener zu registrieren .

Definieren wir CustomListener als Bean mit der ServletListenerRegistrationBeanKlasse:

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

Beim Starten unserer Anwendung können wir die Protokollausgabe überprüfen, um zu bestätigen, dass der Listener erfolgreich initialisiert wurde:

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

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir gesehen, wie DispatcherServlet- und web.xml- Elemente wie Filter , Servlet und Listener in einer Spring Boot-Anwendung definiert werden. Und wie immer finden Sie den Quellcode für das obige Beispiel auf GitHub.