MASARYKOVA UNIVERZITA F}w¡¢£¤¥¦§¨ AKULTA INFORMATIKY !"#$%&'()+,-./012345 Modul do systému Maven DIPLOMOVÁ PRÁCE Ivana Jansová Brno, podzim 2009 Prohlášení Prohlašuji, že tato diplomová práce je mým p ˚uvodnímautorským dílem, které jsem vypra- covala samostatnˇe.Všechny zdroje, prameny a literaturu, které jsem pˇrivypracování pou- žívala nebo z nich ˇcerpala,v práci ˇrádnˇecituji s uvedením úplného odkazu na pˇríslušný zdroj. Vedoucí práce: RNDr. Radek Ošlejšek, Ph.D. ii Podˇekování Ráda bych podˇekovalavšem, kteˇrími pomohli, jmenovitˇepanu RNDr. Radkovi Ošlejškovi, Ph.D. za trpˇelivosta užiteˇcnérady pˇrivedení diplomové práce, dále Ing. Pavlovi Klobá- sovi za cenné podnˇetya pˇripomínkyk programové ˇcásti.Podˇekovánípatˇríi mé rodinˇea pˇrátel˚umMgr. HanˇeBydžovské a Mgr. Danielu Kederovi, kteˇrímne podporovali. Bez jejich pomoci by tato práce nemohla vzniknout. iii Shrnutí Diplomová práce pojednává o systému Maven. Zabývá se jeho funkcemi a možným využi- tím. Na pˇríkladechukazuje používání modul ˚ua jejich konfiguraci. Ve druhé ˇcástise vˇenujeframeworku Apache Wicket. Formou tutoriálu pˇribližujeˇcte- náˇritvorbu webové aplikace ve Wicketu. Obsahuje popis komponent i Wicket model ˚upro získávání dat. Poslední ˇcástukazuje, jak jsem postupovala pˇritvorbˇeobyˇcejnéhoi reportového modulu do Mavenu. Popisuje vznik modulu – Validátoru pro validaci XML soubor ˚u,kaskádových styl ˚u,JavaScriptu a šablon Apache Wicket a pˇreformulovánívýsledk ˚udo formy reportu. iv Klíˇcováslova Maven, plugin, validátor HTML, validátor JavaScript, validátor CSS šablon, validátor šab- lon Apache Wicket v Obsah 1 Úvod ...... 1 2 Maven ...... 3 2.1 POM – Project Object Model ...... 4 2.1.1 Ukázka a rozbor ˇcástípom.xml ...... 5 2.2 Fáze projektu ...... 7 2.3 Funkce a použití ...... 8 2.3.1 Generování stránek ...... 8 2.3.2 Základní pˇríkazy ...... 9 2.3.3 Archetypy ...... 10 2.4 Moduly ...... 10 3 Apache Wicket ...... 12 3.1 MVC architektura ...... 12 3.1.1 Model ...... 13 3.1.2 PropertyModel ...... 13 3.1.2.1 Property Expression Language ...... 13 3.1.3 CompoundPropertyModel ...... 14 3.1.4 ResourceModel ...... 14 3.1.5 StringResourceModel ...... 14 3.1.6 LoadableDetachableModel ...... 14 3.2 Komponenty ...... 15 3.2.1 Form ...... 15 3.2.2 Button ...... 16 3.2.3 PasswordTextField ...... 16 3.2.4 RepeatingView ...... 16 3.2.5 ListView ...... 16 3.2.6 Panel ...... 16 3.3 Tvorba vlastních komponent ...... 16 3.4 Kontrola uživatelského vstupu ...... 17 3.4.1 Validátory ...... 17 3.5 Speciální šablonové znaˇcky: ...... 18 3.6 PˇríkladWicket šablony ...... 20 3.7 Ostatní Java frameworky ...... 21 3.7.1 Cocoon ...... 22 3.7.2 Struts ...... 22 3.7.3 Stripes ...... 22 3.7.4 Tapestry ...... 23 3.7.5 Aranea ...... 23 3.7.6 Induction ...... 23 3.7.7 Spring Web MVC Framework ...... 24 3.7.8 Oracle Application Framework ...... 24 vi 3.7.9 JavaServer Faces ...... 25 3.7.10 WebObjects ...... 25 3.7.11 WebWork ...... 25 3.7.12 Sofia ...... 26 4 Modul Validátor ...... 28 4.1 Vytvoˇrenístruktury ...... 28 4.2 Deskriptor popisující Validátor ...... 28 4.3 První verze Validátoru ...... 29 4.3.1 MOJO ...... 30 4.3.2 Pˇrepracovánímodulu na Maven-report Validátor ...... 31 4.4 Úprava a sbˇervýsledk ˚uValidátoru ...... 31 4.5 Typy výstupu ...... 33 5 Knihovny používané ve Validátoru ...... 35 5.1 Implementace Validátoru XML a HTML ...... 36 5.1.1 XML katalog ...... 36 5.2 Implementace Validátoru JavaScriptu ...... 36 5.3 Implementace Validátoru CSS ...... 39 5.3.1 Kontrola importu kaskádových styl ˚u ...... 40 5.4 Implementace Validátoru šablon Apache Wicket ...... 40 5.4.1 Wicket DTD ...... 40 5.4.2 Kontrola Wicket konvencí ...... 41 6 Závˇer ...... 42 A Pˇrehleddostupných modul ˚u ...... 43 B Nastavení globálních parametr ˚uu JSLint pˇrepínaˇc˚ubrowser, rhino a widget .. 47 B.1 browser ...... 47 B.2 rhino ...... 47 B.3 widget ...... 48 C Obsah pˇriloženéhoCD ...... 49 Literatura ...... 52 vii Kapitola 1 Úvod V dnešní dobˇeexistuje množství softwaru urˇcenéhopro správu projekt ˚u.Co od nich uživa- tel oˇcekává?Pˇredpokládájednoduché a pˇrívˇetivéovládání, snadné používání, úsporu práce, pˇrehlednost,velký výbˇerfunkcí a ˇradudalších vlastností. Systém Maven pˇrestavujejeden z tˇechtonástroj ˚u.Slovo Maven je židovského p ˚uvodu a znamená souhrn znalostí. Tímto mottem se Maven ˇrídí.Snaží se sjednotit a zjednodušit vedení projekt ˚u.Ze zaˇcátkuse vyplˇnovánípotˇrebnýchinformací m ˚užezdát zdlouhavé. Vy- naložený ˇcasse však uživateli vrátí pˇritvorbˇedalšího projektu, kde je využije. Maven zajistí jednotný vzhled všech projekt ˚u. Maven sám o sobˇeimplementuje jen nˇekolikzákladních funkcí, ostatní pˇrenechávána modulech. Tato strategie zaruˇcujesnadnou rozšiˇritelnostsystému. V dnešní dobˇejiž exis- tuje velké množství modul ˚us nejr ˚uznˇejšímifunkcemi. Uživatel se jejich shánˇenímnemusí zabývat, pouze pˇridádo projektu název a verzi modulu a Maven si jej obstará sám. Systém se postará i o generování informaˇcníchstránek o projektu. Pˇridávánímjednot- livých modul ˚uuživatel získává informace o projektu jako celku i o jeho ˇcástech.Vytvoˇrení statistik, nalezení chyb v kódu, zobrazení výsledk ˚utest ˚u,to jsou jen nˇekterémožnosti, které Maven poskytuje. Tato práce se v první ˇcástisnaží pˇriblížitsystém Maven. Popisuje na pˇríkladechzp ˚usob použití a jednotlivé funkce. Snaží se o rozbor jeho ˇcástí– POM soubor ˚u,archetyp ˚u,mo- dul ˚ua jednotlivých fází projektu. Ctenáˇrzdeˇ m ˚uženaleznout jak teorii výstavby projektu v Mavenu, tak i názorné pˇríkladyz praxe. Druhá ˇcástse zabývá frameworkem Wicket. Pˇredstavujeprincipy tvorby webové apli- kace ve Wicketu a formou tutoriálu ukazuje konkrétní využití. Ve tˇretípodkapitole jsou pˇredstavenyWicket komponenty a popsána jejich tvorba a použití. Ctvrtᡠpodkapitola se vˇenujevalidaci uživatelských vstup ˚ua získávání dat z Model ˚u.Uživateli je ukázána Wicket šablona a vysvˇetlenyjednotlivé elementy. Protože Wicket není jediným Java frameworkem, je zde uveden i pˇrehledostatních framework ˚use struˇcnoucharakteristikou. Tˇretíˇcástje zamˇeˇrenana moduly. Ukazuje ˇctenáˇri,jak jsem postupovala pˇritvorbˇevlast- ního plugin Validátoru, jak jsem urˇcilajeho funkcionalitu a rozvržení do jednotlivých cíl ˚u (Maven goals). Také popisuje jednotlivá rozhraní použitá pˇriprogramování Validátoru. Ctvrtᡠˇcástpopisuje, jak jsem postupovala pˇriprogramování modulu pro validaci Ja- vaScriptu, kaskádových styl ˚u,XML a HTML soubor ˚ua Wicket šablon. Dále ukazuje kon- krétní použité Java knihovny a implementaci kontroly vybraných konvencí pˇripsaní kaská- dových soubor ˚ua Wicket šablon. 1 1. ÚVOD Praktickou ˇcástítéto práce je naprogramování vlastního modulu – Validátoru, který po pˇridánído systému zvaliduje soubory a výstup zobrazí ve formˇeMaven reportu. Validátor poskytne informace o poˇctunalezených chyb. Odkáže uživatele na konkrétní soubor a ˇcíslo ˇrádku,kde se chyba objevila. Uživatel si m ˚užepomocí parametr ˚udefinovat požadovaný pr ˚ubˇehvalidace. 2 Kapitola 2 Maven Maven [1,2] je nástroj pro širokou škálu uživatel ˚u.Pˇrikompilaci Java projektu, spouštˇení test ˚ua distribuci výsledk ˚use bˇežnýuživatel klidnˇem ˚užeobejít bez Mavenu. Jeho chvíle však nastává, když na projektu zaˇcnepracovat více lidí, je potˇrebasledovat výsledky test ˚u, generovat z nich statistiky a zpˇrístupˇnovatje všem ˇclen˚umtýmu. Maven nabízí nástroje jak pro programátory, tak i pro analytiky. Klade si za cíl sjednotit a zjednodušit správu projekt ˚u. Stará se o nastavení, kompilaci a získávání informací potˇrebnýchpro vedení projektu. Kompilace Java projektu je možná i z pˇríkazovéhoˇrádku,ale pro vˇetší rozsah projektu je znaˇcnˇenepˇrehledná.Jako další možnost pro sestavení projektu je využití Ant skriptu. Je ˇcastopoužíván, avšak ˇcímvˇetšírozsah projektu, tím delší skript. Maven nese všechny údaje potˇrebnépro sestavení a kompilaci v projektovém modelu v souboru pom.xml, který z ˚ustávána rozdíl od Antu pomˇernˇestruˇcnýa pˇrehlednýi pro rozsáhlé projekty. Na zaˇcátkupráce s Mavenem se od uživatele rozhodnˇeneˇceká,že si otevˇretextový edi- tor a zaˇcnesepisovat projektový model. Nejjednodušší zaˇcátekpráce s Mavenem je použít pˇreddefinovanýarchetyp, který vytvoˇríprojektovou strukturu i pom.xml sám na základˇe nˇekolikainformací od uživatele: mvn archetype:generate -DgroupId=cz.muni.fi.app -DartifactId=test -DarchetypeArtifactId=maven-archetype-webapp Archetyp má nˇekoliknásledujících ˇcástí: • archetype:generate – vytvoˇríšablonu, • -DgroupId=cz.muni.fi.app – název skupiny pro spoleˇcnéprojekty, • -DartifactId=test – název projektu a souˇcasnˇei název adresáˇre,ve kterém projekt bude, • -DarchetypeArtifactId=maven-archetype-webapp – definuje typ vytváˇrenéhopro- jektu. Maven si stahuje soubory z internetu, proto potˇrebujeminimálnˇepro první spuštˇení pˇrístupk internetu, aby si mohl stáhnout potˇrebnébalíˇckya aktualizace. Je to systém, který m ˚užebýt použit v r ˚uznýchvývojových prostˇredích,at’ už ve vývojovém prostˇredíEclipse 3 2.1. POM – PROJECT OBJECT MODEL pomocí pˇríkazumvn eclipse:eclipse, nebo s využitím zabudovaného pluginu v Netbeans. (AˇckolivNetbeans používají konkurenˇcníAnt skripty, umožˇnujíi vytvoˇreníprojektu typu Maven za pomoci r ˚uznýchvolitelných archetyp ˚u.) Ant skript (programovací jazyk pro tvorbu projektu) je v podstatˇeˇcástprogramu, která se skládá z jednotlivých pˇríkaz˚ua umožní programátorovi vytvoˇritjakoukoliv strukturu. Aˇckolivby se mohlo zdát, že tato vlastnost je bezproblémová, opak je pravdou. Každý skript vypadá jinak – déle trvá, než se v nˇemi zkušený programátor zorientuje. Hlavní výhodou Mavenu oproti Antu je jednotnost vytvoˇrenýchšablon (pom.xml). Vý- vojáˇrisi napoprvé vytvoˇríšablonu s detaily projektu, která m ˚užebýt znovu použita u dal- ších projekt ˚ujen s minimálními úpravami. Šablona je rozdˇelenado nˇekolikaˇcástí,které se použijí v daných fázích výstavby projektu. Maven je striktní pˇritvorbˇešablony. Na druhou stranu umožní zavolat na požadova- ném místˇeantovský skript, ˇcímžse snaží programátorovi nahradit funkce, které Maven zatím neobsahuje. Uživatel si m ˚užestrukturu nadefinovat i podle pˇrání.Pˇrikompilaci šab- lony Maven vytváˇríadresáˇrovoustrukturu podle zadaných parametr ˚uartifactId a groupId následujícím zp ˚usobem(obrázek 2.1): Obrázek 2.1: Standardní adresáˇrovástruktura 2.1 POM – Project Object Model Základem pro budování projektu je soubor pom.xml [3], který nese d ˚uležitéinformace. Po- mocí XML definuje strukturu a vlastnosti, které budou uplatnˇenyv daném projektu. POM soubor lze považovat za ekvivalent MakeFile souboru, ze kterého Maven získává informace pro vystavˇeníprojektu. Na rozdíl od ostatních nástroj ˚u,POM neobsahuje pˇrímoinstrukce, ale pouze atributy, které m ˚užeMaven využít. 4 2.1. POM – PROJECT OBJECT MODEL Znaˇckyv POM souboru mohou být rozdˇelenydo ˇctyˇrskupin podle informací, které poskytují. První skupina udává nutné parametry pro vytvoˇreníprojektu jako identifikátor projektu (groupId, artefactId), strukturu, verzi, závislosti a další. Ve druhé skupinˇese vyskytují všeobecné parametry – název projektu, autoˇriprojektu, licence pod kterou bude projekt publikován, atd. Znaˇckytˇretískupiny rozšiˇrujímožnosti pˇrivytváˇreníprojektu. Upravují polohu zdroj ˚u, pˇridávajímoduly a cíle (goals), které se mají pˇrivýstavbˇepoužít. Pokud chce vývojáˇrzískat informace o pr ˚ubˇehutvorby projektu, pˇridázde moduly pro poskytování reportu – výstupu v podobˇewebových stránek. Ctvrtouˇ skupinu tvoˇríznaˇckyupravující prostˇredí– odkud má Maven ˇcerpatdata, de- klarace profil ˚ua jiné. Aby mohl být projekt vystavˇen,mˇelby obsahovat alespoˇnˇctyˇrizákladní znaˇcky: • modelVersion, • groupId, • artifactId, • version. U version se m ˚užeobjevit speciální parametr SNAPSHOT, který je vývojový a zajišt’uje aktuálnost požadované verze. I tak málo Mavenu staˇcík vytvoˇreníprojektu. Maven získá ostatní potˇrebnéinformace ze SuperPOM tzv. rodiˇcovskéhoPOM, ze kterého dˇedívšechny Project Object Model soubory a ve kterém jsou uvedené základní konfiguraˇcníparametry. POM soubor, který se uplatní v konkrétním vystavˇeníprojektu, vzniká ze SuperPOM pˇrepsánímzadaných parametr ˚uod uživatele. Uplatˇnujese zde klasické dˇedˇenív dané hie- rarchii rodiˇcovskýcha potomkových POM. Aby se vývojáˇrvyznal v této hierarchii, m ˚užesi nechat vypsat obsah tzv. efektivního POM souboru, to jest výsledného POM, který se uplatní v tomto konkrétním pˇrípadˇe.Následující pˇríkazvypíše obsah efektivního POM: mvn help:effective-pom 2.1.1 Ukázka a rozbor ˇcástípom.xml V této kapitole bude ukázán a popsán seznam XML znaˇcek,které se mohou vyskytovat v Maven projektu. Pˇríklad2.1.1 obsahuje ˇctyˇrijiž výše zmiˇnovanéelementy: modelVersion , groupId, artifactId a version. Element groupId by mˇelbýt jedineˇcnýmoznaˇcenímprojektu nebo organizace. Využívá se v nˇemteˇckovánotace, která spoluvytváˇrístrukturu projektu. Teˇckyjsou nahrazeny oddˇelovaˇcipodle typu operaˇcníhosystému. Konkrétní název projektu je uveden v artifactId, který se spolupodílí na tvorbˇead- resáˇrovéstruktury. Aby mohl být projekt správnˇepoužit i v ostatních projektech, je nutné uvést verzi. Uvedením elementu packaging se rozliší, jaký typ projektu bude vytvoˇren. 5 2.1. POM – PROJECT OBJECT MODEL Pˇríklad2.1.1: Základní elementy Pˇríklad2.1.2: Elementy s informacemi o projektu Standardní hodnotou je jar, ale programátor si m ˚uževybrat z nˇekolikamožností (pom, jar, maven-plugin, ejb, war, ear, rar a par). Pokud chce programátor využít dˇedˇeníz urˇcitéhoprojektu, musí nastavit do elementu parent informace o rodiˇcovskémprojektu. Od rodiˇceprojekt pˇrevezmezávislosti, seznam a nastavení plugin ˚u,seznam modul ˚upˇrispívajícíchdo hlášení o projektu a informace o au- torech a pˇrispˇevatelích. Zatímco element dependencies definuje vlastní závislost projektu, dependencyMana- gement spravuje závislosti s ohledem na potomky projektu. Maven si odsud doplˇnujeverze pro jednotlivé ˇcástizávislostí. Element modules lze využít pˇrisjednocování projekt ˚u,které obsahují nˇekoliksamostatných menších projekt ˚u. Užiteˇcnoupom ˚uckoupˇriprogramování jsou elementy properties. S jejich pomocí si m ˚užeprogramátor nadefinovat hodnoty, na které se m ˚užeodkazovat jinde v souboru. Na místa, kam má být doplnˇenahodnota promˇenné,napˇríklad projectVersion, programá- tor umístí ${projectVersion} a Maven si hodnoty nahradí sám. Element build m ˚užeobsahovat hned nˇekolikdalších element ˚upro nastavení filtr ˚u,ad- resáˇre,kam se bude ukládat pˇrekompilovanýprojekt, definici cíle, definici místa uložení 6 2.2. FÁZE PROJEKTU Pˇríklad2.1.3: Elementy prostˇredí zdroj ˚u.Dále lze pˇridatelementy pro pluginy a jejich konfiguraci, které budou využity v pro- jektu. Pˇridánímodul ˚udo reporting elementu je obdobné jako pˇridáníostatních modul ˚u, avšak moduly v této sekci budou pˇrispívatpouze pˇrigenerování stránek o projektu. Liší se i adresáˇr,kam si ukládají své výsledky. Pokud uživatel nepˇrepsalukládací adresáˇr,stan- dardnˇesi report moduly ukládají data do ${basedir}/target/site. Dalších 8 element ˚uv pˇríkladu2.1.2 slouží k poskytnutí základních informací o projektu (název a popis projektu, odkaz na projektové stránky, rok vzniku, licenˇcnípodmínky, název firmy která projekt vyvíjela, konkrétní vývojáˇria pˇrispˇevatelé),které jsou vˇetšinoupouží- vané i pˇrigenerování stránek o projektu. Zbytek element ˚uv pˇríkladu2.1.3 nastavuje hodnoty pro prostˇredí,kde projekt bˇeží. Programátoˇrimohou nastavit napˇríkladvlastnosti a umístˇenírepozitáˇre,uvést kontakty na osoby spojené s projektem, pˇresmˇerovat na aktuální stránky po pˇremístˇeníprojektu a další. 2.2 Fáze projektu Programátor od Mavenu oˇcekávásestavení a pˇrekompilováníprojektu, ale na druhou stranu požaduje i mnoho s tímto nesouvisejících funkcí a vlastností. Maven získá z POM informace potˇrebnépro vybudování projektu a pak prochází nˇekolikafázemi a vykonává patˇriˇcnécíle (goals) s nimi spjaté, dokud není projekt vytvoˇren. Maven obsahuje 3 následující cykly s r ˚uznýmúˇcelem: • vytvoˇreníprojektu, • úklid projektu, • vytvoˇrenístránek o projektu. V cyklu úklidu projektu Maven vymaže adresáˇr,kam ukládá již pˇrekompilovanýpro- jekt. Pokud si uživatel nedefinoval sv ˚ujadresáˇr,standardnˇevymaže adresáˇr ${basedir}/ 7 2.3. FUNKCE A POUŽITÍ target, kde jsou uloženy i stránky o projektu. Úklid se provádí pˇríkazem mvn clean, kte- rým je vyvolán celý úklidový cyklus procházející tˇremifázemi (pˇredúklidovoufází, úklido- vou fází a poúklidovou fází), nebo pˇríkazem mvn clean:clean, který vyvolá cíle svázané pouze s úklidovou ˇcástí. Pˇríkazem mvn site programátor spustí cyklus tvorby stránek o projektu. Do tˇechto stránek pˇrispívajívšechny pluginy definované v POM v ˇcásti reporting. Vytvoˇrenéstrán- ky jsou uloženy do adresáˇre ${basedir}/target/site. Základní fáze cyklu vytvoˇreníprojektu [4], kterými Maven prochází, jsou: • validate – zkontroluje projekt a potˇrebnésoubory pro projekt, • compile – pˇrekompilujezdrojové kódy, • test – spustí testy zdrojových kód ˚u, • package – zabalí pˇrekompilovanékódy do JAR/WAR/EAR souboru, • integration-test – spustí a provede integraˇcnítesty, • verify – provede verifikaci pˇrekompilovanýchsoubor ˚u, • install – uloží soubor do lokálního úložištˇeMavenu, • deploy – nahraje soubory do vzdáleného úložištˇe,aby mohly být využity i ostatními uživateli Mavenu. 2.3 Funkce a použití 2.3.1 Generování stránek Kromˇesestavení projektu, které bylo popsáno již výše, Maven poskytuje i možnost gene- rovat si stránku se statistikami a dodateˇcnýmiinformacemi. Bez takovýchto stránek by byl projekt nepˇrehledný.Stránky pomáhají jak vývojáˇr˚um,tak koncovým uživatel ˚um. Pro uživatele jsou užiteˇcnér ˚uznénávody a popisy použití projektu, zatímco vývojáˇre zajímají statistiky využití jednotlivých ˇcástí,výsledky test ˚u,dokumentace a další. Aby se mohly zobrazit jednotlivé podrobnosti, musí být soubor pom.xml správnˇevy- plnˇený.Maven sice vygeneruje nˇekolikzáložek i k nejjednoduššímu POM, ale uživatel se z nich dozví pouze to, že nebyl pˇriˇrazenžádný popis viz obrázek 2.2. Stránky jsou konfigurovatelné – lze jim mˇenitvzhled (pomocí CSS styl ˚u)i obsah viz ob- rázek 2.3. Zmˇenv obsahu je možné docílit v sekci reporting v pom.xml, kde programátor uvede názvy modul ˚uzajišt’ujících požadované statistiky (napˇr.vývoj práce, pokrytí testy, odkazy na chyby v testech, atd.) Pokud si programátor pˇrejezmˇenitnapˇríkladi menu, horní panely nebo odkazy, pˇridá do adresáˇre ${basedir}/src/site/ soubor site.xml s deskriptorem stránek. 8 2.3. FUNKCE A POUŽITÍ Obrázek 2.2: Standardní stránky Následující pˇríkladdeskriptoru site.xml (pˇríklad2.3.1) ukazuje zmˇenulevého panelu na nové logo a pozmˇeˇnujenavigaˇcnímenu. Vytváˇrínové odkazy v menu, pro sekci Otázky a odpovˇedi vygeneruje rozbalovací menu, kde jsou odkazy na základní a pokroˇciléotázky vidˇetaž po rozbalení úvodu k nim. Maven má ustálenou adresáˇrovoustrukturu pro zdrojové soubory stránek, jak je vidˇet na obrázku 2.4. 2.3.2 Základní pˇríkazy Maven obsahuje nˇekolikzákladních pˇríkaz˚u: • create vybuduje základní soubory projektu. • compile pˇreložíJava soubory a uloží je do /target/classes/. • package vytvoˇríJAR/WAR/EAR soubor. • test pˇreložía spustí testy. • install uloží JAR soubor do lokálního úložištˇeMavenu. • site vygeneruje webovou stránku projektu. • clean smaže pˇrekompilovanésoubory. 9 2.4. MODULY Obrázek 2.3: Upravené stránky 2.3.3 Archetypy Pojem archetyp v Mavenu oznaˇcuješablonu, ze které Maven modul vytvoˇrínový projekt. mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.5 -DgroupId=com.mycompany -DartifactId=myproject Vznikají pˇredevšímpro opensource projekty, aby uživatel ˚umposkytly základní strukturu, kterou využijí napˇríkladpˇripráci s jednotlivými frameworky. Do pˇríkazuuživatel vyplní, jaký archetyp se má použít a základní tˇriparametry urˇcujícíjeho konkrétní projekt. Nˇekteˇríprogramátoˇriocení možnost vytvoˇritsi archetyp z již existujícího projektu. Po- kud budou potˇrebovatvytvoˇritnˇekolikpodobných projekt ˚u,použijí již vytvoˇrenýarchetyp, ˇcímžsi ulehˇcípráci a dosáhnou stejné struktury jako u prvního projektu. 2.4 Moduly Systém Maven obsahuje velké množství modul ˚u,které je možné pˇridatpouhým zapsáním jména modulu do pom.xml. V pˇrílozeA se nachází popis aktuálnˇedostupných modul ˚u. 10 2.4. MODULY Pˇríklad2.3.1: Zmˇenˇenýsite.xml Obrázek 2.4: Adresáˇrovástruktura stránek 11 Kapitola 3 Apache Wicket Wicket [5,6] je jeden z Java framework ˚upro tvorbu webových aplikací. Používá kompo- nenty napsané v programovacím jazyce Java a šablony v HTML na zobrazení aplikace uži- vateli. Snaží se jako ostatní frameworky ulehˇcit programátor ˚umnávrh a tvorbu webových aplikací. Vývojáˇrise však rozhodli vydat trochu jinou cestou a odlišit Wicket od ostatních. Zpoˇcátkuse m ˚užezdát tento pˇrístupzvláštní, avšak vede k tvorbˇepˇrehledného znovu vy- užitelného kódu. U webových aplikací je vyžadována stejná funkcionalita jako u bˇežnýchaplikací, avšak u webových aplikací musíme ˇrešitstavy dané aplikace. Není pˇrípustné, aby se napˇríklad pˇristisku tlaˇcítkazmˇenilyi okolní nesouvisející panely. Wicket se snaží ˇrešittuto situaci vytvoˇrenímmodelu, který bude zakrývat problémy se stavy a nechá uživatele programovat, jak je zvyklý pˇripráci s bˇežnouaplikací. 3.1 MVC architektura Wicket ke své práci využívá model na získání dat potˇrebnýchpro vykreslení komponent. Pojem model je chápán ve smyslu MVC model [7](Model-view-controller), který je oddˇe- lený od uživatelského rozhraní (view – pohled) a ˇrídícílogiky (Controller). Model je ve své podstatˇedoménovˇespecifická reprezentace dat. Pokud se zmˇenístav modelu, je na tuto zmˇenuupozornˇenpˇríslušnýpohled, aby se mohl aktualizovat. MVC Controller rozhoduje o tom, co se zobrazí uživateli, co se provede s daty na vstupu, jak se upraví data pˇriuživatelem vyvolané akci a jiné. MVC Pohled pro uživatele je urˇcenHTML šablonou. Na rozdíl od ostatních framework ˚u skýtá v této oblasti nˇekolikvýhod. Využívá ˇcistéHTML šablony se statickým kódem, které mohou obsahovat pouze HTML znaˇcky(tagy) a znaˇckypro umístˇeníkomponent. Tímto pˇrístupemje zajištˇenapˇrehlednostoproti pˇrístup˚um,kde se míchá prezentaˇcnívrstva s lo- gickou, a možnost opˇetovnéhopoužití kódu pˇrizmˇenˇenémvzhledu. Práce na vzhledu vý- sledných stránek nevynucuje znalost skriptování a ˇrídícílogiky. Wicket model tvoˇrírozhraní mezi pohledem a tˇrídami.Volba správného modelu m ˚uže programátorovi ušetˇritspoustu práce a ovlivnit bˇehaplikace. Každý model implementuje jednoduché rozhraní IModel, které má následující tvar: public interface IModel { public Object getObject(); 12 3.1. MVC ARCHITEKTURA public void setObject(final Object object); } Jednoduchost tohoto rozhraní má nˇekolikvýhod. Napˇríkladto, že model je použitelný pro všechny komponenty – to znamená, že každý typ komponenty nemusí mít svoje spe- ciální rozhraní pro model. Výbˇermodelu je ˇcistˇena programátorovˇeuvážení. Ve Wicketu lze podávat nˇekterétypy hodnot pˇrímo.Ty jsou automaticky obaleny defaultním modelem. Wicket obsahuje nˇekolikimplementací rozhraní IModel. Programátor má na výbˇermezi standardními implementacemi (Model, PropertyMo- del, CompoundPropertyModel, LoadableDetachableModel, ResourceModel, StringResour- ceModel) obsaženými ve wicketu nebo si m ˚užemodel vytvoˇritsám. Modely [8] mohou být rozdˇelenydo dvou typ ˚u.Prvním jednodušším typem jsou statické modely. Zobrazují data, jejichž hodnoty jsou konstantní, tj. stejné at’ si jejich hodnotu vyžá- dáme kdykoliv. Druhý typ je tvoˇrendynamickými modely, které odráží zmˇenyuskuteˇcnˇené s daty a pˇredáváaktuální hodnoty dat. 3.1.1 Model Model je nejjednodušší implementace IModel rozhraní. Použije se, i když má programátor dojem, že nepoužívá žádný model. Volání statických promˇennýchkomponenty je nejprve obaleno tímto základním modelem pomocí nˇehožse získají data. S jeho pomocí lze ˇrešiti pˇrístupk dynamicky se mˇenícímdat ˚umtak, že si pˇrímou každé komponenty pˇrepíšeme metody modelu get a set. Pˇripoužití tohoto modelu je však spousta vˇecíponechána na kontrole programátora. Napˇríkladsi programátor musí ohlídat, aby získaná data nemˇela hodnotu null. 3.1.2 PropertyModel Tento typ modelu patˇrímezi dynamické typy. Pˇristupujepˇrímoza bˇehuaplikace k jednot- livým vlastnostem objektu. Pˇrístupje provádˇenpomocí jednoduchých výraz ˚upopisujících danou vlastnost objektu. Využívá se Property Expression Language. Jako pˇríkladposlouží situace, kdy tˇrída Animal má dva atributy: name a species. Pˇrí- kazem new PropertyModel(Animal, "name") lze získat hodnotu atributu name pro dané zvíˇre.Programátor již nemusí hlídat, kdy objekt nabývá hodnoty null, aby bˇehapli- kace neskonˇcilvyjímkou. PropertyModel to dˇeláza nˇeja v takovém pˇrípadˇevrátí prázdný ˇretˇezec.Propojením objektu s komponentou pomocí PropertyModelu je zajištˇenopˇredávání aktuálních hodnot a programátor se o to nemusí starat již sám, jako to bylo u obyˇcejného Modelu. 3.1.2.1 Property Expression Language Tento jazyk je využíván k získávání hodnot v PropertyModelu. Byl odvozen z Object Graph Navigation Language a je pˇrizp˚usobenpotˇrebámWicketu. Principy jsou následující: uživa- 13 3.1. MVC ARCHITEKTURA tel zadá výraz pro požadovanou vlastnost. Následnˇejsou vyhledány metody get a set pro stejnˇepojmenovaný atribut. M ˚užebýt použita i teˇckovánotace. Napˇríklad výraz1.výraz2. Pokud je nalezena tˇrída odpovídající názvu výraz1, je pomocí konstruktoru vytvoˇrenajejí instance. Druhá ˇcást– výraz2 je použita pro vyhledání a získání atributu. Parser pro daný jazyk umožˇnujeještˇekonstrukci výraz.císloˇ . Pokud první výraz od- povídá poli nebo seznamu, je ˇcíslopoužito jako index pro získání hodnoty. Property Expression Language je jednoduchý na používání a zároveˇnposkytuje pˇrístup k široké škále hodnot, které mohou být využity. 3.1.3 CompoundPropertyModel CompoundPropertyModel má za úkol ještˇevíce ušetˇritprogramátor ˚umpsaní zdlouhavého kódu. Rodiˇcovskékomponentˇeje pˇriˇrazentento model a pro jednotlivé potomky již nemusí být uvádˇen.Komponenty s využitím svého identifikátoru si najdou svá pˇríslušnádata ve spoleˇcnémmodelu. Programátor si musí dát pozor na správné zanoˇreníkomponent a jejich pojmenování. V pˇrípadˇevíce vnoˇrenýchkomponent hledají se komponenty ze zdola nahoru pˇríslušnýzdˇedˇenýmodel. 3.1.4 ResourceModel Je základní model, který pomáhá pˇrilokalizaci webové aplikace. V konstruktoru dostává klíˇc,který následnˇevyhledá v pˇríslušnémsouboru. Tato varianta slouží jako alternativa ke znaˇcce 3.1.5 StringResourceModel StringResourceModel slouží také k lokalizaci aplikace. Na rozdíl od pˇredchozíhomodelu nedostává v konstruktoru jen klíˇcna vyhledání zdroje, ale i komponentu, ke které patˇrí, a model, který využívá. Umožní programátorovi vložit do zdroj ˚ui výrazy, které budou na- hrazeny hodnotami získanými z modelu uvedeného v konstruktoru StringResourceModelu. 3.1.6 LoadableDetachableModel Každý autor aplikace by si pˇrál,aby jeho webová aplikace bˇeželarychle a bezchybnˇe,mohla být využívána ˇradouuživatel ˚uzároveˇn,mˇelaminimálními nároky na pamˇet’, byla uživa- telsky pˇrívˇetiváa zajímavá, aby byla mezi uživateli oblíbená atd. Nˇekteráz tˇechtopˇránílze uskuteˇcnitjednoduše, jiná obtížnˇe.Snaha o minimalizaci nárok ˚una pamˇet’ patˇríke snáze re- alizovatelným pˇráním.Proto je pˇriprogramování tˇrebazvážit, která data se budou využívat a která mohou být v pˇrípadˇepotˇrebyznovu spoˇcítánaa tudíž není tˇrebaje ukládat. LoadableDetachableModel obsahuje metodu load(), která naˇcítápotˇrebnádata napˇrí- klad z databáze. Metoda je zavolána pˇriprvním volání metody getObject() a její výsle- 14 3.2. KOMPONENTY dek je uložen do pamˇeti.Pˇridalším požadavku na objekt je objekt hledán v pamˇeti.Další metodou je detach(), která projde jednotlivé komponenty, které byly aktivní v daném uži- vatelovˇepožadavku na vykreslení stránek, a vymaže již nepotˇrebnánaˇctenádata z cache pamˇeti.Tímto postupem se ˇcásteˇcnˇesníží nároky na pamˇet’. 3.2 Komponenty Pˇritvorbˇeaplikace se programátor musí nejprve zamyslet nad jejím rozvržením do kompo- nent, které budou uchovávat a spravovat dynamický obsah. Hlavním úkolem komponent je reagovat na události a poskytovat data k zobrazení. Wicket obsahuje nˇekteréjiž vytvoˇrené komponenty [9] pro: • výstup (textový nápis – label, víceˇrádkovýnápis, atd.), • rozvržení a seskupení (panel, ohraniˇcení,atd.), • odkazy (odkazy na stránky, externí odkazy, atd.), • formuláˇre(ˇcistýformuláˇr,tlaˇcítko,textová oblast, checkbox, seznam, atd.). Avšak uživatel m ˚uževyužít všech možností jazyka Java a naprogramovat si své vlastní komponenty. Tvorba komponenty zahrnuje tˇriúkony. První z nich je naprogramování funkcí a chování komponenty v Jave. Za druhé musí programátor vytvoˇritmísto v šablonˇe,kam bude hotová komponenta umístˇena.Posledním úkonem je zajištˇenídat pro tuto dynamic- kou komponentu. Aby se programátor vyhnul opakování ˇcástístejného kódu, m ˚užepoužít komponenty, protože je lze opakovanˇevkládat do stránek. Napˇríkladpoužít komponenty Panel. Tato komponenta vyžaduje mít pˇridˇelenušablonu se kterou bude provázána. Velkou výhodou Wicketu je uplatnˇení dˇediˇcnostiv šablonách. Ruku v ruce s hierarchií tˇrídje svázána hierarchie šablon. V pˇrípadˇe,že k dané tˇrídˇenení nalezena stejnˇepojmeno- vaná šablona, použije se šablona rodiˇce.jinak pˇríslušnášablona nahradí rodiˇcovskou,což nemusí být to, co programátor opravdu požaduje. Jako ˇrešením ˚uževyužít dˇediˇcnosta vlast- nost šablon vkládat se do druhé. Potomkova šablona se vloží na oznaˇcenémísto do šablony rodiˇce. 3.2.1 Form Komponenta sdružuje vstupní komponenty, jako jsou textová pole, zaškrtávací prvky, tla- ˇcítkaa jiné. S její pomocí se zpracovává veškerý vstup od uživatele. Získané hodnoty jsou validovány. Form umožˇnujeprogramátorovi definovat chování nad korektním i nekorekt- ním uživatelským vstupem. 15 3.3. TVORBA VLASTNÍCH KOMPONENT 3.2.2 Button Tlaˇcítkom ˚užebýt použito se dvˇemar ˚uznýmiznaˇckami(tagy 3.2.3 PasswordTextField V porovnání s obyˇcejnýmtextovým polem má tato komponenta nˇekolikvlastností navíc. Vy- plnˇenítohoto políˇcka(pokud je na stránce pˇrítomno)je považováno za povinné. S každým dalším vykonaným požadavkem je toto políˇckovyprázdnˇenoa jeho obsah nelze ukládat do cookies. 3.2.4 RepeatingView Pokaždé, když chce programátor vytvoˇritna stránkách opakující se položky, m ˚uževyužít tuto komponentu místo vypisování stejného kódu nˇekolikrátza sebou. RepeatingView do- káže v cyklu pˇridatnˇekolikkomponent, napˇríkladpoložek tabulky (pomocí komponenty Label), položek menu (s komponentami Label a Link) a jiných. 3.2.5 ListView ListView komponenta má stejnou funkcionalitu jako pˇredchozí.Na rozdíl od repeatingView se snaží ušetˇritprogramátorovi práci s vytváˇrenímunikátních id a starost o správné zano- ˇrení.Komponenta sama prochází položky seznamu a vytváˇrísi sv ˚ujvnitˇrnímanagement. Programátor pouze pˇridávádalší požadované komponenty k jednotlivým položkám se- znamu. 3.2.6 Panel Komponenta Panel slouží ke shlukování ostatních komponent. S její pomocí lze vytváˇret hierarchii nad ostatními komponentami. Její použití není složité, ale více pracné, protože vyžaduje svoji vlastní tˇríduna obsluhu na rozdíl od komponenty Fragment, která poskytuje tytéž služby. V prohlížeˇcisi m ˚užemeprohlédnout vzhled naší komponenty, i když šablona pro panel není kompletní HTML stránka. 3.3 Tvorba vlastních komponent Pˇripráci s frameworky nastávají situace, kdy má ˇclovˇekpˇresnoupˇredstavu,jak by mˇela komponenta vypadat a co by mˇeladˇelat,ovšem naleznout takovou komponentu již im- plementovanou není vždy možné. Tento problém vyˇrešívlastní komponenty. V porovnání s ostatními frameworky ve Wicketu je princip tvorby komponent intuitivní. Možností je nˇe- kolik: 16 3.4. KONTROLA UŽIVATELSKÉHO VSTUPU • dˇedˇeníz hotových komponent, • úprava chování komponenty, • skládání komponent do sebe. Jedním z nejjednodušších zp ˚usob˚utvorby komponenty je zdˇeditmetody a atributy ho- tových komponent a pˇretížitpatˇriˇcnémetody dle svých požadavk ˚u. Pˇridánímchování lze komponentˇedát nové vlastnosti a úˇcel.Pˇriˇrazeníse provádí pˇrí- kazem komponenta.add(chování). Chování musí implementovat rozhraní iBehavior [10] . Pˇrehledmetod je uveden v tabulce 3.1. Skládáním komponent se z malých ˇcástívykonávajících jen jednu ˇcinnostdá utvoˇritroz- sáhlejší komponenta. Pokud je vkládání provedeno smysluplnˇe,ušetˇríprogramátorovi vy- pisování dlouhých kód ˚u.V opaˇcnémpˇrípadˇese vytvoˇrenákomponenta již nedá jinde pou- žít. 3.4 Kontrola uživatelského vstupu Tvoˇrí-lifirma webovou aplikaci, v rámci analýzy vezme do úvahy, jací uživatelé ji budou používat a co jim umožní provádˇet.Pokud potˇrebujezískat informace od uživatele, musí pˇrehlednˇeoznaˇcit,jaká data má vložit. Ovšem nem ˚užepoˇcítats tím, že všechna data od uživatel ˚ubudou správnˇevyplnˇena. Je-li nˇekterývkládaný údaj nutný, oznaˇcíse za povinný (required). Tato vlastnost m ˚užebýt nastavena u jakéhokoliv vstupního pole pˇríkazem setRequired(true). Nevy- plnˇenépole oznaˇcenéjako povinné vyvolá chybové hlášení. Zobrazí se hláška s oznaˇcením nevyplnˇenéhopole, pˇrípadnˇejeho identifikátorem. Ze vstupních polí programátor získá String hodnoty. Jeho následujícím úkolem je za- jistit jejich pˇrevedenína požadovaný typ. Wicket sám zajistí pˇrevod.Vyžadovaný výsledný typ získá z Property modelu. PˇríslušnýpˇrekladaˇcWicket vyhledá v seznamu pˇriˇrazeném k aplikaci. Nad pˇreloženýmvstupem je spuštˇenavalidace. Wicket obsahuje nˇekolikimplementací validátoru, avšak uživatel jimi není vázán a m ˚užesi vytvoˇritsvé vlastní. Pomocnou tˇrídou pˇrivytváˇrenívlastního validátoru mu m ˚užebýt AbstractValidator. Každý typ vali- dátoru musí implementovat rozhraní iValidator nebo iNullAcceptingValidator. K jednomu vstupnímu poli m ˚užebýt pˇridánonˇekolikvalidátor ˚u.V pˇrípadˇechyby pˇrikon- trole jsou zobrazeny hlášky pro všechny validátory. 3.4.1 Validátory DateValidator [11] – nabízí funkce na kontrolu data (minimum, maximum, zda se datum nachází v daném rozsahu). EmailAddressPattern Validator – kontroluje, zda emailová adresa splˇnujenáležitosti plat- né pro email zadané regulárním výrazem. 17 3.5. SPECIÁLNÍ ŠABLONOVÉ ZNACKY:ˇ EqualInput Validator – projde dvˇepole a porovná získané hodnoty. EqualPasswordInput Validator – otestuje dvˇezadané hodnoty jednoho hesla na shodu. V pˇrípadˇeneshody je vytvoˇrenachybová hláška vztahující se ke druhému testovanému poli. Number Validator – implementuje testy na minimum, maximum, znaménko, zda leží ˇcíslov zadaném intervalu. Pattern Validator – kontroluje získanou hodnotu podle regulárního výrazu, který m ˚uže být zadán jako klasický Java regulární výraz nebo m ˚užebýt typu Metapattern. String Validator – otestuje ˇretˇezecna zadanou délku, zda splˇnujeminimální nebo maxi- mální délku. U validátoru jsou využívány komponenty FormComponentFeedbackBorder, které zajiš- t’ují zpˇetnouvazbu s uživatelem v pˇrípadˇešpatnˇezadaných vstupních hodnot. Vˇetšinou jsou pole oznaˇcenahvˇezdiˇckou. 3.5 Speciální šablonové znaˇcky: Wicket šablony mohou obsahovat kromˇeklasických HTML znaˇceki znaˇckyspeciální [12]: • • • • • • • • • • • • 18 3.5. SPECIÁLNÍ ŠABLONOVÉ ZNACKY:ˇ Znaˇcka • getMarkupSettings().setDefaultBeforeDisabledLink("požadovaná znacka");ˇ • getMarkupSettings().setDefaultAfterDisabledLink("požadovaná znacka");ˇ Pokud programátor požaduje pro kontrolu novˇevytvoˇrenékomponenty nebo ˇcástizna- ˇceknáhled, ale pozdˇejinechce, aby byla komponenta zobrazována uživateli, m ˚užepoužít znaˇcku Pˇríklad3.5.1: Použití znaˇckyenclosure Programátor nastaví viditelnost nápisu (Label) age pouze pokud existuje hodnota age pro daného uživatele. Výsledkem je, že se celý uzavˇrenýobsah nezobrazí, pokud nebude získána patˇriˇcnáhodnota pro age. Umístí-li programátor více komponent mezi 19 3.6. PRÍKLADWICKETŠABLONYˇ 3.6 PˇríkladWicket šablony Následující pˇríkladukazuje použití speciálních znaˇcekv šablonˇe.Necht’ základní šablona aplikace má následující podobu viz pˇríklad3.6.1. Pˇríklad3.6.1: Wicket šablona Na místo wicket identifikátoru panels bude vložena komponenta panel se šablonou z pˇríkladu3.6.2. Šablona panelu využívá dˇedˇení,proto v hierarchii musí existovat šablona, která bude doplnˇenana místo znaˇcky 20 3.7. OSTATNÍ JAVA FRAMEWORKY Pˇríklad3.6.2: Vkládaná Wicket šablona Pˇríklad3.6.3: RozšiˇrujícíWicket šablona 3.7 Ostatní Java frameworky Mezi ostatní Java frameworky pro tvorbu webových aplikací, využívající MVC model, patˇrí: • Aranea • Cocoon • Induction • JSF • Oracle Application Framework • Spring MVC Framework • Struts • Stripes • Tapestry • WebObjects • WebWork • Sofia • Struts2 21 3.7. OSTATNÍ JAVA FRAMEWORKY 3.7.1 Cocoon Cocoon [13, 14] vznikl jako jeden z projekt ˚uv dílnˇevývojáˇr˚uApache. Je navržen tak, aby splˇnovalarchitekturu MVC. Jedná se o Java servlet založený na XML, kde zdroje jsou trans- formovány do podoby stránek (HTML, XHTML, WML, PDF, . . . ). Transformace probíhá pomocí v ˇradˇeza sebou jdoucích komponent (vytváˇrírouru – pipeline), které mˇenívstupní data požadavku až do výstupní podoby, která bude zaslána klientovi. Pro výbˇersprávné cesty transformace slouží konfiguraˇcníkomponenta sitemap. Kom- ponenta obsahuje postup zpracování zdroj ˚upomocí generátor ˚u,transformátor ˚ua nástroj ˚u pro serializaci a ˇctení.Cocoon obsahuje mnoho pˇreddefinovanýchvariant pro vˇetšinutyp ˚u. Za nevýhodu tohoto frameworku je možné považovat nutnost pˇredemvytvoˇritopravdu kvalitní návrh, od jehož kvality se pak odvíjí složitost, pˇrehlednosta znovupoužitelnost komponent a uložených dat. Výhodou i nevýhodou Cocoonu je nutná dobrá znalost XML, XSL, CSS a XHTML, Javy, pˇrípadnˇei SQL, každý z tˇechtopožadavk ˚uslouží k vytvoˇrení ˇcástiwebových stránek. V pˇrípadˇepráce v týmu lze jednotlivé úkony rozdˇelitmezi ˇcleny programátorského týmu, pokud ale veškerá práce spoˇcívána jedné osobˇe, pak právˇemnož- ství potˇrebnýchznalostí m ˚užeˇcinitproblémy. Na projektu Cocoon se stále pracuje, v souˇcasnostivychází Cocoon 3. 3.7.2 Struts Tvorby frameworku Struts [15] se ujala již nˇekolikrátzmiˇnovanáApache Software Foun- dation. Struts je dˇelenýpodle MVC architektury. Jako modely zde vystupují komponenty JavaBeans, prezentaˇcnívrstvu tvoˇríJSP stránky a logickou vrstvu vytváˇríobsluhující tˇrídy. Za základ logické vrstvy lze považovat servlet ActionServlet, který rozdˇelujepráci mezi ostatní instance tˇríd.Jednotlivé tˇrídymají za úkol provést požadovanou akci nad objekty Ja- vaBeans. Každá akce musí být v jedné tˇrídˇe– je volána povinnou metodou Execute. Souˇcástí tvoˇrenéwebové aplikace musí být konfiguraˇcnísoubor struts-config.xml, který obsahuje r ˚uznánastavení a hlavnˇemapování akcí na jednotlivé tˇrídy. Strust obsahuje celou ˇradupˇredpˇripravenýchznaˇcekpro práci s šablonami, JavaBeans, HTML a jiné. Již zde je pozorovatelná jedna z nevýhod, nevyužívá dobˇreznámých zna- ˇceknapˇríkladpro html, ale zavádí znaˇckynové, které jsou pˇripožadavku pˇretransformo- vány. Podle úhlu pohledu tato vlastnost m ˚užebýt považována i za výhodu, objekt m ˚užebýt snadno pomocí atributu provázán s metodou JavaBeans. Struts se stále vyvíjí a rozšiˇruje.Obsahuje již množství plugin ˚u,napˇríklad plugin i pro dˇrívezmiˇnovanýCocoon. 3.7.3 Stripes Stripes [16] ˇcásteˇcnˇevychází ze zkušeností získaných pˇripráci se Struts. Již odpadá potˇreba mapování akcí v konfiguraˇcnímsouboru. Snaží se zjednodušit práci s frameworkem – na- pˇríkladpro vytvoˇreníformuláˇrejiž nepotˇrebujemít záznamy na ˇctyˇrechr ˚uznýchmístech. Programátor musí vytvoˇritpouze JSP a ActionBean, kde oznaˇcíanotaci @UrlBinding pro 22 3.7. OSTATNÍ JAVA FRAMEWORKY tvorbu odkazu a @HandlesEvent, aby svázal metody tˇrídys událostmi. Jednou z výhod je, že jeden ActionBean m ˚užeobsahovat nˇekolik akcí a framework je schopen si je provázat a vytvoˇritsi patˇriˇcnéURL.Výsledky lze oproti Struts pˇredata zobrazit jednodušeji. Další plus pro framework lze považovat možnost inkrementálního vývoje. 3.7.4 Tapestry Tapestry [17] pochází opˇetz dílny Apache Software Foundation. Jedná se o opensource pro- jekt, který se principem odlišuje od výše jmenovaných. Pˇriprogramování se nepoužívá JSP, ale nahrazuje se šablonami. Pro šablony existují tˇrídy, které je plní daty. Podle konvence jsou pojmenovány stejnˇejako šablony. Stejnˇejako wicket je Tapestry založen na komponentovém pˇrístupu,ze kterého jsou vystavˇenyvýsledné stránky. Pro oznaˇceníprovázání jednotlivých komponent s html znaˇckamise používá atribut jwcid. Framework si sám generuje URL adresy z pevnˇedané struktury umístˇenístránek a komponent. Pro tˇrídyobsluhující jednotlivé webové stránky je v této struktuˇrevyhrazeno místo v balíˇckupages. Komponenty lze tvoˇrita nastavovat pomocí anotací pˇrímove tˇrídách. Velká nevýhoda Tapestry je dána zpˇetnounekompatibilitou jednotlivých verzí. Pro pro- gramátora je obtížné s každou novou verzí vytváˇretnovu aplikaci a starou verzi zahodit. Framework se snaží dˇelatnˇekterévˇeci sám za programátora ve snaze mu vše zjednodušit, ale na úkor toho, že programátor ˇcásteˇcnˇeztrácí kontrolu nad pr ˚ubˇehem(napˇríkladnad vzhledem generovaných URL). 3.7.5 Aranea Za frameworkem Aranea [18] nestojí žádná velká organizace, nýbrž vznikl jako dílo nˇeko- lika programátor ˚u.Jedná se o opensource projekt. Rozsahem se Aranea ˇradík spíše menším framework ˚um.Základním kamenem jsou Komponenty (služby a widgets) s jednoduchým rozhraním. Pˇridatcizí komponenty je snadné, komponenta je obalena jako služba a simuluje se její ˇcinnostpˇresAPI. Pˇrínostohoto projektu do již rozsáhlého pole Java webových framework ˚uspoˇcíváv za- vedení takzvaných flows. Flows jsou jednotlivé procesy pˇrizpracování stránek, které si uchovávají sv ˚ujvnitˇrnístav, pokud je tˇrebapˇredatˇrízenína jiný flow. Po dokonˇceníse vrátí výsledná hodnota a obnoví se p ˚uvodníbˇeh. 3.7.6 Induction Webový framework Induction [19, 20] náleží do kategorie framework ˚uorientovaných na zpracování HTTP požadavku. Je pˇrevážnˇevhodný pro rozsáhlé webové aplikace. Jeho zá- klad tvoˇríJavaBeans, tˇrídyimplementující rozhraní Controllers, tˇrídypro Modely a ša- blony pro pohledy. V tomto pˇrípadˇese šablonami nazývají Java tˇrídysplˇnujícírozhraní Template. Pro každou šablonu musí existovat Javabean popisující data v šablonˇe. Jako výhody Induction autoˇriuvádˇejínˇekolikvlastností. Odpadá potˇrebarestartu po zmˇenˇekódu – staˇcíjen pˇrekompilovatzmˇenˇenýkód. Snaží se o zjednodušení nastavení, 23 3.7. OSTATNÍ JAVA FRAMEWORKY umožˇnujesnadnˇejšíanalýzu závislostí mezi vrstvami MVC modelu a další. Na obsluhu URL požadavku nabízí framework obslužné rutiny pro získání názvu tˇrídya konkrétní metody i pro pˇresmˇerování požadavku. 3.7.7 Spring Web MVC Framework Tento framework [21] se m ˚užepyšnit dobrou návazností na Spring, protože je navrhován vývojáˇrisamotného Springu. Základ Spring Web MVC tvoˇríservlet DispatcherServlet, který rozhoduje o tom, kam dále pˇredápožadavek k obsloužení. Aby mohl rozhodnout, potˇre- buje mapování pro jednotlivá URL na konkrétní kontroléry. Po obsloužení požadavku jsou výsledky poslány servletu ModelAndView na vykreslení. ModelAndView obsahuje jméno pohledu a modelovou mapu s objekty a názvy beans. Framework obsahuje množství pˇred- pˇripravenýchkontrolér ˚u.Programátor z nich m ˚užeˇcástzdˇedita ostatní ˇcástisi doprogra- movat. Framework umožˇnujezaˇcleniti jiné frameworky v kombinaci s Spring Web MVC Framework. Výhody samotného frameworku spoˇcívajív separaci jednotlivých rolí v rámci vrstev (pro každou roli existuje samostatný specializovaný objekt), v jednoduchosti provádˇení úkon ˚unesouvisejících s konkrétním požadavkem (pomocí HandlerInterceptoru a jeho metod pro zpracování pˇreda po zpracování požadavku), v podpoˇreJSP, JSTL a Velocity v znaˇckovacíknihovnˇea ve vylepšeném sestavování formuláˇrena JSP stránkách z nových znaˇcek. 3.7.8 Oracle Application Framework Framework [22] byl vyvinut organizací Oracle Corporation jako souˇcástOracle E-Business balíˇcku.Je naprogramován, aby zvládal obsluhu požadavku jen s nepatrným zpoždˇením. Pracuje výbornˇes napojením na Oracle databázi a je vystavˇennad MVC architekturou. Pro implementaci Modelu slouží pˇrednastavenéBC4J (Oracle Business for Java), takže programátor se m ˚užezamˇeˇritna logickou a pohledovou ˇcást.Pohledová ˇcástvyužívá upra- vené XML pro popis komponent a jejich hierarchie. Rízeníˇ a obsluhu požadavku zajišt’ují kontroléry, které jsou naprogramovány jako obyˇcejnéJava tˇrídy. OA Framework má implementováno nˇekolikzajímavých vlastností zpˇríjemˇnujícíchin- terakci aplikace s uživatelem, jako jsou napˇríkladpˇrekreslení jen ˇcástistránky, kde se ode- hrála akce (pˇridáníˇrádkydo tabulky, setˇrídˇenítabulky, . . . ), upozornˇení,pokud by uživatel kliknutím na odkaz mohl pˇrijíto provedené zmˇenyv transakci, mapování akcí na klávesy, usnadnˇeníhledání hodnot v seznamech, automatické doplnˇenízadané ˇcástiˇretˇezce,pokud je nalezena. Framework má být urˇcenk rychlé výstavbˇewebové aplikace nad databází i pro laiky v J2EE. 24 3.7. OSTATNÍ JAVA FRAMEWORKY 3.7.9 JavaServer Faces Komponentovˇeorientovaný framework JSF vznikl v dílnˇeSun Microsystems, Inc. Uživatel- ské rozhraní je jednoznaˇcnˇedáno speciálními XML znaˇckami,které získávají data z Java- Beans. Pro základní druhy použití jsou pˇripravenyknihovny obsahující soubory s popisy speciálních znaˇcek– Tag Library Description. JSF zajišt’uje kontrolu a ˇrízenípomocí FacesServlet a zároveˇnposkytuje sadu kompo- nent, nad kterými bude provádˇenakontrola a ˇrízení.Ani u JSP se nelze vyhnout mapování, aby požadavek mohl být pˇredánFacesServletu. Když servlet obdrží požadavek, získá hod- noty od uživatele (napˇríkladz formuláˇre)a nastaví je jednotlivým komponentám. Nad daty probˇehnevalidace s pˇrípadnýmvygenerováním chybových hlášení a následným zobraze- ním chyb uživateli. Jsou-li získaná data správná, pak jsou pomocí setter ˚unastavena jednot- livým Beans v Modelu a jsou pˇripravenana zpracování. Pomocí Backing beanu probˇehne zpracování požadavku. Nakonec dojde k vyrenderování výsledku v pˇríslušnémpohledu a zobrazení výsledku v uživatelovˇeprohlížeˇci. Aplikace postavená na JSF potˇrebujeke svému bˇehusoubor faces-config.xml, ve kterém jsou uložena konfiguraˇcnídata. Využívá jazyk výraz ˚u– expression language EL ke komu- nikaci komponent s Modelem. JSF jako takový se sám implementací Modelu nezabývá. Pohledová vrstva je tvoˇrenakomponentami a JSP. Všechny komponenty jsou pomocí speciální znaˇcky 3.7.10 WebObjects Objektovˇeorientovaný framework [23] byl vytvoˇrenprogramátory firmy Apple a je sou- ˇcástíXcode vývojáˇrskéhobalíˇckuv Mac OS X operaˇcníhosystému. Používá šablony ke ko- neˇcnémuzobrazení dat uživateli. Lze se zde setkat jednak s XML, tak i s jazykem SMIL. Podporuje tvorbu komponent tak, aby byly znovu použitelné. Komponenta se skládá z ˇcásti prezenˇcní(HTML) a z ˇcástiimplementující její funkcionalitu (Java tˇrída). WebObjects framework spolupracuje s Enterprise Objects Framework, který zprostˇred- kovává komunikaci s relaˇcnídatabází (pˇretváˇríjeden ˇrádektabulky na objekt), automaticky si generuje potˇrebnéSQL pˇríkazypro databázi. 3.7.11 WebWork OpenSymphony vyvinulo WebWork [24] za úˇcelemzjednodušení programování a zvýšení výkonu webových aplikací. Uživatel ˚uvpožadavek je po obdržení aplikací nejprve pˇrefiltro- ván pˇressoustavu filtr ˚ua pomocí mapování je zajištˇenonásledující zpracování. Následnˇe je naˇctena konfigurace a atributy pro požadovanou akci ze souboru xwork.xml, zjistí kdo se na akci bude podílet. Po zpracování je vrácen kód výsledku. ActionInvocation podle nˇej vyhledá konkrétní výsledek napˇríkladv podobˇeJSP stránky. 25 3.7. OSTATNÍ JAVA FRAMEWORKY WebWork framework byl dosti podobný Struts 1, a tak se s ním po dohodˇevývojáˇr˚u slouˇcil. 3.7.12 Sofia Framework Sofia [25] poskytuje programátor ˚umJ2EE tˇrídya knihovny se znaˇckamipro tvorbu webových aplikací napojených na databáze. Framework byl vyroben firmou Salmon LLC, které nevyhovoval software pro webové aplikace již existující. Sofia obsahuje pˇredde- finovaný kód, který získává data od uživatele z polí na stránce, pracuje s Modely a databází. Vývojáˇrivytvoˇrilimnožství komponent, které zahrnuli do knihovny s JSP znaˇckami.Pro vytvoˇrenínejjednodušší webové aplikace programátor musí vytvoˇrit2 soubory: Java tˇrídu poskytující funkcionalitu a JSP udávající, co uživatel na stránce uvidí a rozložení obsahu. 26 3.7. OSTATNÍ JAVA FRAMEWORKY Název metody Vstupní Návratový Popis metody parametry typ afterRender Component void Metoda je volána po vykreslení kompo- component nenty. beforeRender Component void Metoda je volána pˇredvykreslením component komponenty. bind Component void Metoda je volána okamžitˇepˇripˇriˇrazení component komponentˇe.Je využitelná napˇríkladpˇri inicializaci komponenty. detach Component void Slouží k odstranˇenístavu komponenty component získaného bˇehemzpracování poža- davku. exception Component void Pokud nastane chyba (je vyvolána vý- compo- jimka) pˇrivolání ostatních metod, je za- nent, volána tato metoda. Exception exception getStatelessHint Component boolean Metoda vrací hodnotu false, pokud její component tˇelogeneruje adresu (URL). isEnabled Component boolean Specifikuje, zda bude chování prove- component deno. Metoda je volána pˇrivykreslování. Pokud vrátí hodnotu true, je chování uplatnˇenona komponentu, jinak je cho- vání ignorováno. isTemporary žádný boolean Metoda vrací hodnotu true, pokud je chování doˇcasné. onComponentTag Component tag void Metoda je zavolána, když daná kompo- compo- nenta vykresluje pˇridˇelenouznaˇcku. nent, Compo- nentTag Tabulka 3.1: iBehavior 27 Kapitola 4 Modul Validátor Systém Maven se ˇradímezi modulární systémy. Jeho jádro je celkem malé, vˇetšinuúkol ˚u pˇrenechávána modulech. Bˇežnýuživatel si vybere z rozsáhlé nabídky modul ˚ua ani se vˇet- šinou nepodívá na zdrojový kód, natož aby si programoval vlastní modul. Maven rozlišuje dva typy modul ˚u: 1. Moduly podílející se na tvorbˇea kompilaci projektu. 2. Moduly poˇcítajícístatistiky a informace pro stránky projektu. Souˇcástítéto práce bylo naprogramovat modul Validátor, který bude validovat JavaScript, XML a HTML soubory, kaskádové styly a Wicket šablony. Výsledky by mˇelValidátor zob- razovat ve formˇeMaven reportu. Dále jsem do Validátoru zahrnula kontrolu vybraných konvencí pˇripsaní šablon a r ˚uznétypy výstupu. 4.1 Vytvoˇrenístruktury Jelikož pro vytvoˇreníobyˇcejnéhomodulu existuje nˇekolikdobˇrepopsaných postup ˚u,roz- hodla jsem se vytvoˇritnejprve obyˇcejnýmodul, který bude výsledky zobrazovat na termi- nál. Na zaˇcátkubylo tˇrebavytvoˇritadresáˇrovoustrukturu projektu a základní Java tˇrídu implementující metody Validátoru. Programátor má nˇekolikmožností, jak vytvoˇritprojekt. Mezi asi nejhorší možné ˇrešení je zaˇcítod zaˇcátku – vytvoˇritsi vlastnoruˇcnˇeadresáˇrovouhierarchii, základní soubory a POM soubor. Jako lepší ˇrešeníse nabízelo použití Mavenem poskytovaného archetypu pro plu- giny: mvn archetype:create -DgroupId=validator -DartifactId=maven-validate-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo 4.2 Deskriptor popisující Validátor KromˇenˇekolikaMOJO tˇrídnáleží ke každému modulu deskriptor. Deskriptor Validátoru poskytuje informace o cílech, konfiguraci jednotlivých MOJO tˇrídi o celém modulu. Maven 28 4.3. PRVNÍ VERZE VALIDÁTORU si pˇrinaˇcítáníValidátoru otevˇredeskriptor META-INF/maven/plugin.xml a pˇripravího k použití. Deskriptor má následující podobu, ze které lze vyˇcístnastavení Validátoru. Pˇríklad4.2.1: Obecná ˇcástdeskriptoru Validátoru Obecná ˇcástdeskriptoru (pˇríklad4.2.1) obsahuje identifikaˇcníúdaje Validátoru, popis modulu, jeho verzi a nˇekolikelement ˚uupˇresˇnujícíchspuštˇeníValidátoru. Pˇríklad4.2.2 ukazuje konkrétní nastavení MOJA validation-report, které má za cíl vyge- nerovat z výsledk ˚uvalidace webovou stránku. Validátor nevyžaduje spouštˇeníz pˇríkazové ˇrádky(requiresDirectInvocation = false). Jeho spuštˇeníje svázáno s projektem a nelze jej spustit bez pˇríslušnéhoprojektu (requiresProject = true). Validátor je naprogramován tak, že m ˚užebýt spuštˇenoffline, ale uživatel zde m ˚uženarazit na nˇekolikproblém ˚u,které po- drobnˇejirozeberu v kapitole 5.1 Validace XML. Cíl Validátoru jasnˇekoresponduje i s nastavenou fází, kdy má být úkol proveden. Imple- mentace cíle validation-report se nachází v Java tˇrídˇe ValidationReport. Validátor si z uživatelova POM bere seznam parametr ˚upro validaci JavaScriptu (viz pˇríklad4.2.3). Tyto parametry nejsou povinné, protože jsem do modulu zakomponovala základní nastavení, které použije v pˇrípadˇe,že uživatel seznam nedodá. Podrobný popis jednotlivých parametr ˚uje uveden v kapitole 5.2. Konfiguraˇcnísekce deskriptoru (viz pˇríklad4.2.4) udává hodnoty pro parametry: pro- jekt, projektový adresáˇra adresáˇrpro zápis reportu. K získání hodnoty se využívá jazyk Property Expression. 4.3 První verze Validátoru Jak již bylo ˇreˇcenodˇríve,Validátor mˇelnejdˇrívepodobu obyˇcejnéhomodulu. Konfiguraci Maven získával z elementu 29 4.3. PRVNÍ VERZE VALIDÁTORU Pˇríklad4.2.2: Cástˇ deskriptoru s konfigurací cíle Validátoru 4.3.1 MOJO První verze Validátoru se skládala z jednoho MOJO [26]. MOJO v Maven terminologii oznaˇc- kuje jednu Java tˇrídus jedním konkrétním cílem. Validátor implementoval rozhraní pro MOJO – org.apache.maven.plugin.Mojo, viz tabulka 4.1. Další možností bylo dˇedit z org.apache.maven.plugin.AbstractMojo tˇrídy, která též implementuje pˇredchozí rozhraní. Název metody Vstupní parametry Návratový typ execute žádný void getLog žádný Log setLog Log log void Tabulka 4.1: Rozhraní MOJO Metodu execute Maven volal pokaždé, když se mˇelValidátor spustit a zaznamenat sv ˚ujpr ˚ubˇehdo logu. Metoda ohlásila výjimku v pˇrípadˇe,že se vyskytla chyba pˇribˇehu Validátoru. K záznamu pr ˚ubˇehusloužil log nastavený metodou setLog. Poslední metoda tohoto rozhraní getLog sloužila k získání nastaveného logu. Pokud by Validátor využíval abstraktní tˇrídu AbstractMojo, nemusel by implemento- 30 4.4. ÚPRAVA A SBERVÝSLEDKˇ U˚ VALIDÁTORU Pˇríklad4.2.3: Deklarace parametr ˚umodulu vat metody pro nastavení logu. Tyto dvˇemetody jsou v abstraktní tˇrídˇejiž implementovány, zbývalo by naprogramovat pouze metodu execute. 4.3.2 Pˇrepracovánímodulu na Maven-report Validátor Aby Validátor mohl sloužit jako report modul, musel být pˇreprogramován, aby implemen- toval rozhraní MavenReport. Toto rozhraní obsahuje metody potˇrebnépro tvorbu výstupu v podobˇestránek o projektu. Rozhraní MavenReport vyžaduje k implementaci již více me- tod než p ˚uvodnírozhraní Mojo (viz tabulka 4.2). Kv ˚ulivˇetšímumnožství vyžadovaných metod bylo výhodnˇejšípoužít pro Validátor abs- traktní tˇrídu AbstractMavenReport (implementující rozhraní MavenReport), která ob- sahuje další užiteˇcnémetody navíc již naprogramované. Z abstraktní tˇrídy AbstractMa- venReport Validátor využil napˇríkladmetodu executeReport, která spouští jednotlivé validátory, sbírá jejich výsledky a upravuje je pro výstup. Zároveˇnposkytuje data pro r ˚uzné typy výstupu, viz kapitola 4.5. 4.4 Úprava a sbˇervýsledk ˚uValidátoru Rozhraní pro naprogramování reportu je jasnˇedané, ale další postup pˇritvorbˇereportu je nejasný. Návody ani rady, jak postupovat, jsem nenalezla. Proto jsem byla nucena postupo- vat systémem pokus – omyl. Jako zdroj inspirace mi posloužily již existující report moduly. Bohužel vˇetšinaz nich je rozsáhlá a pˇrepisovanáz modul ˚upro Maven 1, který využíval ještˇejazyk Jelly pro definici cíl ˚u. Jako ˇrešeníse nabízí využití Doxia Sink. Sink je tˇrída,která obsahuje celý soubor me- 31 4.4. ÚPRAVA A SBERVÝSLEDKˇ U˚ VALIDÁTORU Pˇríklad4.2.4: Konfigurace Validátoru tod pro oznaˇcovánía formátování ˇcástítextu a pˇrekladaˇcepro r ˚uznéjazyky. Doxia nabízí pˇrekladaˇcepro formáty: XHTML, Xdoc, FML, Docbook, Confluence, TWiki a APT. Postup tvorby dokumentu je následující. Pomocí SinkFactory vytvoˇríValidátor instanci sink: Sink sink = sinkFactory.createSink( File outputDir, String outputName ); Metoda createSink bere dva parametry: adresáˇr,kam bude uložen výstup, a pojmenování výstupního proudu. Pro formátování výsledk ˚uValidátor využívá metody dvojího typu, viz ukázka 4.4.1. První typ zastupuje otevírací element. Druhý typ metody, který má na konci názvu pod- tržítko, reprezentuje uzavírací element. sink.body(); sink.section1(); sink.text( "text" ); sink.section1_(); sink.body_(); Pˇríklad4.4.1: Metody tˇrídySink Pˇríklad4.4.1 vytvoˇrínásledující úsek kódu: 32 4.5. TYPY VÝSTUPU Název metody Vstupní pa- Návratový Popis metody rametry typ canGenerateReport žádný boolean Ovˇeˇrí podmínky pro úspˇešný vznik reportu. Vrátí hodnotu true pokud m ˚užeprobˇehnout generování reportu. generate Sink sink, void Vytvoˇríreport podle parametru Locale locale. locale getCategoryName žádný String Poskytuje typ vyžadovaného reportu. getDescription Locale String Metoda vrátí popis reportu locale v závislosti na parametru locale. getName Locale String Metoda poskytuje jméno re- locale portu v závislosti na parametru locale. getOutputName žádný String Vrací jméno reportu, pod kte- rým bude vystupovat pˇri vý- stupu. getReportOutputDirectory žádný File Vrací novˇenastavený adresáˇr, kam se bude ukládat report. isExternalReport žádný boolean Urˇcuje zda report bude volat program mimo Maven ke gene- rování reportu. setReportOutputDirectory File output- void Nastavuje adresáˇr,kam se bude Directory ukládat report. Tabulka 4.2: Rozhraní MavenReport 4.5 Typy výstupu Kromˇepˇrehlednýchstránek o projektu (viz obrázek 4.1) Validátor generuje ještˇedalší tˇri soubory: logovací soubor, textový výstup výsledk ˚ua XML výstup výsledk ˚u. Logovací soubor zaznamenává pr ˚ubˇehValidátoru. Lze v nˇemnaleznout datum a ˇcas spuštˇeníjednotlivých funkcí a názvy soubor ˚u,které byly validovány. Pokud by se vyskytla chyba pˇribˇehuValidátoru, v logu by se objevilo chybové hlášení o pˇríˇcináchselhání. Textový výstup obsahuje stejné informace jako stránka o projektu – název souboru, chyby nalezené pˇrivalidaci a celkový poˇcetchyb nalezených pˇrivalidaci kaskádových styl ˚u,Ja- vaScriptu, XML ˇciWicket šablony. Uživatel si m ˚uževybrat, která forma výstupu mu bude více vyhovovat. 33 4.5. TYPY VÝSTUPU Obrázek 4.1: Výstup Validátoru Experimentálnˇejsem zaˇradilai XML výstup ve stylu výstupu pluginu Findbug, jehož výsledky se dají dále zpracovávat jinými nástroji. Standard definující strukturu Findbug výstupu jsem nenalezla. Proto jsem analyzovala pˇríkladya z nich odvodila strukturu pro XML výstup Validátoru. 34 Kapitola 5 Knihovny používané ve Validátoru PˇredspuštˇenímValidátoru je nejprve tˇrebazískat data k validaci. Aby Validátor našel po- tˇrebnésoubory, nejprve získá adresáˇr,ve kterém se nachází projekt, který se snaží validaci spustit. Tuto hodnotu dostane pomocí výrazu ${basedir} z POM. Posléze projde adresáˇrovoustrukturou a otestuje typ souboru. Pro tento úˇcelValidátor využívá knihovnu mime-util [27]. Informace o ní Maven ˇcerpáze závislostí v POM (pˇríklad 5.0.1). Pˇríklad5.0.1: Závislost v POM Tuto knihovnu jsem zvolila, protože má nˇekolikvýhod. Její algoritmy se nerozhodují jen na základˇekoncovky. Knihovna je rychlá, snadno použitelná a dobˇredostupná v Mavenu. Následující pˇríkazvrátí mime typ konkrétního souboru. MimeUtil.getMimeTypes( file ); Validátor akceptuje pouze nˇekterétypy soubor ˚u: • application/x-javascript, • text/css, • text/xml, • text/html, Podle typu si soubory rozdˇelído 4 seznam ˚u.XML a HTML soubory jsou slouˇcenydo jednoho seznamu. Již v této fázi vzniká problém Validátoru rozlišit Wicket šablony od ostat- ních XML a HTML soubor ˚u.Každý seznam Validátor pˇredložípˇríslušnémualgoritmu ke kontrole. 35 5.1. IMPLEMENTACE VALIDÁTORU XML A HTML 5.1 Implementace Validátoru XML a HTML Organizace W3C vytváˇrístandardy a doporuˇcenípro jazyky využívané pˇritvorbˇewebo- vých stránek. Pod jejich záštitou vznikl i standard pro rozhraní, které definuje jak pracovat s dokumenty (DOM – document object model). Implementace tohoto rozhraní existují skoro ve všech jazycích. Vyjímkou není ani jazyk Java. Modul Validátor využívá knihovnu javax.xml.parsers. Pˇrespomocnou tˇríduDo- cumentBuilderFactory si nastaví vlastnosti vytváˇrenéhoparseru. Získaný parser pˇrikonstrukci stromu dat zároveˇnkontroluje strukturu podle uvedeného DTD nebo XML schématu. Zde se musí Validátor vypoˇrádatse získáváním schémat a DTD. Aby mohl být modul spuštˇeni offline, nese si s sebou základní DTD zaˇrazenédo XML ka- talogu. Pokud požadované schéma nenalezne, pokusí se jej získat pˇrímona adrese uvedené v hlaviˇcce. Pokud Validátor nenalezne schéma v ˚uˇcikterému má XML nebo HTML dokument kon- trolovat, pokusí se alespoˇnzkontrolovat, zda je dokument dobˇrestrukturovaný. Validátor pˇrepneparametr parseru, aby kontroloval pouze stukturu. Pˇriprogramování Validátoru jsem pˇredpokládala,že HTML nebo XML data budou od- dˇelenáod JavaScriptu a CSS – každá ˇcástbude v samostatném souboru. Pokud uživatel vepsal JavaScript nebo CSS styl pˇrímodo HTML stránky, obsah JavaScriptu ani CSS stylu nebyl zkontrolován. Pozdˇejijsem do Validátoru doprogramovala kontrolu vnoˇrenéhoJavaScriptu a CSS. Vali- dátor pˇristavbˇedokumentu vyextrahuje obsah elemet ˚u style a script a na každý spustí pˇríslušnouvalidaci. Pˇrípadnéchyby podá na výstup pˇrímou HTML souboru, tudíž nejsou zaˇrazenydo JS nebo CSS validaˇcnísekce výstupu. 5.1.1 XML katalog Jak již bylo ˇreˇceno,modul obsahuje nˇekolikzákladních DTD. Jejich seznam je uveden v XML katalogu, viz pˇríklad5.1.1. Vzhled katalogu je definován na stránkách organizace Oasis [28]. V hlaviˇccekatalogu se nachází odkaz na DTD dokument pro validaci katalogu. V sa- motném tˇelekatalogu jsou elementy 5.2 Implementace Validátoru JavaScriptu JavaScript je dynamicky typovaný jazyk. Dnes se stává hojnˇevyužívaný pˇritvorbˇewebo- vých stránek. Jeho podpora v prohlížeˇcíchse zlepšuje, ale stále je zde riziko, že v r ˚uzných prohlížeˇcíchnebude fungovat úplnˇestejnˇe. Validátor používá knihovnu jslint4java [29], která využívá nástroj JSLint [30] od Dou- glese Crockforda. 36 5.2. IMPLEMENTACE VALIDÁTORU JAVASCRIPTU Pˇríklad5.1.1: Ukázka ˇcástiXML katalogu Validátoru Knihovna je dostupná v Mavenu jako závislost (viz pˇríklad5.2.1). Pˇríklad5.2.1: Závislost v POM Validátor JavaScriptu se nezabývá jenom kontrolou syntaxe, ale snaží se zkontrolovat i dodržování nˇekterých konvencí (odsazení pˇríkaz˚umezerami, deklarace promˇenných,ma- ximální délka ˇrádku). JSLint umožˇnujeˇradunastavení pro r ˚uznékontroly. Validátor má v sobˇenaprogramo- váno bˇežnˇevyužívané nastavení, avšak umožˇnujeuživateli nastavení si upravit. Uživatel nastaví parametry v sekci Pˇríklad5.2.2: Nastavení parametr ˚uJSLintu v POM Nastavitelné parametry Validátoru jsou: • adsafe – kontroluje, zda JavaScript plní podmínky pro bezpeˇcnýkód bez cizích 37 5.2. IMPLEMENTACE VALIDÁTORU JAVASCRIPTU reklam (ADsafe projekt [31]). • bitwise – zakazuje používání bitových operátor ˚u<< >> >>> ~ & |. • browser – nastavuje vlastnosti jako v bˇežnémprohlížeˇci(viz pˇrílohaB). • cap – pokud je kontrolován celý HTML kód s JavaScriptem, tento pˇrepínaˇcpovoluje psaní HTML znaˇcekvelkými písmeny. • css – pˇrepínaˇcpovoluje i nestandardní zápis kaskádových styl ˚u.Vyžaduje ale, aby prvním pravidlem v CSS sekci bylo @charset "UTF-8"; pravidlo. • debug – povoluje znaˇckypro ladˇeníumístˇenév JavaScriptu. Pˇreduvedením do ost- rého provozu se doporuˇcujepˇrepínaˇcdebug vypnout. • eqeqeq – pˇrepínaˇcvyžaduje operátory === a !== místo == a !=. • evil – povolí existenci funkce eval v JavaScriptu. • forin – pˇrepínaˇcpovolí iteraci for cyklu pˇresvšechny vlastnosti objektu. • fragment – povoluje procházení a kontrolu ˇcástíHTML kódu. • immed – pˇrivolání funkce bez parametr ˚umusí být pˇrítomnyzávorky. • indent – vyžaduje standardní odsazení ˇctyˇrmimezerami. • laxbreak – JSLint bude tolerovat zalomení dlouhého ˇrádkui po znacích ) ] ++ -- jinak umožˇnujeodˇrádkovánípouze po následujících znacích: , . ; : { } ( [ = < > ? ! + - * / % ~ ^ | & == != <= >= += -= *= /= %= ^= |= &= << >> || && === !== <<= >>= >>> >>>= • newcap – vyžaduje velké poˇcáteˇcnípísmeno pouze u názvu konstruktoru. • nomen – zakazuje podtržítko na zaˇcátkua konci identifikátoru. • on – povoluje použití obsluhy událostí v HTML kódu. • onevar – vyžaduje, aby všechny promˇennébyly deklarovány na zaˇcátkukaždé funkce. Deklarace var se m ˚uževyskytnout v každé funkci pouze jednou. • passfail – pˇrepínaˇcnastaví chování JSLintu tak, že pˇriprvní chybˇezastaví kont- rolu a skonˇcí. • plusplus – zakáže operátory inkrementu ++ a dekrementu --. • regexp – nepovolí z bezpeˇcnostníchd ˚uvod˚uvýskyt teˇckya [^...] struktury v regu- lárních výrazech. 38 5.3. IMPLEMENTACE VALIDÁTORU CSS • rhino – nastavuje globální vlastnosti jako jsou v Rhino prostˇredí(viz pˇrílohaB). • safe – vyžaduje bezpeˇcnostnípodmnožinu pravidel definovaných projektem AD- safe. • sidebar – nastaví globální parametry prostˇredí jak vyžaduje Windows Sidebar Gadget. • strict – vyžaduje pˇríkaz"use strict"; definovaný v ECMAScript 5. • sub – povolí používání hranatých závorek i tam, kde by byla efektivnˇejšíteˇcková notace. • undef – zakáže používání promˇenných,které nebyly pˇredemdeklarovány. • white – uplatní pˇrísnˇejšípravidla na bílé znaky. • widget – pˇrevezmenastavení globálních parametr ˚uod Yahoo Widget (viz pˇríloha B). 5.3 Implementace Validátoru CSS V dnešní dobˇeby se jen velmi obtížnˇehledala stránka, která nevyužívá kaskádové styly na úpravu vzhledu stánek. CSS soubory poskytují snadnou cestu, jak zmˇenitvzhled. Pro pˇríbuznéprojekty lze použít totožné CSS, aby byl zachován jednotný vzhled a struktura projekt ˚u. Syntaxe kaskádových styl ˚unení nikterak složitá. Možná proto existuje velké množství parser ˚uCSS. Organizace W3C [32] se zabývá vydáváním standard ˚ui pro kaskádové styly. Pravˇena jejich stránkách lze nalézt rozhraní pro pˇrípadnouimplementaci parseru. Implementací exis- tuje hned nˇekolikv r ˚uznýchprogramovacích jazycích. V Javˇejsou naprogramovány tˇriimplementace (Flute 1.2, Batik SAC 1.2 CSS Parser a CSS Parser od Davida Schweinsberga). Ve Validátoru je použita knihovna CSS Parser od Davida Schweinsberga, obsahuje nˇe- kolik verzí parseru v závislosti na standardu CSS1 a CSS2. Pˇridáníknihovny do projektu Validátoru ukazuje pˇríklad5.3.1. Pˇríklad5.3.1: Pˇridáníknihovny pro CSS parser 39 5.4. IMPLEMENTACE VALIDÁTORU ŠABLON APACHE WICKET Pomocí tˇrídy ParserFactory Validátor získá instanci parseru. Parser dostane od Va- lidátoru CSS soubor, zkontroluje syntaxi souboru a pˇredávýsledky zpˇet.Pokud nalezne chybu, reaguje ohlášením výjimky s údaji, kde se chyba vyskytla. 5.3.1 Kontrola importu kaskádových styl ˚u Pokud uživatel využívá stejné kaskádové styly u r ˚uznýchstránek projekt ˚unebo má CSS pravidla rozdˇelenado více soubor ˚u,je zbyteˇcnékopírovat soubory na r ˚uznámísta nebo je spojovat do jednoho souboru. V pˇrípadˇezmˇenyuvnitˇrsouboru by musel uživatel opravovat data na nˇekolikar ˚uznýchmístech. Pro takovéto pˇrípadyCSS poskytuje pravidlo @import. Za @import následuje identifi- kátor importovaného kaskádového stylu. Pˇríkladpoužití: • @import "style1.css"; • @import url("style2.css"); Toto pravidlo musí pˇredcházetvšem ostatním druh ˚umpravidel. Pokud je umístˇeno jinde, pˇrizobrazování je ignorováno. Do Validátoru jsem zahrnula i kontrolu existence odkazovaných styl ˚u.Pomocí regulár- ního výrazu Validátor pˇreskoˇcímožný poˇcáteˇcníkomentáˇra ovˇeˇrí,zda soubor obsahuje importovací pravidla. Pokud nˇejakánalezne, zkontroluje, zda odkazované styly opravdu existují. V tomto momentˇeby se nabízela myšlenka, aby rovnou pˇrekontroloval jejich syntaxi. V pˇrípadˇe,že by více soubor ˚uimportovalo tentýž styl, modul by jej kontroloval nˇekolikrát, což by se mohlo projevit na výkonu. Ještˇehorší situace by mohla nastat, pokud by se snažil zkontrolovat styl, který by obsahoval další import pravidla.Takto by se mohl zanoˇritaž do nˇekolikaúrovní. Uživatel by v tu chvíli musel ˇcekatdlouhou dobu, aniž by vˇedˇel,proˇcse kontrola tak zpomalila. 5.4 Implementace Validátoru šablon Apache Wicket Jak již bylo zmínˇenodˇrívev textu, šablony Wicketu nejsou snadno rozeznatelné od oby- ˇcejnéhoHTML souboru, proto se Validátor spoléhá na jejich specifické uložení. Podle kon- vence by se šablony mˇely nacházet pˇrímou Java tˇríd.Tento adresáˇrje definován promˇen- nou sourceDirectory. Validátor se pokusí z hlaviˇckyzjistit XML namespace odpovídající Wicketu. Jestliže uspˇeje,zkontroluje šablonu v ˚uˇciwicket.dtd. 5.4.1 Wicket DTD Pro Wicket zatím neexistuje žádné kontrolní schéma. Do úvahy jsem zde vzala, že Wicket až na nˇekolikelement ˚u(viz kapitola 3.5) má podobu HTML souboru. Proto jsem pˇritvorbˇe DTD schématu vycházela z již existujících DTD soubor ˚upro HTML a rozšíˇrilaje o Wicket 40 5.4. IMPLEMENTACE VALIDÁTORU ŠABLON APACHE WICKET atributy a elementy. Konkrétnˇejsem rozšíˇrilaDTD xhtml1-strict.dtd o atribut wicket: id, který jsem pˇridalado skupiny koˇrenovýchatribut ˚u.Dále jsem nadefinovala ostatní ele- menty podle jejich možného výskytu a atribut ˚u,které mohou obsahovat. Wicket DTD neza- ruˇcujejedineˇcnostwicket id v dané struktuˇre,protože by se dostávalo do konfliktu s HTML atributem id. Tento problém by se dal vyˇrešitnahrazením DTD za XML schéma. V další verzi se zamˇeˇrímna tento problém a jeho ˇrešení.Pˇredpokládám,že existující XML schéma pro XHTML rozšíˇrímo elementy a atributy šablon Apache Wicket. 5.4.2 Kontrola Wicket konvencí Jednou ze zásad pˇritvorbˇeWicket šablon je stejné pojmenování s Java tˇrídouobsluhující danou šablonu. Validátor se pokusí u každé nalezené šablony otestovat, zda existuje stejnˇepojmenovaná Java tˇrída.Pokud ji nenalezne, pˇredáchybové hlášení do výstupu. 41 Kapitola 6 Závˇer Modul Validátor v této verzi je již plnˇefunkˇcní.Validuje XML soubory, šablony kaskádových styl ˚u,JavaScript i šablony Apache wicket. Zamˇeˇrujese i na kontrolu nˇekterýchkonvencí platných u Wicketu. Avšak jeho vývoj není ještˇeu konce. Domnívám se, že Validátor poskytne uživatel ˚umužiteˇcnéfunkce a zaˇradíse mezi pou- žívané moduly. Do budoucna je možné rozšíˇritValidátor o další nástroje a propojit ho s již existujícími nástroji pro správu kódu a chyb. Pˇripˇríštímrozšiˇrováníby mohla být zvýšena granularita projektu. Umožnit uživateli pˇrístupk jednotlivým validacím. V dobˇeodevzdání této práce modul po provedených testech ˇcekázveˇrejnˇeníve vývojové sekci sandbox v repozitáˇriMavenu, kde jej budou moci otestovat již pˇrímouživatelé. Pokud nebude odhalena žádná závažná chyba, bude pˇresunutmezi standardní moduly, kde bude plnˇek dispozici všem zájemc ˚um. 42 PˇrílohaA Pˇrehleddostupných modul ˚u Tento pˇrehledsi neklade za cíl být úplný. Jeho úkolem je seznámit ˇctenáˇrese základními a nˇekerýmirozšiˇrujícímimoduly. Název Popis clean Modul zajišt’uje úklid po vygenerování projektu. compiler PˇrekompilujeJava zdrojový kód. deploy Nahraje pˇrekompilovanýprojekt do vzdáleného repozitáˇre. install Nainstaluje pˇrekompilovanýprojekt do lokálního repozitáˇre. resources Obstarává práci se zdroji. site Generuje stránky o projektu. surefire ZprostˇredkováváspouštˇeníJUnit test ˚ua zobrazení jejich vý- sledk ˚u. verifier Zajišt’uje integraˇcnítest. ear Spouští se pˇrigenerování EAR. ejb Spouští se pˇrigenerování EJB. jar Spouští se pˇrigenerování JAR. rar Spouští se pˇrigenerování RAR. war Spouští se pˇrigenerování WAR. Tabulka A.1: Základní moduly 43 A.PREHLEDDOSTUPNÝCHMODULˇ U˚ Název Popis clover Generuje Clover report stránky. doap Generuje soubor s popisem projektu. docck Kontroluje dokumentaci projektu. changelog Generuje seznam zmˇenze SCM (Source Code management). changes Generuje report stránky nebo dokument se zmˇenamiv pro- jektu. checkstyle Generuje report stránky v závislosti na stylu jejich kódu. javadoc Vygeneruje JavaDoc stránky. jxr Analyzuje Java zdrojové soubory a vygeneruje stránky s anoto- vaným zdrojovým kódem. pmd Prohledá Java zdrojový kód a vygeneruje stránku informující o chybách v kódu project-info-reports Generuje stránky s informacemi o projektu. surefire-report Vygeneruje stránku s výsledky JUint test ˚u. Tabulka A.2: Report moduly 44 A.PREHLEDDOSTUPNÝCHMODULˇ U˚ Název Popis ant Generuje Ant soubor pro projekt. antrun Spouští Ant úlohy. archetype Vytvoˇrízákladní strukturu projektu daného archetypu. assembly Vytvoˇrí binární distribuci projektu (zahrnující pomocné skripty, konfiguraci a závislosti). dependency Analyzuje závislosti uvedené v projektu. enforcer Kontroluje omezení prostˇredí, kde má být projekt používán (použitý operaˇcnísystém, JDK verze atd.). gpg Podepíše ˇcástiprojektu pomocí GnuPG (Open PGP). help Poskytne informace o prostˇredí,ve kterém má projekt bˇežet. invoker Spustí nˇekolikprojekt ˚ua ovˇeˇríjejich úspˇešnýpr ˚ubˇeha výstup. jarsigner Vytváˇría ovˇeˇrujepodpis ˇcástíprojektu. one Umožˇnujepráci s první verzí Mavenu a jeho repozitáˇrem. patch Provádí opravu chyb v kódu pomocí patche. pdf VytvoˇríPDF dokument o projektu. plugin Vygeneruje deskriptor pro nalezené MOJO v projektu. release Umožní zveˇrejnˇeníprojektu. reactor Používá se pˇrihromadné výstavbˇenezávislých projekt ˚u. remote-resources Zajišt’uje a kopíruje vzdálené zdroje do adresáˇrevýstupu pro- jektu. repository Stará s o spouštˇenía pr ˚ubˇehúkol ˚upracujících s repozitáˇrem. scm Generuje SCM (Source Code management) pro daný projekt. source Vygeneruje JAR z využívaných zdroj ˚u. stage Kopíruje projekt z jednoho repozitáˇredo druhého, využívá se pˇrizveˇrejnˇeníprojektu. toolchains Poskytuje sdílené nastavení všem používaným modul ˚um. Tabulka A.3: Nástroje Název Popis eclipse Vytvoˇrísoubory potˇrebnépro práci s projektem v prostˇredíE- clipse. idea Vytvoˇrí soubory potˇrebné pro práci s projektem v prostˇredí IDEA. Tabulka A.4: IDE moduly 45 A.PREHLEDDOSTUPNÝCHMODULˇ U˚ Název Popis maven-timestamp- Usnadˇnujevytvoˇrenía práci s ˇcasovýmirazítky. plugin maven-license-plugin Spravuje a aktualizuje licence uvedené u jednotlivých zdroj ˚u. maven-yapp-plugin Rozšiˇrujemožnosti eclipse pluginu pˇripráci s moduly. maven-annotation- Pomáhá pˇrizpracování Java anotací. plugin maven-twitter-plugin Zlepšuje komunikaci mezi vývojáˇria uživateli. Umožˇnujezasí- lat aktualizace Twitter hlášek pˇrímoz Mavenu. maven-download- Umožní Mavenu stahovat r ˚uznésoubory pomocí r ˚uznýchpro- plugin tokol ˚u. maven-dbdep-plugin Ukládá závislosti projekt ˚udo databáze. Zlepšuje a zjednodu- šuje jejich správu. maven-plugin- VytvoˇríJava tˇrídyz již hotových PL/SQL pˇríkaz˚u. plsqlgen maven-hudsonconfig- Poskytuje systému Hudson konfiguraci získanou z POM. plugin Tabulka A.5: Ostatní moduly 46 PˇrílohaB Nastavení globálních parametr ˚uu JSLint pˇrepínaˇc˚ubrowser, rhino a widget B.1 browser addEventListener: false location: false print: false blur: false moveBy: false resizeBy: false clearInterval: false moveTo: false resizeTo: false clearTimeout: false name: false screen: false close: false navigator: false scroll: false closed: false onblur: true scrollBy: false defaultStatus: false onerror: true scrollTo: false document: false onfocus: true setInterval: false event: false onload: true setTimeout: false focus: false onresize: true status: false frames: false onunload: true top: false getComputedStyle: false open: false XMLHttpRequest: false history: false opener: false Image: false Option: false length: false parent: false B.2 rhino defineClass: false print: false serialize: false deserialize: false quit: false spawn: false gc: false readFile: false sync: false help: false readUrl: false toint32: false load: false runCommand: false version: false loadClass: false seal: false 47 B.3. WIDGET B.3 widget alert: true isApplicationRunning: true savePreferences: true animator: true iTunes: true screen: true appleScript: true konfabulatorVersion: true ScrollBar: true beep: true log: true showWidgetPreferences: true bytesToUIString: true md5: true sleep: true Canvas: true MenuItem: true speak: true chooseColor: true MoveAnimation: true Style: true chooseFile: true openURL: true suppressUpdates: true chooseFolder: true play: true system: true closeWidget: true Point: true tellWidget: true COM: true popupMenu: true Text: true convertPathToHFS: true preferenceGroups: true TextArea: true convertPathToPlatform: true preferences: true Timer: true CustomAnimation: true print: true unescape: true escape: true prompt: true updateNow: true FadeAnimation: true random: true URL: true filesystem: true Rectangle: true Web: true Flash: true reloadWidget: true widget: true focusWidget: true ResizeAnimation: true Window: true form: true resolvePath: true XMLDOM: true FormField: true resumeUpdates: true XMLHttpRequest: true Frame: true RotateAnimation: true yahooCheckLogin: true HotKey: true runCommand: true yahooLogin: true Image: true runCommandInBg: true yahooLogout: true include: true saveAs: true 48 PˇrílohaC Obsah pˇriloženéhoCD PˇriloženéCD obsahuje: • Zdrojové kódy modulu, • Pˇrekompilovanýmodul, • JavaDoc, • Pˇrehledparametr ˚umodulu. 49 Literatura [1] The Apache Software Foundation: Maven, The Apache Software Foundation, 5.1.2010, http://maven.apache.org/ .2 [2] O’Brien, T. a Casey, J. a Fox, B. a Snyder, B. a Van Zyl, J. a Redmond, E.: Maven: The Definitive Guide, O’Reilly Media, 2008, 978-0-596-10302-6.2 [3] The Apache Software Foundation: Maven – POM Reference, The Apache Software Foundation, 23.11.2009, http://maven.apache.org/pom.html . 2.1 [4] The Apache Software Foundation: Introduction to the Build Lifecycle, The Apache Software Foundation, 23.11.2009, http://maven.apache.org/guides/ introduction/introduction-to-the-lifecycle.html . 2.2 [5] Locke, J.: Apache Wicket Introduction, The Apache Software Foundation, http:// wicket.apache.org/introduction.html .3 [6] Dashorst, M. a Hillenius, E.: Wicket in Action, Manning Publications Co., 2009, 1- 932394-98-2.3 [7] Reenskaug, T.: MVC, Xerox PARC, 1979, , http://heim.ifi.uio.no/~trygver/ themes/mvc/mvc-index.html . 3.1 [8] O’Cleirigh, M.: Working with Wicket models, The Apache Soft- ware Foundation, 24.10.2009, http://cwiki.apache.org/WICKET/ working-with-wicket-models.html . 3.1 [9] Apache Wicket: Wicket Examples – component reference, Apache Wicket, http:// wicketstuff.org/wicket13/compref/ . 3.2 [10] Ebert, R. a Hillenius, E. a Vaynberg, I.: IBehavior, The Apache Software Foundation, http://wicket.apache.org/docs/1.4/org/apache/wicket/behavior/ IBehavior.html . 3.3 [11] Locke, J. a Compagner, J.: DateValidator, The Apache Software Foundation, http://www.wicketframework.org/apidocs/wicket/markup/html/ form/validation/DateValidator.html . 3.4.1 [12] Hamblen, N.: Web development with Wicket, JavaWorld.com, 07.17.2008, http://www.javaworld.com/javaworld/jw-07-2008/jw-07-wicket2. html?page=2 . 3.5 [13] The Apache Software Foundation: Cocoon Main Site, The Apache Software Foun- dation, http://cocoon.apache.org/ . 3.7.1 [14] Langham, M. a Ziegeler, C.: Cocoon: Building XML Application, New Riders Pub- lishing, 2003, 0-7357-1235-2. 3.7.1 50 [15] The Apache Software Foundation: Apache Struts, The Apache Software Foundation, http://struts.apache.org/ . 3.7.2 [16] Gunter, B. a Hinkle, G. a Fennell, T.: Home – Stripes – Stripes Framework, http: //www.stripesframework.org/ . 3.7.3 [17] The Apache Software Foundation: Apache Tapestry, The Apache Software Foun- dation, 3.11.2009, http://tapestry.apache.org . 3.7.4 [18] Webmedia: Aranea Web Application Platform, Webmedia, http://www. araneaframework.org/?pid=docs . 3.7.5 [19] Acciente, LLC: Induction – high performance, open source, Java MVC web application framework, Acciente, LLC, http://www.inductionframework.org/ . 3.7.6 [20] Raj, A.: Induction MVC Framework, Acciente, LLC, 11.12.2009, http://www. inductionframework.org/intro-to-induction-phxjug-dec-2009.pdf . 3.7.6 [21] Johnson, R. a Hoeller, J. a Arendsen, A. a Sampaleanu, C. a Harrop, R. a Risberg, T. a Davison, D. a Kopylenko, D. a Pollack, M. a Templier, T. a Vervaet, E. a Tung, P. a Hale, B. a Colyer, A. a Lewis, J. a Leau, C. a Evans, R.: The Spring Framework – Refe- rence Documentation, http://static.springsource.org/spring/docs/2. 0.x/reference/mvc.html . 3.7.7 [22] Oracle Corporation.: Oracle Applications Framework: Developer’s Guide, Persona- lization Guide and Tutorial Lessons, Oracle Corporation., 8.7.2004, http://www. semihuslu.com/tutorial/OA%20Framework_Java.pdf . 3.7.8 [23] Apple Inc.: Tools – WebObjects, Apple Inc., http://developer.apple.com/ tools/webobjects/ . 3.7.10 [24] OpenSymphony: WebWork, OpenSymphony, http://www.opensymphony.com/ webwork/ . 3.7.11 [25] Salmon LLC: SOFIA, JavaDevelopersJurnal.com, únor 2003, http://www. salmonllc.com/Jsp/salmonweb/bin/JDJReview.pdf . 3.7.12 [26] The Apache Software Foundation: Maven – Mojo API Specification, The Apache Software Foundation, 23.11.2009, http://maven.apache.org/developers/ mojo-api-specification.html . 4.3.1 [27] Medsea Business Solutions S.L.: mime-util, Medsea Business Solutions S.L. , http: //www.medsea.eu/mime-util/ .5 [28] OASIS: XML Catalogs, The Organization for the Advancement of Structured Information Standards, 6.8.2001, http://www.oasis-open.org/committees/ entity/spec.html . 5.1.1 51 [29] dom.happygiraffe.net: jslint4java, dom.happygiraffe.net, http://code.google. com/p/jslint4java/ . 5.2 [30] Crockford, D.: JSLint, The JavaScript Code Quality Tool, 2002, http://www. jslint.com/ . 5.2 [31] ADsafe.org: ADsafe, http://www.adsafe.org/ . 5.2 [32] Schweinsberg, D.: SAC: The Simple API for CSS, W3C, 3.12.2009, http://www.w3. org/Style/CSS/SAC/ . 5.3 52
Age: number age
panels
Modul Do Systému Maven
nebo . Dvojice a má podobný význam jako a . Znaˇcka oznaˇcujemísto ve , kam má být vložen obsah konkrétní instance komponenty border. slouží jako znaˇckapro komponentu fragment, což je obdoba pa- nelu. Fragment má oproti panelu výhodu, že nevyžaduje svoji vlastní tˇrídua šablonu. Mezi znaˇcky mohou být vkládány i jiné kompo- nenty.Wicket Example css"/> About Page
text