Vodič za mapiranje rukovatelja opruge

1. Uvod

U proljeće MVC, DispatcherServlet djeluje kao prednji kontroler - prima sve dolazne HTTP zahtjeve i obrađuje ih.

Jednostavno rečeno, obrada se vrši prosljeđivanjem zahtjeva odgovarajućoj komponenti uz pomoć preslikavanja rukovatelja.

HandlerMapping je sučelje koje definira mapiranje između zahtjeva i objekata rukovatelja. Iako Spring MVC okvir pruža neke gotove implementacije, programeri mogu implementirati sučelje kako bi pružili prilagođenu strategiju mapiranja.

Ovaj članak raspravlja o nekim implementacijama koje pruža Spring MVC, naime BeanNameUrlHandlerMapping, SimpleUrlHandlerMapping, ControllerClassNameHandlerMapping, njihova konfiguracija i razlike među njima.

2. BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping je zadani HandlerMapping provedba. BeanNameUrlHandlerMapping mape zahtijevaju URL-ove za grah s istim imenom.

Ovo određeno mapiranje ima podršku za izravno podudaranje imena, a također i za podudaranje uzoraka pomoću uzorka "*".

Na primjer, dolazni URL "/ Foo" preslikava u grah tzv "/ Foo". Primjer mapiranja uzorka je mapiranje zahtjeva za "/ Foo *" na grah s imenima koja počinju sa "/ Foo" Kao "/ Foo2 /" ili “/ FooOne /”.

Konfigurirajmo ovaj primjer ovdje i registrirajmo kontroler graha koji obrađuje zahtjeve za “/BeanNameUrl”:

@Configuration javna klasa BeanNameUrlHandlerMappingConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {return new BeanNameUrlHandlerMapping (); } @Bean ("/ beanNameUrl") javni WelcomeController dobrodošlica () {povratak novog WelcomeController (); }}

Ovo je XML ekvivalent gornjoj konfiguraciji temeljenoj na Javi:

Važno je napomenuti da u obje ove konfiguracije, definiranje graha za BeanNameUrlHandlerMapping nije potrebno kako to pruža Spring MVC. Uklanjanje ove definicije graha neće uzrokovati probleme, a zahtjevi će se i dalje mapirati u registrirani grah za obradu.

Sada svi zahtjevi za “/BeanNameUrl” bit će proslijeđen od DispatcherServlet do "WelcomeController“. WelcomeController vraća naziv pogleda pod nazivom „Dobrodošli“.

Sljedeći kod testira ovu konfiguraciju i osigurava vraćanje ispravnog imena prikaza:

javna klasa BeanNameMappingConfigTest {// ... @Test javna praznina kadaBeanNameMapping_thenMappedOK () {mockMvc.perform (get ("/ beanNameUrl")). and Expect (status (). isOk ()) .andExpect (view (). name ("view (). name (")) Dobrodošli")); }}

3. SimpleUrlHandlerMapping

Dalje, SimpleUrlHandlerMapping je najfleksibilniji HandlerMapping provedba. Omogućuje izravno i deklarativno mapiranje između instanci i URL-ova graha ili između imena i URL-ova graha.

Mapirajmo zahtjeve “/ SimpleUrlWelcome” i “/ * / SimpleUrlWelcome” prema "Dobrodošli" grah:

@Configuration javna klasa SimpleUrlHandlerMappingConfig {@Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = novo SimpleUrlHandlerMapping (); Mapa urlMap = novi HashMap (); urlMap.put ("/ simpleUrlWelcome", dobrodošli ()); simpleUrlHandlerMapping.setUrlMap (urlMap); povratak simpleUrlHandlerMapping; } @Bean public WelcomeController welcome () {return new WelcomeController (); }}

Alternativno, evo ekvivalentne XML konfiguracije:

   / simpleUrlWelcome = dobrodošli / * / simpleUrlWelcome = dobrodošli 

Važno je napomenuti da se u XML konfiguraciji preslikavanje između “” Oznaka mora biti izrađena u obliku koji prihvaća java.util.Vlasnosti klase i trebala bi slijediti sintaksu: staza = Ime_odredbe_bean.

URL bi obično trebao imati kosu crtu, međutim, ako staza ne započinje jednom, Spring MVC dodaje je automatski.

Različiti način konfiguriranja gornjeg primjera u XML-u je upotreba datoteke "rekviziti" svojstvo umjesto "vrijednost". Rekviziti imaju popis "Rekvizit" oznaka gdje svaka definira preslikavanje gdje "ključ" upućen na mapirani URL, a vrijednost oznake je naziv zrna.

   dobrodošli dobrodošli 

Sljedeći test osigurava da zahtjevi za “/simpleUrlWelcome"Obrađuje"WelcomeController ” koji vraća naziv pogleda pod nazivom "Dobrodošli" :

javna klasa SimpleUrlMappingConfigTest {// ... @Test javna praznina kada jeSimpleUrlMapping_thenMappedOK () {mockMvc.perform (get ("/ simpleUrlWelcome")). and Expect (status (). isOk ()) .andExpect (view (). name ("(view (). name")). Dobrodošli")); }}

4. ControllerClassNameHandlerMapping (uklonjeno u proljeće 5)

The ControllerClassNameHandlerMapping preslikava URL na registrirani grah kontrolera (ili kontroler označen s @Controller napomena) koja ima ili započinje istim imenom.

To može biti prikladnije u mnogim scenarijima, posebno za jednostavne implementacije kontrolera koje obrađuju jedan tip zahtjeva. Konvencija koju koristi Spring MVC je da koristi ime klase i ukloni "Kontroler" sufiksa, a zatim promijenite ime u malo slovo i vratite ga kao preslikavanje s vodećom “/”.

Na primjer “WelcomeController” bi se vratio kao mapiranje u "/Dobrodošli*", tj. na bilo koji URL koji započinje s "Dobrodošli".

Konfigurirajmo ControllerClassNameHandlerMapping:

@Configuration javna klasa ControllerClassNameHandlerMappingConfig {@Bean public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping () {return new ControllerClassNameHandlerMapping (); } @Bean public WelcomeController welcome () {return new WelcomeController (); }}

Imajte na umu da ControllerClassNameHandlerMapping je obustavljeno od proljeća 4.3 u korist metoda rukovanja anotacijama.

Još jedna važna napomena je da će se nazivi kontrolera uvijek vraćati malim slovima (minus sufiks "Controller"). Dakle, ako imamo kontroler pod nazivom "WelcomeBaeldungController“, Obrađivat će samo zahtjeve za “/ Welcomebaeldung” a ne da “/ WelcomeBaeldung”.

I u Java konfiguraciji i u XML konfiguraciji u nastavku definiramo ControllerClassNameHandlerMapping grah i registrirajte grah za kontrolere koji ćemo koristiti za obradu zahtjeva. Također registriramo grah tipa “WelcomeController” i taj će grah obraditi sve zahtjeve koji započinju s "/Dobrodošli".

Evo ekvivalentne XML konfiguracije:

Kada koristite gornju konfiguraciju, zahtjevi za “/Dobrodošli"Rješavat će"WelcomeController“.

Sljedeći kod osigurat će da zahtjevi za “/Dobrodošli* "Kao što je" /dobrodošli test"Obrađuje" WelcomeController "koji vraća naziv pogleda pod nazivom"Dobrodošli“:

javna klasa ControllerClassNameHandlerMappingTest {// ... @Test javna praznina kadaControllerClassNameMapping_thenMappedOK () {mockMvc.perform (get ("/ welcometest") .andExpect (status (). isOk ()) .andExpect (view (). Dobrodošli")); }}

5. Konfiguriranje prioriteta

Proljetni MVC okvir omogućuje više od jedne implementacije HandlerMapping sučelje istovremeno.

Stvorimo konfiguraciju i registrirajmo dva kontrolora, oba mapirana na URL “/ welcome”, samo koristeći različito mapiranje i vraćanje različitih imena pogleda:

@Configuration javna klasa HandlerMappingDefaultConfig {@Bean ("/ welcome") public BeanNameHandlerMappingController beanNameHandlerMapping () {return new BeanNameHandlerMappingController (); } @Bean public WelcomeController welcome () {return new WelcomeController (); }}

Bez registriranog eksplicitnog mappera rukovatelja, zadano BeanNameHandlerMapping će se koristiti. Utvrdimo ovo ponašanje testom:

@Test public void whenConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome") .andExpect (status (). IsOk ()) .andExpect (view (). Name ("bean-name-handler-mapping") ); } 

Ako izričito registriramo drugi mapper za obradu, zadani mapper bit će nadjačan. Međutim, zanimljivo je vidjeti što se događa kada su dva mape izričito registrirana:

@Configuration javna klasa HandlerMappingPrioritiesConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlpingandler; vratiti beanNameUrlHandlerMapping; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = novo SimpleUrlHandlerMapping (); Mapa urlMap = novi HashMap (); urlMap.put ("/ dobrodošli", simpleUrlMapping ()); simpleUrlHandlerMapping.setUrlMap (urlMap); vrati simpleUrlHandlerMapping; } @Bean public SimpleUrlMappingController simpleUrlMapping () {return new SimpleUrlMappingController (); } @Bean ("/ welcome") javni BeanNameHandlerMappingController beanNameHandlerMapping () {return new BeanNameHandlerMappingController (); }}

Da bi se dobila kontrola nad korištenjem mapiranja, prioriteti se postavljaju pomoću setOrder (int poredak) metoda. Ova metoda zahtijeva jedan int parametar gdje niža vrijednost znači veći prioritet.

U XML konfiguraciji možete konfigurirati prioritete pomoću svojstva tzv "narudžba":

Dodajmo narudžba svojstva za rukovanje mapiranjem graha, slijedeći beanNameUrlHandlerMapping.setOrder (1) i simpleUrlHandlerMapping.setOrder (0). Donja vrijednost narudžba svojstvo odražava veću prednost. Utvrdimo novo ponašanje s testom:

@Test public void whenConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome") .andExpect (status (). IsOk ()) .andExpect (view (). Name ("simple-url-handler-mapping") ); }

Kada testirate gornju konfiguraciju, vidite da to zahtijeva "/Dobrodošli" riješit će SimpleUrlHandlerMapping grah koji poziva a SimpleUrlHandlerController i vraća se preslikavanje jednostavnog url-handlera pogled. Možemo jednostavno konfigurirati BeanNameHandlerMapping da bi imao prednost podešavanjem sukladno tome vrijednosti narudžba imovine.

6. Zaključak

U ovom smo članku razgovarali o načinu na koji se mapiranje URL-a obrađuje u Spring MVC okviru istražujući različite implementacije u okviru.

Kôd koji prati ovaj članak nalazi se na GitHubu.