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


$config[zx-auto] not found$config[zx-overlay] not found