Útmutató a tavaszi kezelő leképezésekhez

1. Bemutatkozás

Tavaszi MVC-ben a DispatcherServlet elülső vezérlőként működik - fogad minden beérkező HTTP kérést és feldolgozza azokat.

Egyszerűen fogalmazva: a feldolgozás úgy történik, hogy a kéréseket átadjuk a megfelelő komponensnek a kezelői leképezések segítségével.

HandlerMapping olyan felület, amely meghatározza a lekérdezések és a kezelő objektumok leképezését. Míg a tavaszi MVC keretrendszer néhány kész megvalósítást kínál, a felületet a fejlesztők implementálhatják, hogy testre szabott térképezési stratégiát biztosítsanak.

Ez a cikk a Spring MVC néhány megvalósítását tárgyalja, nevezetesen BeanNameUrlHandlerMapping, SimpleUrlHandlerMapping, ControllerClassNameHandlerMapping, konfigurációjuk és a közöttük lévő különbségek.

2. BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping az alapértelmezett HandlerMapping végrehajtás. BeanNameUrlHandlerMapping a térképek URL-eket kérnek az azonos nevű babokra.

Ez a leképezés támogatja a közvetlen névegyeztetést, valamint a minta illesztését a „*” mintával.

Például egy bejövő URL „/ Foo” nevezett babra térképez „/ Foo”. A minta leképezésére példa a kérelmek leképezése „/ Foo *” a kezdőbetűs babokra „/ Foo” mint „/ Foo2 /” vagy „/ FooOne /”.

Konfiguráljuk itt ezt a példát, és regisztráljunk egy babkontrollert, amely kezeli a kéréseket „/ BeanNameUrl”:

@Configuration public class BeanNameUrlHandlerMappingConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {return new BeanNameUrlHandlerMapping (); } @Bean ("/ beanNameUrl") nyilvános WelcomeController welcome () {return new WelcomeController (); }}

Ez a fenti Java alapú konfiguráció XML-megfelelője:

Fontos megjegyezni, hogy mindkét konfigurációban bab meghatározása a számára BeanNameUrlHandlerMapping nem szükséges ahogy azt a Spring MVC biztosítja. A babdefiníció eltávolítása nem okoz problémát, és a kérelmek továbbra is a regisztrált kezelő babjukra kerülnek.

Most minden kérés „/ BeanNameUrl” továbbítja DispatcherServlet nak nek "WelcomeController“. WelcomeController a „nézet nevet adja visszaÜdvözöljük“.

A következő kód teszteli ezt a konfigurációt, és megbizonyosodik arról, hogy a helyes nézetnév visszaadódik:

public class BeanNameMappingConfigTest {// ... @Test public void whenBeanNameMapping_thenMappedOK () {mockMvc.perform (get ("/ beanNameUrl")) .andExpect (status (). isOk ()) .andExpect (view (). name (" Üdvözöljük")); }}

3. SimpleUrlHandlerMapping

Ezután a SimpleUrlHandlerMapping a legrugalmasabb HandlerMapping végrehajtás. Közvetlen és deklaratív leképezést tesz lehetővé a babpéldányok és az URL-ek, illetve a babnév és az URL-ek között.

Térképezzük fel a kéréseket „/ SimpleUrlWelcome” és “/ * / SimpleUrlWelcome” hoz "Üdvözöljük" bab:

@Configuration public class SimpleUrlHandlerMappingConfig {@Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping (); Térkép urlMap = új HashMap (); urlMap.put ("/ simpleUrlWelcome", welcome ()); simpleUrlHandlerMapping.setUrlMap (urlMap); return simpleUrlHandlerMapping; } @Bean public WelcomeController welcome () {return new WelcomeController (); }}

Alternatív megoldásként itt található az egyenértékű XML konfiguráció:

   / simpleUrlWelcome = welcome / * / simpleUrlWelcome = welcome 

Fontos megjegyezni, hogy az XML konfigurációban a közöttük történő leképezés “” címkét az elfogadott formában kell megtenni java.util.Tulajdonságok osztály, és a szintaxist kell követnie: elérési út = Handler_Bean_Name.

Az URL-nek általában vezető perjellel kell lennie, azonban ha az útvonal nem egyvel kezdődik, akkor a Spring MVC automatikusan hozzáadja.

A fenti példa XML-ben történő konfigurálásának egy másik módja a „Kellékek” ingatlan helyett "érték". Kellékek van egy listája "támaszt" tag, ahol mindegyik meghatározza a hová történő leképezést "kulcs" a leképezett URL-re utal, és a címke értéke a bab neve.

   üdvözlöm 

A következő teszteset biztosítja, hogy a „/simpleUrlWelcome”Kezeli:WelcomeController ” nevű nézetnevet adja vissza "Üdvözöljük" :

public class SimpleUrlMappingConfigTest {// ... @Test public void whenSimpleUrlMapping_thenMappedOK () {mockMvc.perform (get ("/ simpleUrlWelcome")) .andExpect (status (). isOk ()) .andExpect (view () name (") Üdvözöljük")); }}

4. ControllerClassNameHandlerMapping (eltávolítva: 5. tavasz)

A ControllerClassNameHandlerMapping leképezi az URL-t egy regisztrált vezérlő babra (vagy egy vezérlőre, amelyhez a @Vezérlő annotáció), amelynek neve ugyanaz, vagy azzal kezdődik.

Kényelmesebb lehet sok esetben, különösen egyszerű vezérlő implementációk esetén, amelyek egyetlen kéréstípust kezelnek. A Spring MVC által használt egyezmény az osztály nevének használata és a "Vezérlő" utótagot, majd változtassa meg a nevet kisbetűvé, és adja vissza leképezésként egy vezetővel “/”.

Például „WelcomeController” visszatérne, mint térkép "/Üdvözöljük*", azaz minden olyan URL-re, amelyik kezdődik "Üdvözöljük".

Konfiguráljuk ControllerClassNameHandlerMapping:

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

Vegye figyelembe, hogy ControllerClassNameHandlerMapping van elavult a 4.3 tavasztól az annotáció által vezérelt kezelő módszerek mellett.

Egy másik fontos megjegyzés, hogy a vezérlő nevét mindig kisbetűvel adjuk vissza (levonva a „Controller” utótagot). Tehát ha van egy vezérlőnk,WelcomeBaeldungController„, Csak a kérelmeket kezeli „/ Welcomebaeldung” és nem “/ WelcomeBaeldung”.

Az alábbi Java config-ban és XML config-ban egyaránt meghatározzuk ControllerClassNameHandlerMapping bab és regisztrálja a babot a vezérlők számára, amelyeket a kérések kezelésére használunk. Egy típusú babot is regisztrálunk „WelcomeController” és ez a bab kezeli az összes kezdő kérést "/Üdvözöljük".

Itt található az egyenértékű XML konfiguráció:

A fenti konfiguráció használatakor a „/Üdvözöljük”Kezeli a„WelcomeController“.

A következő kód biztosítja, hogy a “/Üdvözöljük*" mint például "/welcometest”Kezeli a„ WelcomeController ”, amely a„ nézet nevet adja visszaÜdvözöljük“:

public class ControllerClassNameHandlerMappingTest {// ... @Test public void whenControllerClassNameMapping_thenMappedOK () {mockMvc.perform (get ("/ welcometest")) .andExpect (status (). isOk ()) .Expect (view () name ("). Üdvözöljük")); }}

5. A prioritások beállítása

A tavaszi MVC-keretrendszer lehetővé teszi a HandlerMapping felületet.

Hozzunk létre egy konfigurációt, és regisztráljunk két vezérlőt, mindkettőt az „/ welcome” URL-re hozzárendelve, csak különböző hozzárendeléssel és különböző nézetek megadásával:

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

Alapértelmezés szerint nincs regisztrálva kifejezetten kezelő leképező BeanNameHandlerMapping használva lesz. Állítsuk be ezt a viselkedést a teszttel:

@Test public void whenConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome")) .andExpect (status (). IsOk ()) .andExpect (view (). Name ("bab-név-kezelő-leképezés") ); } 

Ha kifejezetten egy másik kezelő leképezőt regisztrálunk, akkor az alapértelmezett leképező felülírásra kerül. Érdekes azonban látni, mi történik, ha két térképezőt kifejezetten regisztrálnak:

@Configuration public class HandlerMappingPrioritiesConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping (); return beanNameUrlHandlerMapping; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = új SimpleUrlHandlerMapping (); Térkép urlMap = új HashMap (); urlMap.put ("/ welcome", simpleUrlMapping ()); simpleUrlHandlerMapping.setUrlMap (urlMap); return simpleUrlHandlerMapping; } @Bean public SimpleUrlMappingController simpleUrlMapping () {return new SimpleUrlMappingController (); } @Bean ("/ welcome") public BeanNameHandlerMappingController beanNameHandlerMapping () {return new BeanNameHandlerMappingController (); }}

Annak érdekében, hogy ellenőrizhessük, melyik leképezést használjuk, a prioritásokat a segítségével állítjuk be setOrder (int sorrend) módszer. Ez a módszer egyet igényel int paraméter, ahol az alacsonyabb érték magasabb prioritást jelent.

XML konfigurációban a prioritásokat az úgynevezett tulajdonság használatával konfigurálhatja "rendelés":

Tegyük hozzá rendelés tulajdonságai a babkezelő leképezéséhez, a követés útján beanNameUrlHandlerMapping.setOrder (1) és simpleUrlHandlerMapping.setOrder (0). A rendelés tulajdonság magasabb elsőbbséget tükröz. Állítsunk be új viselkedést a teszttel:

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

A fenti konfiguráció tesztelésekor látja, hogy a "/Üdvözöljük" kezeli SimpleUrlHandlerMapping bab, amely a SimpleUrlHandlerController és visszatér egyszerű-url-kezelő-leképezés Kilátás. Könnyen konfigurálhatjuk a BeanNameHandlerMapping hogy elsőbbséget élvezzen a rendelés ingatlan.

6. Következtetés

Ebben a cikkben megvitattuk, hogyan kezelik az URL-leképezést a Spring MVC keretrendszerben a keretrendszer különböző megvalósításainak feltárásával.

A cikkhez tartozó kód megtalálható a GitHub oldalon.