java blog jAbLoK

... řekněte Javě Ja!

/** * @author Tomáš Zvěřina * @date 1.6.2004 v 09:58 */

Moduly Struts

Při vývoji většího webového projektu za pomoci Struts se můžete dostat do situace, kdybyste ocenili možnost existence dvou oddělených struts configů. Například jeden pro katalog a jeden pro jeho administrační rozhraní — zvlášť v případě, že administrace katalogu je nějaký Váš krabicový produkt a vlastní katalog pak implementujete podle potřeb klienta odděleně.

Dokumentace Struts jasně říká, že není možné pracovat se dvěma instancemi řídícího ActionServletu, není tedy možné namapovat administraci na "*.do" a katalog třeba na "*.html". Struts ale na tuto situaci pamatují a umožňují deploy podobné kombinace dvou aplikací pomocí tzv. modulů.

Dokumentace je srozumitelná, použití snadné. Podle své konfigurace ve "web.xml" poznává ActionServlet na který modul request směřuje a podle toho využije správný mapping, ApplicationResources.properties, validator, atp. Vše podle stuts configu příslušného modulu.

Problém se objeví v okamžiku, kdy request směřuje přímo na JSP soubor. V takovém případě je danému requestu přiřazen hlavní modul a veškeré konfigurace se berou z něj. Struts tagy si pak stěžují, že nemohou najít mapping vaší akce, že nemají odpovídající klíč v ApplicationResources.properties atp. Dokumentace o něčem takovém mlčí a spoléhá se na to, že Vaše requesty vždy chodí přes ActionServlet (nebo špatně hledám).

Abychom pracovali ve správném modulu i bez asistence ActionServletu, napíšeme si filtr, který bude umět modul přepnout a namapujeme ho na podadresář odpovídající modulu.

Uvnitř filtru (před chain.doFilter() :-)) zavoláme:

import org.apache.struts.util.RequestUtils;

...

RequestUtils.selectModule(((HttpServletRequest) request), ((HttpServletRequest) request).getSession().getServletContext());

Nyní máme zaručeno, že každý request, který směřuje do adresáře modulu bude také obsloužen s využitím konfigurace modulu. Zaplatili jsme ovšem závislostí našeho kódu na Strutsím api, na což ale rychle zapomeneme a za rok se nám to vymstí.

Pozn.: uvedený kód je trochu staršího data, dnes byste měli spíš použít ModuleUtils. Princip ale zůstává stejný.