Portál AbcLinuxu, 25. dubna 2024 09:42

Strč prst skrz AbcLinuxu - II

16. 4. 2003 | Leoš Literák
Články - Strč prst skrz AbcLinuxu - II  

aneb persistence dat, controller a výběr šablon.

Persistence

Jak již víte, objekty jsou ukládány do databáze. Abych se vyvaroval toho, že SQL příkazy budou na desítkách či stovkách míst, vytvořil jsem jednu třidu, která má na starosti persistenci dat. Druhou a možná ještě důležitější výhodou je zjednodušení práce. Tato třída definuje několik málo základních metod, které jsou velice snadné na používání. Programátor tudíž vůbec nemusí znát JDBC, aby mohl naprogramovat nové vlastnosti.

persistance class diagram

Jak vidíte z diagramu tříd, subsystém persistance se skládá ze dvou rozhraní a jejich implementací. Hlavním rozhraním je Persistance, které definuje základní metody pro manipulaci a hledání objektů. Jeho implementací je MySQLPersistance. Nicméně v kódu nevytvářím jeho instance, ale přistupuju k němu přes PersistanceFactory. Jak název napovídá, jedná se o Factory pattern. Hlavní výhodou je, že pokud bych přešel na jinou databázi, stačilo by mi naimplementovat pro ni podporu jako implementaci rozhraní Persistance a změnit jednu řádku v PersistanceFactory.

Součástí této vrstvy je i transparentní cache. V případě potřeby můžete použít i jinou než předvolenou cache při volání metody getPersistance v třídě PersistanceFactory. Toho se například používá při indexaci dat pro vyhledávání. Zvolená cache je hojně volána na začátcích metod v MySQLPersistance, takže není nutné se zdržovat pomalými JDBC voláními. DefaultCache je velice primitivní a vyřazuje objekty, které nebyly během několika posledních minut použity nebo už dlouho nebyly synchronizovány s databází. Až budu mít čas, vytvořím alternativní implementaci založenou na některé Open Source knihovně, nejspíše z Jakarty. Slibuji si od toho větší stabilitu.

Controller

Controller je relativně jednoduchý. Základem je třída AbcFMServlet, což je potomek HttpServletu. Hlavní práce se uskutečňuje v přepsané [overriden] metodě service(). Ta nejdříve zavolá metodu performInit(), která má na starosti uložení parametrů a předdefinovaných proměnných do mapy env a zpracuje přihlašování. Dále zavolá abstraktní metodu process(), která vrátí jméno šablony, která má sloužit jako výstup. Tato šablona se nahraje a vykoná. Její výstup se vrátí uživateli.

Metoda process() má následující tvar:

protected abstract String process(HttpServletRequest request, HttpServletResponse response, Map env) throws Exception;

Každý servlet dědící z této třídy je tedy povinen ji naimplementovat. V ní se provádí veškeré zpracování vašich požadavků. Tedy kontrola parametrů, zpracování a finálně výběr šablony, respektive přesměrování prohlížeče na jinou stránku. Například když uložíte diskusi, zavolá se servlet EditDiscussion. Ten uloží diskusi do databáze (a zároveň do cache). Jenže proč by měl zobrazovat diskusi, když od toho je servlet ViewRelation? Proto jednoduše vypočítá nové URL a přes volání response.sendRedirect(url) přesměruje prohlížeč na tento servlet. Jako název šablony vrátí null, takže žádná další data nejsou vrácena prohlížeči.

Výběr šablony

Zajímavým fíglem je ještě výběr šablony. Každá šablona se skládá ze dvou souborů. Prvním je template.fm, což je šablona stránky. Tedy obligátní levý sloupec se službami a rubrikami, pravý sloupec s aktuálními články na ostatních serverech a patička s copyrightem. Druhým souborem je vlastní obsah stránky, tedy zobrazení formuláře či tohoto článku. Toto dělení je pochopitelné, pokud chci změnit něco v šabloně stránek, nemusím opravovat sto souborů, ale jen jeden.

AbcLinuxu existuje v několika variantách, kromě hlavní existuje ještě varianta pro lynx, pro sidebar Mozilly a připravuje se žádaná verze pro Plucker. Bylo by hloupé, kdyby se kvůli každé této variantě musely vytvářet všechny soubory znovu. Proto jsem vytvořil mechanismus pro jejich sdílení.

Základem je stejná stromová struktura všech variant. Pokud je potřeba, vytvoří se kopie souboru v podadresáři varianty a ta získá přednost před defaultní variantou. Vysvětlím to na příkladě. Pokud si prohlížíte úvodní stránku v Internet Exploreru či Mozille, použije se předvolená varianta web. Vykoná se tedy šablona vzniklá ze souborů web/template.ftl a web/show/index.ftl. Pokud však používáte lynx, použijí se soubory lynx/template.ftl a lynx/show/index.ftl, protože jsou oba předefinované pro šablonu lynx. Ale u prohlížení článku pod lynxem se použije šablona lynx/template.ftl a soubor web/show/article.ftl, neboť jej nebylo třeba změnit. Celá varianta pro lynx se ve skutečnosti skládá jen z šablony a úvodní stránky!

V řeči kódu se tento výběr děje v třídě FMTemplateSelector a jeho obecnému předku TemplateSelector. TemplateSelector při inicializaci načte xml soubor s definicí všech šablon v systému. Každý servlet má nadefinováno několik akcí. K této akci je pak přiřazena šablona v několika variantách. Pokud tedy tyto varianty existují, jinak je tam uvedena jen jedna pro předvolenou variantu web. U šablony je možné nadefinovat proměnné, které se mají vložit do mapy env. Typicky to bývá titulek stránky.

Servlety pak volají metodu select(). Například EditDiscussion podle kontextu zavolá jednu z metod:

FMTemplateSelector.select("ViewRelation","article",env,request,null);
FMTemplateSelector.select("ViewRelation","driver",env,request,null);
FMTemplateSelector.select("ViewRelation","discussion",env,request,null);
FMTemplateSelector.select("ViewRelation","hardware",env,request,null);
FMTemplateSelector.select("ViewRelation","software",env,request,null);

V metodě select() se nejdříve detekuje prohlížeč a pokud se jedná o nástroj na mirrorování, je vrácena stránka s upozorněním, že toto chování se nám nelíbí. Následně se vyhledá v mapě šablon kombinace servletu a akce. Pokud taková kombinace neexistuje, vyhodí se vyjímka. Pak se pro kombinaci servletu, akce, prohlížeče a HttpRequestu vybere šablona, například web. Pak se pro danou šablonu zjistí obsah šablony, včetně případných proměnných (kromě statických jsou podporovány i dynamické, například titulek článku je stejný jako název článku). Název šablony s obsahem se uloží do proměnné a jako výsledek se vrátí řetězec template+"/template.ftl", například "plucker/template.ftl". Tato šablona se pak načte a vykoná v metodě service() v AbcFMServletu.

Související články

AbcLinuxu pro programátory aneb od PHP k Javě
Proč právě Java?
Strč prst skrz AbcLinuxu - I

Odkazy a zdroje

Java
Jakarta

Seriál AbcLinuxu pro programátory (dílů: 4)

První díl: AbcLinuxu pro programátory aneb od PHP k Javě, poslední díl: Strč prst skrz AbcLinuxu - II.
Předchozí díl: Strč prst skrz AbcLinuxu - I

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.