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

BlueOrganization img/logo.png http://www.blue-organization.com

...

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, u které byl programátor nucen pˇripˇresunutítextu sám kontrolo- vat odpovídající hierarchii šablon a Java tˇríd.

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