Úvod do Spring DispatcherServlet

1. Úvod

Jednoducho povedané, v Predný ovládač dizajnový vzor, jeden radič je zodpovedný za smerovanie prichádzajúcich HttpRequests všetkým ďalším radičom a obslužným programom aplikácie.

Jarné DispatcherServlet implementuje tento model a je preto zodpovedný za správnu koordináciu HttpRequests ich správnym manipulátorom.

V tomto článku budeme preskúmať jar DispatcherServlet's pracovný tok spracovania žiadosti a ako implementovať niekoľko rozhraní, ktoré sa zúčastňujú tohto pracovného toku.

2. DispatcherServlet Vyžiadajte si spracovanie

V podstate a DispatcherServlet vybavuje prichádzajúci HttpRequest, deleguje požiadavku a spracuje ju podľa nakonfigurovaného HandlerAdapter rozhrania ktoré boli implementované v rámci aplikácie Spring spolu s sprievodnými anotáciami špecifikujúcimi obslužné rutiny, koncové body radiča a objekty odpovedí.

Poďme si podrobnejšie predstaviť, ako a DispatcherServlet spracuje komponent:

  • the WebApplicationContext spojené s a DispatcherServlet pod kľúčom DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE sa vyhľadáva a sprístupňuje všetkým prvkom procesu
  • The DispatcherServlet nájde všetky implementácie HandlerAdapter rozhranie nakonfigurované pre vášho dispečera pomocou getHandler () - každá nájdená a nakonfigurovaná implementácia vybavuje požiadavku prostredníctvom rukoväť () do konca procesu
  • the LocaleResolver je voliteľne viazaný na požiadavku na povolenie prvkov v procese vyriešiť miestne nastavenie
  • the ThemeResolver je voliteľne viazané na požiadavku, aby prvky, napríklad zobrazenia, určili, ktorá téma sa má použiť
  • Ak MultipartResolver je zadaná, žiadosť sa skontroluje MultipartFiles - všetky nájdené sú zabalené do a MultipartHttpServletRequest na ďalšie spracovanie
  • HandlerExceptionResolver implementácie deklarované v WebApplicationContext zachytí výnimky, ktoré sú vyvolané počas spracovania žiadosti

Môžete sa dozvedieť viac o všetkých spôsoboch registrácie a nastavenia a DispatcherServlet tu.

3. HandlerAdapter Rozhrania

The HandlerAdapter rozhranie uľahčuje použitie radičov, servletov, HttpRequestsa cesty HTTP cez niekoľko špecifických rozhraní. The HandlerAdapter Rozhranie tak hrá zásadnú úlohu v mnohých fázach DispatcherServlet pracovný tok spracovania žiadosti.

Najprv každý HandlerAdapter implementácia je umiestnená do HandlerExecutionChain od vášho dispečera getHandler () metóda. Potom každá z týchto implementácií rukoväť () the HttpServletRequest objekt postupuje podľa reťazca vykonania.

V nasledujúcich častiach preskúmame niekoľko najdôležitejších a najčastejšie používaných Adaptéry Handler podrobnejšie.

3.1. Mapovania

Aby sme porozumeli mapovaniu, musíme sa najskôr pozrieť na to, ako anotovať radiče, pretože radiče sú pre HandlerMapping rozhranie.

The SimpleControllerHandlerAdapter umožňuje implementáciu kontrolóra výslovne bez a @ Kontrolór anotácia.

The RequestMappingHandlerAdapter podporuje metódy anotované s @RequestMapping anotácia.

Zameriame sa na @ Kontrolór anotácia tu, ale užitočný zdroj s niekoľkými príkladmi použitia SimpleControllerHandlerAdapter je tiež k dispozícii.

The @RequestMapping anotácia nastavuje konkrétny koncový bod, v ktorom bude obslužná rutina k dispozícii v rámci WebApplicationContext s tým spojené.

Pozrime sa na príklad a Kontrolór ktorá vystavuje a manipuluje s „/ Používateľ / príklad“ koncový bod:

@Controller @RequestMapping ("/ user") @ResponseBody verejná trieda UserController {@GetMapping ("/ example") verejný používateľ fetchUserExample () {// ...}}

Cesty určené @RequestMapping anotácie sú spravované interne prostredníctvom HandlerMapping rozhranie.

Štruktúra adries URL je prirodzene relatívna k DispatcherServlet sám - a určený mapovaním servletu.

Ak teda DispatcherServlet je namapované na „/“, potom toto mapovanie pokryje všetky mapovania.

Ak je však mapovanie servletu „/ dispečer„Namiesto toho potom ľubovoľné @RequestMapping anotácie budú relatívne k koreňovej adrese URL.

Pamätajte, že „/“ nie je to isté ako „/ *“ pre mapovania servletov! „/“ Je predvolené mapovanie a vystavuje všetky adresy URL v oblasti zodpovednosti dispečera.

„/ *“ Je mätúce pre mnoho novších jarných vývojárov. Nezadáva, že všetky cesty s rovnakým kontextom URL sú v oblasti zodpovednosti dispečera. Namiesto toho prepíše a ignoruje ostatné mapovania dispečerov. Takže „/ example“ vyjde ako 404!

Z toho dôvodu, „/ *“ By sa nemalo používať okrem veľmi obmedzených okolností (ako konfigurácia filtra).

3.2. Spracovanie požiadavky HTTP

Hlavná zodpovednosť a DispatcherServlet je odoslať prichádzajúce HttpRequests správnym manipulátorom špecifikované s @ Kontrolór alebo @RestController anotácie.

Na okraj je hlavný rozdiel medzi @ Kontrolór a @RestController je spôsob generovania odpovede - @RestController tiež definuje @ResponseBody predvolene.

Zápis, kde pôjdeme do oveľa väčšej hĺbky, pokiaľ ide o regulátory Spring, nájdete tu.

3.3. The ViewResolver Rozhranie

A ViewResolver je pripojený k a DispatcherServlet ako konfiguračné nastavenie na ApplicationContext objekt.

A ViewResolver určuje jednak to, aký druh pohľadov obsluhuje dispečer, aj to, odkiaľ sú poskytované.

Tu je príklad konfigurácie, ktorú vložíme do našej AppConfig na vykreslenie stránok JSP:

@Configuration @EnableWebMvc @ComponentScan ("com.baeldung.springdispatcherservlet") verejná trieda AppConfig implementuje WebMvcConfigurer {@Bean public UrlBasedViewResolver viewResolver () {UrlBasedViewResolver resolver = nový UrlBasedView resolver.setPrefix ("/ WEB-INF / view /"); resolver.setSuffix (". jsp"); resolver.setViewClass (JstlView.class); spätný rezolver; }}

Veľmi priamy! Skladá sa z troch hlavných častí:

  1. nastavenie prefixu, ktorý nastaví predvolenú cestu URL na nájdenie nastavených zobrazení vo vnútri
  2. predvolený typ zobrazenia nastavený pomocou prípony
  3. nastavenie triedy pohľadu na rezolveri, ktorá umožňuje, aby boli technológie ako JSTL alebo Tiles spojené s vykreslenými pohľadmi

Jedna častá otázka spočíva v tom, ako presne je dispečer ViewResolvera celková adresárová štruktúra projektu spolu súvisia. Poďme sa pozrieť na základné veci.

Tu je príklad konfigurácie cesty pre súbor InternalViewResolver pomocou jarnej XML konfigurácie:

Kvôli nášmu príkladu budeme predpokladať, že naša aplikácia je hostená na:

// localhost: 8080 /

Toto je predvolená adresa a port pre lokálne hostený server Apache Tomcat.

Za predpokladu, že sa naša aplikácia volá príklad odoslania - 1.0.0, naše zobrazenia JSP budú prístupné z:

//localhost:8080/dispatchereexample-1.0.0/jsp/

Cesta k týmto pohľadom v rámci bežného jarného projektu s Mavenom je táto:

src - | hlavný - | java resources webapp - | jsp WEB-INF

Predvolené umiestnenie pre zobrazenia je v rámci WEB-INF. Cesta určená pre našu InternalViewResolver v úryvku vyššie určuje podadresár „src / main / webapp“, v ktorom budú dostupné vaše zobrazenia.

3.4. The LocaleResolver Rozhranie

Primárny spôsob prispôsobenia informácií o relácii, požiadavke alebo cookies pre nášho dispečera je prostredníctvom servera LocaleResolver rozhranie.

CookieLocaleResolver je implementácia umožňujúca konfiguráciu vlastností aplikácie bez štátnej príslušnosti pomocou cookies. Pridajme to AppConfig.

@Bean public CookieLocaleResolver cookieLocaleResolverExample () {CookieLocaleResolver localeResolver = nový CookieLocaleResolver (); localeResolver.setDefaultLocale (Locale.ENGLISH); localeResolver.setCookieName ("locale-cookie-resolver-example"); localeResolver.setCookieMaxAge (3600); návrat localeResolver; } @Bean public LocaleResolver sessionLocaleResolver () {SessionLocaleResolver localeResolver = nový SessionLocaleResolver (); localeResolver.setDefaultLocale (Locale.US); localResolver.setDefaultTimeZone (TimeZone.getTimeZone ("UTC")); návrat localeResolver; } 

SessionLocaleResolver umožňuje konfiguráciu špecifickú pre reláciu v stavovej aplikácii.

The setDefaultLocale() metóda predstavuje geografický, politický alebo kultúrny región, zatiaľ čo setDefaultTimeZone() určuje príslušné Časové pásmo objekt pre aplikáciu Bean v otázke.

Obe metódy sú k dispozícii pre každú z vyššie uvedených implementácií LocaleResolver.

3.5. The ThemeResolver Rozhranie

Jar poskytuje pre naše názory štylistické témy.

Poďme sa pozrieť na to, ako nakonfigurovať náš dispečer na spracovanie tém.

Najprv, Poďme nastaviť všetku konfiguráciu potrebnú na nájdenie a použitie našich statických súborov tém. Musíme nastaviť statické umiestnenie zdroja pre naše ThemeSource nakonfigurovať skutočné Témy sami (Téma objekty obsahujú všetky konfiguračné informácie uvedené v týchto súboroch). Pridajte toto do AppConfig:

@Override public void addResourceHandlers (register ResourceHandlerRegistry) {registry.addResourceHandler ("/ resources / **") .addResourceLocations ("/", "/ resources /") .setCachePeriod (3600) .resourceChain (true) .addResolver (nový PathResolver) ()); } @Bean public ResourceBundleThemeSource themeSource () {ResourceBundleThemeSource themeSource = nový ResourceBundleThemeSource (); themeSource.setDefaultEncoding ("UTF-8"); themeSource.setBasenamePrefix ("témy."); návrat themeSource; } 

Žiadosti riadené DispatcherServlet môže upravovať tému prostredníctvom zadaného parametra odovzdaného do setParamName() k dispozícii na internete ThemeChangeInterceptor objekt. Pridať k AppConfig:

@Bean public CookieThemeResolver themeResolver () {CookieThemeResolver resolver = nový CookieThemeResolver (); resolver.setDefaultThemeName ("príklad"); resolver.setCookieName ("example-theme-cookie"); spätný rezolver; } @Bean public ThemeChangeInterceptor themeChangeInterceptor () {ThemeChangeInterceptor interceptor = nový ThemeChangeInterceptor (); interceptor.setParamName ("téma"); spätný zachytávač; } @Override public void addInterceptors (InterceptorRegistry registry) {registry.addInterceptor (themeChangeInterceptor ()); } 

Nasledujúca značka JSP je pridaná do nášho zobrazenia, aby sa zobrazil správny štýl:

Nasledujúca žiadosť o adresu URL vykreslí príklad tému pomocou parametra ‘téma’ odovzdaného do našej konfigurácie Zachytávač ThemeChange:

//localhost:8080/dispatchereexample-1.0.0/?theme=example

3.6. The MultipartResolver Rozhranie

A MultipartResolver implementácia skontroluje požiadavku na viacdielne a zabalí ich do a MultipartHttpServletRequest na ďalšie spracovanie ďalšími prvkami v procese, ak sa nájde aspoň jedno viacdielne. Pridať k AppConfig:

@Bean public CommonsMultipartResolver multipartResolver () hodí IOException {CommonsMultipartResolver resolver = nový CommonsMultipartResolver (); resolver.setMaxUploadSize (10 000 000); spätný rezolver; } 

Teraz, keď sme nakonfigurovali naše MultipartResolver fazuľa, nastavme kontrolór na spracovanie MultipartFile žiadosti:

@Controller verejná trieda MultipartController {@Autowired kontext ServletContext; @PostMapping ("/ upload") verejný ModelAndView FileuploadController (@RequestParam ("súbor") súbor MultipartFile) hodí IOException {ModelAndView modelAndView = nový ModelAndView ("index"); InputStream in = file.getInputStream (); Cesta reťazca = nový súbor ("."). GetAbsolutePath (); FileOutputStream f = nový FileOutputStream (path.substring (0, path.length () - 1) + "/ uploads /" + file.getOriginalFilename ()); int ch; while ((ch = in.read ())! = -1) {f.write (ch); } f.flush (); f.close (); in.close (); modelAndView.getModel () .put ("správa", "Súbor bol úspešne nahraný!"); návrat modelAndView; }}

Na odoslanie súboru do zadaného koncového bodu môžeme použiť normálny formulár. Nahrané súbory budú k dispozícii v priečinku „CATALINA_HOME / bin / uploads“.

3.7. The HandlerExceptionResolver Rozhranie

Jarné HandlerExceptionResolver poskytuje jednotné spracovanie chýb pre celú webovú aplikáciu, jeden radič alebo množinu radičov.

Ak chcete poskytnúť vlastné spracovanie výnimiek pre celú aplikáciu, vytvorte triedu s poznámkami @ControllerAdvice:

@ControllerAdvice verejná trieda ExampleGlobalExceptionHandler {@ExceptionHandler @ResponseBody verejný reťazec handleExampleException (výnimka e) {// ...}}

Akékoľvek metódy v rámci tejto triedy anotované pomocou @ExceptionHandler bude k dispozícii pre každého kontrolóra v oblasti zodpovednosti dispečera.

Implementácie HandlerExceptionResolver rozhranie v ApplicationContext DispatcherServlet sú k dispozícii pre zachytiť konkrétny radič v oblasti zodpovednosti tohto dispečera kedykoľvek @ExceptionHandler sa používa ako anotáciaa ako parameter je odovzdaná správna trieda:

@Controller verejná trieda FooController {@ExceptionHandler ({CustomException1.class, CustomException2.class}) public void handleException () {// ...} // ...}

The handleException () metóda bude teraz slúžiť ako obsluha výnimky pre FooController v našom príklade vyššie, ak existuje jedna výnimka CustomException1 alebo CustomException2 vyskytuje.

Tu je článok, ktorý sa podrobnejšie venuje spracovaniu výnimiek vo webovej aplikácii Spring.

4. Záver

V tomto tutoriáli sme skontrolovali jar DispatcherServlet a niekoľkými spôsobmi konfigurácie.

Ako vždy, zdrojový kód použitý v tomto tutoriále je k dispozícii na stránkach Github.


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