HandlerAdapters u proljetnom MVC-u

1. Pregled

U ovom ćemo se članku usredotočiti na različite implementacije adaptera za obradu dostupne u Spring Spring okviru.

2. Što je adapter za rukovanje?

The HandlerAdapter je u osnovi sučelje koje olakšava rukovanje HTTP zahtjevima na vrlo fleksibilan način u Spring MVC-u.

Koristi se zajedno s HandlerMapping, koji preslikava metodu na određeni URL.

The DispatcherServlet zatim koristi a HandlerAdapter kako bi se pozvao na ovu metodu. Servlet se ne poziva izravno na metodu - on u osnovi služi kao most između sebe i predmeta rukovatelja, što dovodi do labavog dizajna spajanja.

Pogledajmo razne metode dostupne u ovom sučelju:

javno sučelje HandlerAdapter {logičke podrške (rukovatelj objektima); ModelAndView ručka (zahtjev HttpServletRequest, odgovor HttpServletResponse, rukovatelj objektom) baca iznimku; long getLastModified (zahtjev za HttpServletRequest, rukovatelj objektima); }

The podupire API se koristi za provjeru podržava li određena instanca rukovatelja ili ne. Ovu metodu treba prvo pozvati prije nego što pozovete ručka () metoda ovog sučelja, kako bi se osiguralo da li je instanca obrađivača podržana ili ne.

The drška API se koristi za obradu određenog HTTP zahtjeva. Ova je metoda odgovorna za pozivanje rukovatelja prosljeđivanjem HttpServletRequest i HttpServletResponse objekt kao parametar. Tada rukovatelj izvršava logiku aplikacije i vraća a ModelAndView objekt, koji zatim obrađuje DispatcherServlet.

3. Ovisnost Mavena

Krenimo od ovisnosti o Mavenu kojoj treba dodati pom.xml:

 org.springframework spring-webmvc 5.2.8.OBUSTAVLJANJE 

Najnovija verzija proljeće-webmvc artefakt možete pronaći ovdje.

4. Vrste HandlerAdapter

4.1. SimpleControllerHandlerAdapter

Ovo je zadani adapter za obradu registriran od strane Spring MVC. Bavi se provedbom nastave Kontroler sučelje i koristi se za prosljeđivanje zahtjeva objektu kontrolera.

Ako web aplikacija koristi samo kontrolere, ne trebamo ih konfigurirati HandlerAdapter jer okvir koristi ovu klasu kao zadani adapter za obradu zahtjeva.

Definirajmo jednostavnu klasu kontrolera, koristeći stariji stil kontrolera (implementirajući Kontroler sučelje):

javna klasa SimpleController implementira Controller {@Override public ModelAndView handleRequest (zahtjev HttpServletRequest, odgovor HttpServletResponse) baca iznimku {ModelAndView model = new ModelAndView ("Pozdrav"); model.addObject ("poruka", "Dinesh Madhwal"); model povratka; }}

Slična XML konfiguracija:

The BeanNameUrlHandlerMapping class je klasa mapiranja za ovaj adapter za obradu.

Bilješka: Ako je prilagođeni adapter za obradu definiran u BeanFactory, tada se ovaj adapter ne registrira automatski. Stoga ga trebamo eksplicitno definirati u kontekstu. Ako nije definiran, a mi smo definirali prilagođeni adapter za obradu, dobit ćemo iznimku koja kaže da nije naveden adapter za obrađivač.

4.2. SimpleServletHandlerAdapter

Ovaj adapter za rukovanje omogućuje upotrebu bilo kojeg Servlet raditi s DispatcherServlet za rješavanje zahtjeva. Prosljeđuje zahtjev od DispatcherServlet odgovarajućem Servlet razreda pozivanjem svog servis() metoda.

Grah koji provodi Servlet sučeljem automatski obrađuje ovaj adapter. Nije registriran prema zadanim postavkama i trebamo ga registrirati kao bilo koji drugi uobičajeni grah u konfiguracijskoj datoteci DispatcherServlet:

4.3. AnnotationMethodHandlerAdapter

Ova klasa adaptera koristi se za izvršavanje metoda označenih s @RequestMapping bilješka. Koristi se za mapiranje metoda na temelju HTTP metoda i HTTP staza.

Klasa mapiranja za ovaj adapter je DefaultAnnotationHandlerMapping, koja se koristi za obradu @RequestMapping napomena na razini tipa i AnnotationMethodHandlerAdaptor koristi se za obradu na razini metode.

Ove dvije klase su već registrirane u okviru kada DispatcherServlet je inicijaliziran. Međutim, ako su drugi adapteri za obradu već definirani, tada ih trebamo definirati i u konfiguracijskoj datoteci.

Definirajmo klasu kontrolera:

@Controller javna klasa AnnotationHandler {@RequestMapping ("/ annotedName") public ModelAndView getEfficieeName () {ModelAndView model = new ModelAndView ("Greeting"); model.addObject ("poruka", "Dinesh"); model povratka; }}

The @Controller napomena označava da ova klasa ima ulogu kontrolor.

The @RequestMapping napomena mapira getEfficieeName () metoda na URL /Ime.

Postoje 2 različita načina konfiguriranja ovog adaptera, ovisno o tome koristi li aplikacija konfiguraciju zasnovanu na Javi ili XML konfiguraciju. Pogledajmo prvi način korištenja Java konfiguracije:

@ComponentScan ("com.baeldung.spring.controller") @Configuration @EnableWebMvc javna klasa ApplicationConfiguration implementira WebMvcConfigurer {@Bean public InternalResourceViewResolver jspViewResolver () {InternalResourceViewResorveesResourceViewResolveResorveVesourVesourVesourVesourVesourVesourVesources bean.setPrefix ("/ WEB-INF /"); bean.setSuffix (". jsp"); grah za povratak; }}

Ako aplikacija koristi XML konfiguraciju, postoje dva različita pristupa za konfiguriranje ovog adaptera rukovatelja u kontekstu web aplikacije XML. Pogledajmo prvi pristup definiran u datoteci spring-servlet_AnnotationMethodHandlerAdapter.xml:

The Oznaka se koristi za određivanje paketa za skeniranje kontrolor razreda.

Pogledajmo drugi pristup:

The tag automatski će registrirati ove dvije klase s proljetnim MVC-om. Ovaj je adapter zastario u proljeće 3.2 i nazvan je novi adapter za obradu RequestMappingHandlerAdapter predstavljen je u proljeće 3.1.

4.4. RequestMappingHandlerAdapter

Ova je klasa adaptera predstavljena u proljeće 3.1., Odbacivanjem AnnotationMethodHandlerAdaptor adapter za rukovanje u proljeće 3.2.

Koristi se sa RequestMappingHandlerMapping razred, koji izvršava metode označene sa @RequestMapping.

The RequestMappingHandlerMapping koristi se za održavanje mapiranja URI zahtjeva na obrađivača. Nakon što se dobije rukovatelj, DispatcherServlet upućuje zahtjev odgovarajućem adapteru rukovatelja, koji zatim poziva handlerMethod ().

Mapiranja na razini tipa i na razini metode obrađivana su u dvije različite faze u proljetnoj verziji prije 3.1.

Prva faza bila je odabir kontrolera do DefaultAnnotationHandlerMapping a druga je faza bila pozivanje na stvarnu metodu pomoću AnnotationMethodHandlerAdapter.

Od proljetne verzije 3.1, postoji samo jedna faza, koja uključuje identificiranje kontrolera, kao i koju metodu treba pozvati za obradu zahtjeva.

Definirajmo jednostavnu klasu kontrolera:

@Controller javna klasa RequestMappingHandler {@RequestMapping ("/ requestName") public ModelAndView getEfficieeName () {ModelAndView model = new ModelAndView ("Greeting"); model.addObject ("poruka", "Madhwal"); model povratka; }}

Postoje 2 različita načina konfiguriranja ovog adaptera, ovisno o tome koristi li aplikacija konfiguraciju zasnovanu na Javi ili XML konfiguraciju.

Pogledajmo prvi način korištenja Java konfiguracije:

@ComponentScan ("com.baeldung.spring.controller") @Configuration @EnableWebMvc javna klasa ServletConfig implementira WebMvcConfigurer {@Bean public InternalResourceViewResolver jspViewResolver () {InternalResourceVesource bean.setPrefix ("/ WEB-INF /"); bean.setSuffix (". jsp"); grah za povratak; }}

Ako aplikacija koristi XML konfiguraciju, postoje dva različita pristupa za konfiguriranje ovog adaptera rukovatelja u kontekstu web aplikacije XML. Pogledajmo prvi pristup definiran u datoteci spring-servlet_RequestMappingHandlerAdapter.xml:

I evo drugog pristupa:

Ova će oznaka automatski registrirati ove dvije klase s Spring MVC.

Ako trebamo prilagoditi RequestMappingHandlerMapping, tada moramo ukloniti ovu oznaku iz konteksta aplikacije XML i ručno je konfigurirati u kontekstu aplikacije XML.

4.5. HttpRequestHandlerAdapter

Ovaj adapter za rukovatelje koristi se za rukovatelje koji obrađuju HttpRequests. Provodi HttpRequestHandler sučelje, koje sadrži jedan handleRequest () metoda za obradu zahtjeva i generiranje odgovora.

Tip povrata ove metode je void i ne generira ModelAndView povratni tip koji su proizveli drugi adapteri za rukovanje. U osnovi se koristi za generiranje binarnih odgovora i ne generira prikaz za generiranje.

5. Pokretanje aplikacije

Ako je aplikacija postavljena na lokalnihost s brojem luke 8082 a kontekst-korijen je rukovaoci oprugom mvc:

// localhost: 8082 / spring-mvc-handlers /

6. Zaključak

U ovom smo članku raspravljali o raznim vrstama adaptera za rukovanje dostupnim u Spring Springu.

Većina programera vjerojatno će se držati zadanih vrijednosti, ali vrijedi razumjeti koliko je fleksibilan okvir kada moramo ići dalje od osnova.

Izvorni kod ovog vodiča može se naći u projektu GitHub.