Sprievodca mapovaním pružín
1. Úvod
Na jar MVC DispatcherServlet funguje ako predný radič - prijíma všetky prichádzajúce požiadavky HTTP a spracováva ich.
Zjednodušene povedané, spracovanie prebieha odovzdaním požiadaviek príslušnému komponentu pomocou mapovaní obslužných rutín.
HandlerMapping je rozhranie, ktoré definuje mapovanie medzi požiadavkami a objektmi obslužnej rutiny. Zatiaľ čo jarný rámec MVC poskytuje niektoré hotové implementácie, vývojári môžu implementovať rozhranie, aby poskytlo prispôsobenú stratégiu mapovania.
Tento článok pojednáva o niektorých implementáciách, ktoré poskytuje Spring MVC BeanNameUrlHandlerMapping, SimpleUrlHandlerMapping, ControllerClassNameHandlerMapping, ich konfigurácia a rozdiely medzi nimi.
2. BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping je predvolená hodnota HandlerMapping implementácia. BeanNameUrlHandlerMapping mapuje adresy URL požiadaviek na fazule s rovnakým názvom.
Toto konkrétne mapovanie má podporu pre priame priraďovanie mien a tiež pre priraďovanie vzorov pomocou vzoru „*“.
Napríklad prichádzajúca adresa URL „/ Foo“ mapy na fazuľu s názvom „/ Foo“. Príkladom mapovania vzorov sú žiadosti o mapovanie na „/ Foo *“ na fazuľa s názvami začínajúcimi na „/ Foo“ Páči sa mi to „/ Foo2 /“ alebo „/ FooOne /“.
Poďme si tu nakonfigurovať tento príklad a zaregistrovať fazulový radič, ktorý vybavuje požiadavky „/ BeanNameUrl“:
@Configuration verejná trieda BeanNameUrlHandlerMappingConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {vrátiť nový BeanNameUrlHandlerMapping (); } @Bean ("/ beanNameUrl") public WelcomeController welcome () {vrátiť nový WelcomeController (); }}
Toto je ekvivalent XML vyššie uvedenej konfigurácie založenej na prostredí Java:
Je dôležité poznamenať, že v oboch týchto konfiguráciách definovanie fazule pre BeanNameUrlHandlerMapping sa nevyžaduje pretože to poskytuje Spring MVC. Odstránenie tejto definície fazule nebude spôsobovať žiadne problémy a požiadavky budú stále mapované na ich zaregistrované fazule obslužnej rutiny.
Teraz všetky žiadosti „/ BeanNameUrl“ bude preposlaný do DispatcherServlet „Vitajte na ovládači“. Vitajte na ovládači vráti názov zobrazenia s názvom „vitaj“.
Nasledujúci kód testuje túto konfiguráciu a zaisťuje vrátenie správneho názvu zobrazenia:
verejná trieda BeanNameMappingConfigTest {// ... @Test public void whenBeanNameMapping_thenMappedOK () {mockMvc.perform (get ("/ beanNameUrl")) .andExpect (status (). isOk ()). andExpect (view (). name (" vitajte ")); }}
3. SimpleUrlHandlerMapping
Ďalej SimpleUrlHandlerMapping je najpružnejšia HandlerMapping implementácia. Umožňuje priame a deklaratívne mapovanie medzi inštanciami fazule a adresami URL alebo medzi názvami fazule a adresami URL.
Poďme mapovať žiadosti „/ SimpleUrlWelcome“ a „/ * / SimpleUrlWelcome“ do „Vitaj“ fazuľa:
@Configuration verejná trieda SimpleUrlHandlerMappingConfig {@Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = nový SimpleUrlHandlerMapping (); Mapa urlMap = nová HashMap (); urlMap.put ("/ simpleUrlWelcome", vitajte ()); simpleUrlHandlerMapping.setUrlMap (urlMap); návrat simpleUrlHandlerMapping; } @Bean public WelcomeController welcome () {return new WelcomeController (); }}
Alternatívne je tu ekvivalentná konfigurácia XML:
/ simpleUrlWelcome = vitajte / * / simpleUrlWelcome = vitajte
Je dôležité si uvedomiť, že v konfigurácii XML je mapovanie medzi “” značka musí byť vo forme prijatej používateľom java.util.Vlastnosti triedy a malo by sa riadiť syntaxou: cesta = Handler_Bean_Name.
Adresa URL by mala byť obvykle s úvodnou lomkou, ak však cesta nezačína na jednu, Spring MVC ju pridá automaticky.
Iný spôsob konfigurácie vyššie uvedeného príkladu v XML je použitie súboru „Rekvizity“ majetok namiesto „Hodnota“. Rekvizity mať zoznam „Rekvizita“ tag kde každý definuje mapovanie kde „Kľúč“ odkazuje na namapovanú adresu URL a hodnotou značky je názov fazule.
vitaj vitaj
Nasledujúci testovací prípad zaisťuje, že žiadosti o „/simpleUrlWelcome„Vybavuje“WelcomeController ” ktorý vráti názov pohľadu s názvom „Vitaj“ :
public class SimpleUrlMappingConfigTest {// ... @Test public void whenSimpleUrlMapping_thenMappedOK () {mockMvc.perform (get ("/ simpleUrlWelcome")) .andExpect (status (). isOk ()) .andExpect (view (). name (") vitajte ")); }}
4. ControllerClassNameHandlerMapping (odstránené na jar 5)
The ControllerClassNameHandlerMapping mapuje URL na zaregistrovanú fazuľu radiča (alebo na radič anotovaný s @ Kontrolór anotácia), ktorá má alebo začína rovnakým menom.
Môže to byť pohodlnejšie v mnohých scenároch, najmä pre jednoduché implementácie radičov, ktoré spracúvajú jeden typ žiadosti. Konvenciou, ktorú používa Spring MVC, je použitie názvu triedy a odstránenie znaku „Kontrolór“ príponu, potom zmeňte názov na malé písmená a vráťte ho ako mapovanie s úvodným znakom “/”.
Napríklad „WelcomeController“ by sa vrátil ako mapovanie do „/ Vitaj *“, t. j. na každú adresu URL, ktorá začína „Vitaj“.
Poďme konfigurovať ControllerClassNameHandlerMapping:
@Configuration public class ControllerClassNameHandlerMappingConfig {@Bean public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping () {return new ControllerClassNameHandlerMapping (); } @Bean public WelcomeController welcome () {return new WelcomeController (); }}
Poznač si to ControllerClassNameHandlerMapping je zastarané od jari 4.3 v prospech metód obsluhy ovládaných anotáciami.
Ďalšou dôležitou poznámkou je, že názvy radičov sa vždy vrátia malými písmenami (mínus prípona „Controller“). Takže ak máme ovládač s názvom „WelcomeBaeldungController„, Bude vybavovať iba žiadosti do „/ Welcomebaeldung“ a nie „/ WelcomeBaeldung“.
Definujeme v konfigurácii Java aj XML nižšie ControllerClassNameHandlerMapping fazuľa a registrácia fazule pre radiče, ktoré použijeme na vybavenie požiadaviek. Registrujeme aj fazuľu typu „WelcomeController“ a táto fazuľa vybaví všetky žiadosti, ktoré sa začínajú „/ Vitajte“.
Tu je ekvivalentná konfigurácia XML:
Pri použití vyššie uvedenej konfigurácie sa zobrazia požiadavky na „/vitaj“Sa bude zaoberať„Vitajte na ovládači“.
Nasledujúci kód zabezpečí, že žiadosti o „/vitaj* “Ako napríklad„ /vítaný test”Je obsluhované programom„ WelcomeController “, ktorý vracia názov zobrazenia s názvom„vitaj“:
verejná trieda ControllerClassNameHandlerMappingTest {// ... @Test public void whenControllerClassNameMapping_thenMappedOK () {mockMvc.perform (get ("/ welcometest")) .andExpect (status (). isOk ()). andExpect (view (). name (" vitajte ")); }}
5. Konfigurácia priorít
Jarný rámec MVC umožňuje viac ako jednu implementáciu HandlerMapping súčasne.
Vytvorme konfiguráciu a zaregistrujme dva radiče, oba mapované na adresu URL „/ welcome“, iba pomocou iného mapovania a vrátenia rôznych názvov zobrazení:
@Configuration verejná trieda HandlerMappingDefaultConfig {@Bean ("/ welcome") public BeanNameHandlerMappingController beanNameHandlerMapping () {return new BeanNameHandlerMappingController (); } @Bean public WelcomeController welcome () {return new WelcomeController (); }}
Bez registrovaného explicitného mapovača obslužných programov, predvolené BeanNameHandlerMapping bude použitý. Tvrdíme toto správanie pomocou testu:
@Test public void whenConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome")) .andExpect (status (). IsOk ()) .andExpect (view (). Name ("mapovanie obslužného programu názvu fazule") ); }
Ak výslovne zaregistrujeme iného mapovača obslužných programov, predvolený mapovač bude prepísaný. Je však zaujímavé sledovať, čo sa stane, keď sú výslovne zaregistrovaní dvaja mapovači:
@Configuration verejná trieda HandlerMappingPrioritiesConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = nový BeanNameUrlHandlerMapping (); návrat beanNameUrlHandlerMapping; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = nový SimpleUrlHandlerMapping (); Mapa urlMap = nová HashMap (); urlMap.put ("/ welcome", simpleUrlMapping ()); simpleUrlHandlerMapping.setUrlMap (urlMap); návrat simpleUrlHandlerMapping; } @Bean public SimpleUrlMappingController simpleUrlMapping () {vrátiť nový SimpleUrlMappingController (); } @Bean ("/ welcome") public BeanNameHandlerMappingController beanNameHandlerMapping () {return new BeanNameHandlerMappingController (); }}
Na získanie kontroly nad tým, ktoré mapovanie sa používa, sa priority nastavujú pomocou setOrder (int order) metóda. Táto metóda trvá jeden int parameter, kde nižšia hodnota znamená vyššiu prioritu.
V konfigurácii XML môžete nakonfigurovať priority pomocou vlastnosti s názvom "objednať":
Pridajme objednať vlastnosti na obslužnú rutinu mapujúcu fazuľa, pomocou nasledujúceho beanNameUrlHandlerMapping.setOrder (1) a simpleUrlHandlerMapping.setOrder (0). Čím nižšia je hodnota objednať vlastnosť odráža vyššiu prednosť. Presadzujme nové správanie pomocou testu:
@Test public void whenConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome")) .andExpect (status (). IsOk ()) .andExpect (view (). Name ("simple-url-handler-mapping") ); }
Pri testovaní vyššie uvedenej konfigurácie uvidíte, že požiadavky na „/ Vitajte“ bude spracovaný SimpleUrlHandlerMapping fazuľa, ktorá volá a SimpleUrlHandlerController a vráti sa mapovanie obsluhy jednoduchej adresy URL vyhliadka. Môžeme ľahko nakonfigurovať BeanNameHandlerMapping mať prednosť príslušnou úpravou hodnôt objednať nehnuteľnosť.
6. Záver
V tomto článku sme diskutovali o tom, ako sa s mapovaním URL zaobchádza v rámci Spring MVC preskúmaním rôznych implementácií v rámci.
Kód sprevádzajúci tento článok nájdete na GitHub.