Díky modulární architektuře projektu Struts s možností vývoje zásuvných modulů se dva pluginy již staly součástí oficiální distribuce. Jsou to moduly Validator a Tiles. Věnujme se nyní prvnímu jmenovanému.
Modul Validator slouží, jak je asi každému jasné, k ověřování zadání uživatele, tedy k ověřování dat z formulářů před tím, než se pošlou ke zpracování. Projekt, který se touto problematikou zaobírá, se nazývá Validator a je k dispozici na Jakartě-Commons. Vývojáři Strutsu využili jeho služeb, doplnili jej o některé zajímavé vlastnosti a napojili ho do aplikačního rámce Struts jako plugin.
Plugin Validator nabízí vše, co jeho starší bratr Commons-Validator. Umožňuje vytvářet validační metody, které kontrolují jednotlivé vlastnosti objektu JavaBean (resp. FormBean). Plugin navíc používá Jakarta ORO, což je knihovna pro zpracovávání regulárních výrazů. V konfiguračním souboru (XML) zkrátka nadefinujete, co se má jak kontrolovat, a Validator se již o vše postará. Jak prosté a elegantní!
Použití modulu je jednoduché. Struts ho má již v sobě (soubory common-validator.jar a jakarta-oro.jar). Stačí nakopírovat soubor validator-rules.xml a validation.xml z nějakého příkladu a začít. Soubor validator-rules.xml obsahuje obecné, na projektu nezávislé definice nejběžnějších pravidel, jako je e-mail, url, číslo kreditní karty, datum, čas atd. Tento soubor pravděpodobně nebudete muset měnit.
Pro naši aplikaci si nadefinujme vlastní pravidla a ta uložíme právě do validation.xml. Pomocí regulárních výrazů, které jsou opravdu mocné a pokrývají širokou paletu potencionálních vstupů, můžeme snadno ověřit cokoliv. Pokud nám regulární výraz nebude stačit, máme možnost vytvořit si vlastní validační objekt (resp. metodu) a ten pak v projektu použít. Kontrolovat tak můžeme prakticky jakýkoliv vstup.
Konfigurační soubor validation.xml
se dělí na dvě části. Sekce constant obsahuje konstantní proměnné (řetězce nebo regulární výrazy), které se mohou dále používat syntaxí ${proměnná} (jako v Antu). Dále může obsahovat značky formset, ve kterých jsou již vlastní definice pravidel pro každý formulář zvlášť. Každý formset také může překrýt globální konstanty vlastními definicemi. Zajímavé je, že můžete pro každý jazyk vytvořit jiný formset. Pokud se tedy uživatel přepne ve webové aplikaci z angličtiny na češtinu, automaticky se tím změní i pravidla, což se může projevit jinou kontrolou datumu apod. Navíc aplikace může uživateli nabídnout ten jazyk, který upřednostňuje jeho prohlížeč. Je to velice šikovná vlastnost. Následuje malý příklad s ověřováním telefonu:
<form-validation> <global> <constant> <constant-name>phone</constant-name> <constant-value> ^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$ </constant-value> </constant> </global> <formset language="cs" country="CZ"> <constant> <constant-name>phone</constant-name> <constant-value> ^(\d{3})[-| ]?(\d{3})[-| ]?(\d{3})$ </constant-value> </constant> <form name="sendSmsForm"> <field property="phone" depends="required,mask,minLength"> <msg name="required" key="validation.phone.missing"/> <msg name="mask" key="validation.phone.invalidformat"/> <msg name="minLength" key="validation.phone.invalidlength"/> <var> <var-name>mask</var-name> <var-value>${phone}</var-value> </var> <var> <var-name>minLength</var-name> <var-value>5</var-value> </var> </field> </form> </formset> </form-validation> |
Pravidla pro ověření českého telefonu |
Jak vidíme, každé políčko formuláře <field> může mít vlastní pravidlo. Pomocí atributu depends řekneme, jak budeme pole kontrolovat, díky značce <msg> můžeme sestavit příslušné chybové zprávy (můžeme samozřejmě využít Struts resources) a konečně pomocí značky <var> definujeme vlastní pravidlo. V příkladu jsme poručili Validatoru, aby pole phone považoval za povinné pole minimální délky 5 a aby jej ověřil regulární maskou phone, kterou máme uloženou mezi konstantami. Zdatný programátor již ví, že tento regulární výraz akceptuje 9 číslic, ve kterých mohou být mezery či pomlčky po třech (777 123 456 a podobně).
Možnosti Validatoru a hlavně definic pravidel tak zdaleka nejsou vyčerpány. Můžete definovat daleko složitější pravidla, která mohou uživateli podat detailní zprávy o vyskytnutém problému (to díky značkám <arg0> až <arg3>). Nám to ale prozatím postačí. Pro aktivaci Validatoru stačí dodat do konfiguračního souboru jednoduchou XML značku.
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in> |
Aktivace pluginu Validator |
A je to! To je opravdu všechno! Validator již pro všechny nadefinované formuláře zajistí kontrolu a případné chyby předá pomocí ActionError objektu, který si formulář zachytí pomocí značky <html:errors/>.
Pokud používáte kvalitní editor schopný kontrolovat XML soubory pomocí DTD pravidel, máte při konfiguraci velikou výhodu. Takový editor totiž ihned zobrazí špatný parametr nebo značku na nesprávném místě. Konfigurace Strutsu je pak radostí. Můžete koneckonců použít i grafický konfigurátor, kterých je pro Struts dostatek (např. Struts console), ale já osobně nemám rád XML kód generovaný těmito nástroji. Je dosti nepřehledný.
V příštím a posledním dílu zaostříme zrak na modul Tiles, který umožňuje efektivní výstavbu konfigurovatelných portálů a intranetů.