Startujeme aplikaci

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.

Komentáře

komentoval: Lukáš Pavlůsek, dne: 15. 04. 2008, 15:22

Dobrý den, už nejakou dobu resim problem ohledne ContextLoader­Listeneru. Ve svém příkladu používám Spring JPA, pomocí Entity manazeru vytvarim persistenci na Oraclovskou DB, dale klasické MVC a view vrstva JSP. V nastavení web.xml mám ovsem problem, pri deploingu na TomCat se dostavam do problemu prave s ContextLoader­Listenerem. TomCat war sice deployne ale nespusti a log ohlasi: INFO: The listener „org.springfra­mework.web.con­text.ContextLo­aderListener“ is already configured for this context. Pokud ovsem Listener ve web.xml vynecham, TomCat aplikaci spusti ale na druhou stranu se dostanu do problemu s tim, ze servlet samozrejme context nevidí. Je potrřeba nastavit neco víc? Nebo je chyba nekde jinde? Díky za případnou radu

komentoval: Lukáš Pavlůsek, dne: 15. 04. 2008, 15:24

Dobrý den, už nejakou dobu resim problem ohledne ContextLoader­Listeneru. Ve svém příkladu používám Spring JPA, pomocí Entity manazeru vytvarim persistenci na Oraclovskou DB, dale klasické MVC a view vrstva JSP. V nastavení web.xml mám ovsem problem, pri deploingu na TomCat se dostavam do problemu prave s ContextLoader­Listenerem. TomCat war sice deployne ale nespusti a log ohlasi: INFO: The listener „org.springfra­mework.web.con­text.ContextLo­aderListener“ is already configured for this context. Pokud ovsem Listener ve web.xml vynecham, TomCat aplikaci spusti ale na druhou stranu se dostanu do problemu s tim, ze servlet samozrejme context nevidí. Je potrřeba nastavit neco víc? Nebo je chyba nekde jinde? Díky za případnou radu

Vložit komentář

Můžete používat značkovací jazyk Texy!


Jméno:
E-mail:
Url:
Komentář:
1 + 2 =
 
MoroSystems, s.r.o.