screen Demo aplikace pro Ujorm a Wicket

Ukázková CRUD aplikace s rezervací hotelů
Autor: Pavel Ponec, help.ujorm@gmail.com, 2013-2014
Licence dokumentu: Creative Commons BY-ND

Úvod

Knihovna Ujorm byla představena poprvé na portálu java.cz v roce 2007, tehdy ještě pod starým názvem UJO Framework. Od té doby uběhlo 6 let a zdrojový kód prošel mnoha úpravami, základní myšlenka však zůstala stejná: přístup k vlastnostem objektu se provádí pomocí konstant zvaných klíče. Je pravda, že podobný přístup používá také objekt HashMap, narozdíl od něj se však klíče v Ujorm liší v několika vlastnostech:

Vlastnosti naopak společné se třídou HashMap:

Je nesporné, že přístup k datům pomocí Ujo klíčů je méně komfortní než přístupy přes gettery a settery, nabízí se tedy otázka, jaké je jejich praktické využití. Jednoduchá odpověď zní, že Ujo objekty jsou užitečné všude tam, kde potřebujeme referenci na atribut doménového objektu (nikoli jeho hodnotu). Protože takové tvrzení je jen málo ilustrativní, rozhodl jsem se prezentovat využití knihovny Ujorm na malém webovém projektu pro rezervaci hotelů. Grafické rozhraní vykresluje populární framework Apache Wicket, jádrem aplikace jsou pak přehledové tabulky a editační dialogy, pro přístup k databázi se využívá ORM modul projektu Ujorm. Během tvorby projektu vzniklo několik tříd vhodných pro obecné použití, které jsem přesunul do samostatného modulu zvaného ujo-wicket. Všechny použité Java knihovny mají otevřenou licenci a jsou dostupné z centrálního Maven repositáře.

Objektový model

Následující obrázek popisuje použitý class model perzistentních tříd:

classModel

Entita rezervace (Booking) je relací typu M:N mezi hotelem a zákazníkem, jeden zákazník tedy může rezervovat ubytování ve více hotelech a jeden hotel pojme rezervace více zákazníků, kapacitu hotelu pro zjednodušení neřešíme. Aby byl datový model zajímavější, doplníme ještě entitu zvanou město (City), která bude atributem hotelu, entita město však v projektu nemá vlastní administraci.

Přehled hotelů

Tabulku s přehledem hotelů v aplikaci představuje následující obrázek:

hotelTableGui

Tabulka asi ničím nepřekvapí běžného uživatele internetových aplikací, zvládá stránkování, řazení sloupců a rezervaci vybraného hotelu. Data se načítají z relační databáze pomocí SQL příkazů. Zajímavější je zdrojový kód, kde jednotlivé sloupce tabulky (komponenty) poskytuje tovární metoda - podle předaných Ujo klíčů, wow :). Podle vlastností klíče se generují výchozí CSS styly, zdrojový kód pro vykreslení tabulky následuje:

hotelTableCode

To je vše. Výběr databázových řádků se řídí objektem Criterion, který se vkládá do konstruktoru třídy UjoDataProvider, který poskytuje netradičně také instanci komponenty DataTable. Mapování databázového připojení získává komponenta pomocí třídy HotelsApplication. Řazení tabulky nemusíme teď řešit, protože každý sloupec je mapovaný na jeden databázový sloupec a tak událost na kliknutí generuje potřebný SQL dotaz automaticky.

Ukázka editačního dialogu:

hotelFormGui

Podobně jako sloupce tabulky také jednotlivé řádky editačního dialogu tvoří tovární metoda podle Ujo klíčů, přitom klíče poskytují formuláři vedle svého typu také validátory. Všechny texty jsou lokalizované pomocí nástrojů Wicketu. Ukázka zdrojového kódu následuje:

hotelFormCode

Tvorba databázových dotazů

Dotazy na relační databázi modelujeme pomocí klíčů (Keys), konstant a jejich operátorů, které jsou obsaženy v objektech pro popis logických podmínek typu Criterion. Dva objekty typu Criterion lze dále spojovat pomcí operátorů AND / OR do binárního stromu. Následuje ukázka jednoduchého kódu pro získání registrovaného uživatele:

Find Customer

Více informací k ORM lze najít v dokumentaci Ujorm User Guide.

Události

Události se rozesílají pomocí metody Component.send(..), kde parametrem payload je objekt typu UjoEvent. Příjemce se pokusí rozpoznat typ takové události v metodě Component.onEvent(...). Požadavek na zobrazení dialogu se liší od výkonného kódu hodnotou atributem UjoEvent..showDialog, přitom společný rodič všech dialogů zajistí při odeslání událost vypnutí tohoto příznaku. Podobné se chová také událost na změnu formulářového objektu Field, žádost o notifikaci se provádí voláním metody: FieldProvider.onChange(Booking.KEY). Ukázka ošetření některých událostí potřebných pro administraci hotelu následuje:

Hotel Events

Zbývá jen doplnit kód pro ukládání hotelu tlačítkem Save. V našem projektu využijeme metody dostupné pomocí služeb Springu.

Implementace UJO objektu

Pro úplnost přikládám také zdrojový kód perzistentní entity hotel:

hotelDomainObject

Gettery a settery v Ujo třídy nejsou povinné, ale jejich doplnění zpřehlední náš zdrojový kód v implementaci servisní vrstvy. Vývojové prostředí NetBeans má k dispozici plugin pro generování potřebných metod podle klíčů, podobný plugin pro Eclipse zatím bohužel chybí, snad to bude výzva pro nějakého nového příznivce :).

Volba databázového připojení

Aplikace Demo-Hotels používá ve výchozím nastavení databázi H2 běžící v režimu IN-MEMORY, databázovou strukturu si zakládá ORM podle objektového modelu a použité konfigurace. Pro změnu databázového připojení je možné upravit:

  1. ve třídě DatabaseMapping parametry anotace: user, password, jdbcUrl, dialect
  2. ve třídě DatabaseMapping parametry anotace: jndi + dialect
  3. ve třídě DatabaseConfig lze nastavit  externí XML konfiguraci s tagy: user, password, jdbcUrl, dialect
  4. ve třídě DatabaseConfig lze nastavit  externí XML konfiguraci s tagy: jndi + dialect
  5. v použitém dialektu lze také překrýt metodu: SqlDialect.createConnection(..)
  6. data pro tabulku lze změnit také překrytím metody UjoDataProvider.iterator(first,count)  pomocí vlastní implementace

Přitom každé řešení s vyšším číslem překrývá řešení předchozí.

Pro připojení k databázím typu PostgreSQL a MySQL jsem přiložil do projektu dva soubory:

které mohou sloužit jako předloha pro připojení k nějaké vlastní databázi. Připomínám, že XML konfigurace lze aktiovvat ve třídě DatabaseConfig.

Závěr

Aplikace Demo-Hotels vznikla v naději, že některé části zdrojového kódu objasní čtenáři využití Ujo objektů, samotná aplikace však není určena pro produkční použití. Pokud budete mít dojem, že některé části kódu lze řešit lépe nebo že na projektu lze ještě dále pracovat,budete mít možná pravdu. Všechny grafické komponenty jsou potomkem komponenty z Wicket frameworku a tak není velký problém rozšířit vlastní potomky pro specifické potřeby. Některé nápady byly inspirované projektem WebFort z konce roku 2008, nemohu však vyloučit, že podobný kód se neobjevil už někdy dříve. Za konstruktivní ohlasy děkuji.