Ú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.