Třídou, kolem které se, pokud jde o MVC, v
rámci Spring™ všechno točí, je
org.springframework.web.servlet.DispatcherServlet.
Tato třída představuje aplikaci návrhového vzoru přední
kontroler (Front Controller), kdy všechny požadavky určené dané
aplikaci přijímá jediný objekt. Ten je dále předává kontrolerům, které
se o vyřízení požadavku postarají.
Tento servlet je vstupním bodem každé na Springu založené webové
aplikace a musí být zaregistrován v souboru
web.xml:
<servlet>
<servlet-name>sportoviny</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/webApplicationContext1.xml
/WEB-INF/spring/webApplicationContext2.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>sportoviny</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Definovali jsme zde, že servlet s
názvem sportoviny je instancí třídy
DispatcherServlet a je mapován na všechny
požadavky s koncovkou html. Navíc jsme pomocí
parametru contextConfigLocation určili, které
soubory definují webový aplikační kontext tohoto konkrétního servletu.
Je-li souborů více, pak jsou jejich umístění oddělena čárkou či bílým
místem, přičemž platí, že definice uvedené v později specifikovaném
souboru překrývají identické definice z předešlých souborů. Tento
parametr je nepovinný a jeho implicitní hodnotou je
/WEB-INF/[název servletu]-servlet.xml, v našem
případě by to tedy bylo
/WEB-INF/sportoviny-servlet.xml. Aplikační kontext
servletu je inicializován při startu servletu. Jednotlivých servletů
třídy DispatcherServlet může být v naší aplikaci
registrováno několik a každému z nich bude přiřazen jeho vlastní
aplikační kontext. Tyto kontexty jsou nezávislé a vzájemně neviditelné.
Přínosem takového řešení je možnost dosáhnout vyšší míry modularizace
webového rozhraní.
V aplikačním kontextu servletu by měly být uchovávány pouze
definice objektů webové vrstvy aplikace. Objekty, které jsou součástí
aplikační a datové vrstvy, bývají společné pro všechny servlety, a proto
by jejich definice měly být umístěny v jediném aplikačním kontextu,
který je rodičem všech aplikačních kontextů servletů. Za tímto účelem se
ve Springu používá třída
org.springframework.web.context.ContextLoaderListener
- standardní posluchač (listener) specifikace
JavaServlet API - která očekává tzv.
kořenový aplikační kontext v souboru s cestou
/WEB-INF/applicationContext.xml. Tuto cestu lze v
souboru web.xml opět přepsat pomocí konfiguračního
parametru aplikace s názvem
contextConfigLocation:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Kořenový kontext je následně uložen jako
atribut objektu javax.servlet.ServletContext s
klíčem
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE.
V případě, že ContextLoaderListener v souboru
web.xml nezaregistrujeme, kořenový aplikační
kontext nebude vytvořen.
V některých případech však nebude
ContextLoaderListener fungovat. Potřebujeme, aby
kořenový aplikační kontext byl vytvořen před inicializací servletů a
vytvořením jejich aplikačních kontextů, protože tyto jako dceřinné
kontexty se potřebují na kořenový - rodičovský - kontext při své
inicializaci odkázat. Povinnost inicializovat posluchače před servlety
však byla stanovena až ve verzi 2.4 specifikace servletů, čili ve
webových kontejnerech implementujících starší specifikace (např.
Tomcat 4.0™, Resin
2.0™, BEA Weblogic 8.1™,
Oracle OC4J 9.0.3™, IBM Websphere
5.x™ a starší verze těchto kontejnerů) je nutno použít
servlet
org.springframework.web.context.ContextLoaderServlet,
jehož funkčnost je ekvivalentní zmíněnému posluchači.