DispatcherServlet og web.xml i Spring Boot

1. Oversikt

De DispatcherServlet er frontkontrolleren i vårens webapplikasjoner. Den brukes til å lage webapplikasjoner og REST-tjenester i Spring MVC. I en tradisjonell vår-webapplikasjon er denne servletten definert i web.xml fil.

I denne opplæringen overfører vi kode fra a web.xml fil til DispatcherServlet i en Spring Boot-applikasjon. Vi kartlegger også Filter, Servlet, og Lytter klasser fra web.xml til Spring Boot-applikasjonen.

2. Maven avhengighet

Først må vi legge til spring-boot-starter-web Maven avhengighet til vår pom.xml fil:

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

3. DispatcherServlet

DispatcherServlet mottar alle HTTP-forespørslene og delegerer dem til kontrollerklasser.

Før spesifikasjonen for Servlet 3.x, DispatcherServlet ville bli registrert i web.xml fil for et Spring MVC-program. Siden Servlet 3.x-spesifikasjonen kan vi registrere servlets programmatisk ved hjelp av ServletContainerInitializer.

La oss se a DispatcherServlet eksempel konfigurasjon i web.xml fil:

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

Spring Boot gir spring-boot-starter-web bibliotek for utvikling av webapplikasjoner ved bruk av Spring MVC. En av hovedtrekkene i Spring Boot er autokonfigurasjon. Spring Boot-autokonfigurasjonen registrerer og konfigurerer DispatcherServlet automatisk. Derfor trenger vi ikke registrere DispatcherServlet manuelt.

Som standard er spring-boot-starter-web starter konfigurerer DispatcherServlet til URL-mønsteret “/”. Så vi trenger ikke å fullføre noen ekstra konfigurasjon for ovennevnte DispatcherServlet eksempel i web.xml fil. Vi kan imidlertid tilpasse URL-mønsteret ved hjelp av server.servlet.* i application.properties fil:

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

Med disse tilpasningene, DispatcherServlet er konfigurert til å håndtere URL-mønsteret / baeldung og roten kontekststi vil være /demo. Og dermed, DispatcherServlet lytter på // localhost: 8080 / demo / baeldung /.

4. Programkonfigurasjon

Våren MVC webapplikasjoner bruker web.xml filen som en distribusjonsbeskrivelsesfil. Det definerer også kartlegginger mellom URL-stier og servlets i web.xml fil.

Dette er ikke lenger tilfelle med Spring Boot. Hvis vi trenger et spesielt filter, kan vi registrere det i en Java-klassekonfigurasjon. De web.xml filen inneholder filtre, servlets og lyttere.

Når vi ønsker å migrere fra en tradisjonell Spring MVC til en moderne Spring Boot-applikasjon, hvordan kan vi portere vår web.xml til en ny Spring Boot-applikasjon? I Spring Boot-applikasjoner kan vi legge til disse konseptene på flere måter.

4.1. Registrering av en Filter

La oss lage et filter ved å implementere Filter grensesnitt:

@Component offentlig klasse CustomFilter implementerer Filter {Logger logger = LoggerFactory.getLogger (CustomFilter.class); @Override public void init (FilterConfig filterConfig) kaster ServletException {} @Override public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) kaster IOException, ServletException {logger.info ("CustomFilter er påkalt"); chain.doFilter (forespørsel, svar); } // andre metoder}

Uten Spring Boot, ville vi konfigurere vår CustomFilteri web.xml fil:

 customFilter CustomFilter customFilter / * 

For at Spring Boot skal kunne gjenkjenne et filter, trengte vi bare å definere det som en bønne med @Komponent kommentar.

4.2. Registrering av en Servlet

La oss definere en servlet ved å utvide HttpServlet klasse:

offentlig klasse CustomServlet utvider HttpServlet {Logger logger = LoggerFactory.getLogger (CustomServlet.class); @ Override beskyttet ugyldig doGet (HttpServletRequest req, HttpServletResponse resp) kaster ServletException, IOException {logger.info ("CustomServlet doGet () -metoden blir påkalt"); super.doGet (req, resp); } @ Override beskyttet ugyldig doPost (HttpServletRequest req, HttpServletResponse resp) kaster ServletException, IOException {logger.info ("CustomServlet doPost () -metoden blir påkalt"); super.doPost (req, resp); }} 

Uten Spring Boot, ville vi konfigurere vår CustomServlet i web.xml fil:

 customServlet CustomServlet customServlet / servlet 

I en Spring Boot-applikasjon er servletten registrert enten som en Spring @Bønne eller ved å skanne @WebServlet merkede klasser med en innebygd container.

Med våren @Bønne tilnærming, kan vi bruke ServletRegistrationBean klasse for å registrere servleten.

Så vi vil definere CustomServlet som en bønne med ServletRegistrationBean klasse:

@Bean public ServletRegistrationBean customServletBean () {ServletRegistrationBean bean = new ServletRegistrationBean (new CustomServlet (), "/ servlet"); retur bønne; } 

4.3. Registrering av en Lytter

La oss definere en lytter ved å utvide ServletContextListener klasse:

offentlig klasse CustomListener implementerer ServletContextListener {Logger logger = LoggerFactory.getLogger (CustomListener.class); @ Overstyr offentlig ugyldig kontekstInitialisert (ServletContextEvent sce) {logger.info ("CustomListener er initialisert"); } @ Override public void contextDestroyed (ServletContextEvent sce) {logger.info ("CustomListener er ødelagt"); }} 

Uten Spring Boot, ville vi konfigurere vår CustomListener i web.xml fil:

 CustomListener 

For å definere en lytter i en Spring Boot-applikasjon, kan vi bruke enten @Bønne eller @WebListener kommentarer.

Med våren @Bønne tilnærming, kan vi bruke ServletListenerRegistrationBean klasse for å registrere Lytter.

Så la oss definere CustomListener som en bønne med ServletListenerRegistrationBeanklasse:

@Bean public ServletListenerRegistrationBean customListenerBean () {ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean (); bean.setListener (ny CustomListener ()); retur bønne; }

Når vi starter søknaden vår, kan vi sjekke loggutgangen for å se bekreftelse på at lytteren er initialisert:

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

5. Konklusjon

I denne raske opplæringen så vi hvordan vi skulle definere DispatcherServlet og web.xml elementer inkludert filter, servlet, og lytter i en Spring Boot-applikasjon. Og som alltid kan kildekoden for eksemplet ovenfor bli funnet på GitHub.