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