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.