MASARYKOVA UNIVERZITA F}w¡¢£¤¥¦§¨  AKULTA INFORMATIKY !"#$%&'()+,-./012345

Dynamické generovaní obsahu s Server Pages

BAKALÁRSKÁPRÁCEˇ

Petr Lorenc

Brno, podzim 2007 Prohlášení

Prohlašuji, že tato bakaláˇrskápráce je mým p ˚uvodnímautorským dílem, které jsem vypra- coval samostatnˇe.Všechny zdroje, prameny a literaturu, které jsem pˇrivypracování použí- val nebo z nich ˇcerpal,v práci ˇrádnˇecituji s uvedením úplného odkazu na pˇríslušnýzdroj.

Vedoucí práce: RNDr. Vlastislav Dohnal, Ph..

ii Shrnutí

Tato bakaláˇrskápráce provádí ˇctenáˇrevznikem webové aplikace. Ta je vystavˇenana plat- formˇeJava, konkrétnˇena technologiích JavaServlets a Java Server Pages. Umožˇnujedyna- mické generování obsahu uloženého v databázi MySQL. Architektura aplikace ctí návrhový vzor Model-Pohled-Rídícíˇ ˇcást.Model aplikace reprezentují JavaBean komponenty, pohled tvoˇríJSP stránky a ˇrídícíˇcástzastupují servlety. V prvních ˇctyˇrechkapitolách je probrána teorie užitá ve webové aplikaci spolu s vysvˇet- lením pojm ˚usouvisejících s danou problematikou. Pátá kapitola, spolu se zdrojovým kó- dem webové aplikace, tvoˇrínávod, demonstrující použití výše popsaných teoretických po- znatk ˚u,kvytvoˇreníwebové aplikace. Tato ukázková webová aplikace má ˇctyˇriverze. První je obdoba aplikace „Ahoj Svˇete!“, následující didakticky pˇridávajídalší funkˇcníprvky s tím, že poslední verze je již principiálnˇeplnohodnotnou webovou aplikací nabízející dynamické generování obsahu díky propojení s databází MySQL. Využívá se zde nástroj ˚utechnologie JSP nabízejících zefektivnˇenípráce pˇrivývoji webových stránek, jako napˇr.JSTL, Expression Language, JSP direktivy a akce. Vyústˇenímtohoto návodu je pak webová aplikace LogoArena.cz. Tato je, co do množ- ství zdrojového kódu, rozsáhlejší, nicménˇes pˇredešlouukázkovou aplikací naprosto rovno- cenná, bere-li se jako mˇeˇrítkonávrh architektury a použité technologie. Aplikace LogoArena.cz má již ambice reálného nasazení na web. Jedná se o internetový obchod s mobilním obsahem, jakým jsou napˇríkladobrázky ˇcianimace. Spuštˇenítˇechto stránek se plánuje na druhou polovinu roku 2008.

iii Klíˇcováslova

Webová aplikace, Java, JSP, JavaServlets, MySQL, Dynamické generování obsahu webových stránek

iv Obsah

1 Úvod ...... 1 2 JavaServlets ...... 2 2.1 Životní cyklus servletu ...... 2 2.2 Sdílení informací ...... 2 2.2.1 Rozsah platnosti application ...... 3 2.2.2 Rozsah platnosti session ...... 4 2.2.3 Rozsah platnosti request ...... 4 2.3 Volání dalších webových prostˇredk˚u ...... 4 2.3.1 Vkládání webových prostˇredk˚u ...... 4 2.3.2 Pˇredáníˇrízenídalšímu webovému prostˇredku ...... 5 2.4 Filtrování požadavk ˚ua odpovˇedí ...... 5 3 Java Server Pages ...... 6 3.1 Struktura JSP stránky ...... 6 3.2 Skriptovací elementy ...... 7 3.2.1 Deklarace ...... 7 3.2.2 Výrazy ...... 7 3.2.3 Scriptlety ...... 7 3.3 Direktivy JSP ...... 7 3.3.1 Direktiva page ...... 8 3.3.2 Direktiva include ...... 8 3.3.3 Direktiva taglib ...... 9 3.3.3.1 Uživatelské znaˇcky ...... 9 3.4 Akce ...... 11 3.4.1 JavaBeans ...... 11 3.5 Unified Expression Language ...... 13 3.5.1 Bezprostˇrednívyhodnocování výraz ˚u...... 14 3.5.2 Odložené vyhodnocování výraz ˚u ...... 14 3.6 JSP Standard Tag Library ...... 14 3.6.1 knihovna znaˇcek Core ...... 15 3.6.2 knihovna znaˇcek XML ...... 16 3.6.3 knihovna znaˇcek Internationalization ...... 16 3.6.4 knihovna znaˇcek SQL ...... 16 3.6.5 knihovna znaˇcek Functions ...... 16 4 Webové aplikace ...... 17 4.1 Vlastnosti webové aplikace ...... 17 4.2 Architektura aplikace ...... 18 4.2.1 Model 1 ...... 18 4.2.2 Model 2 ...... 18 4.3 Internacionalizace ...... 20 4.4 Webové rámce ...... 20

v 4.4.1 Rámce orientované na zpracování HTTP požadavku ...... 21 4.4.2 Rámce orientované na vizuální komponenty ...... 21 5 Ukázková webová aplikace ...... 22 5.1 Návrh Model-View-Controller aplikace ...... 22 5.1.1 Model ...... 22 5.1.2 Pohled (View) ...... 23 5.1.3 Rídícíˇ ˇcást(Controller) ...... 25 5.2 JSTL a filtrování požadavk ˚u ...... 25 5.2.1 Internacionalizace v JSP ...... 25 5.2.2 Internacionalizace v servletech ...... 27 5.2.3 Dynamické generování obsahu pomocí JSTL ...... 27 5.2.4 Filtrování požadavk ˚u ...... 28 5.3 Práce s databází ...... 29 5.3.1 Vytvoˇrenídatabáze ...... 30 5.3.2 Rozšíˇrenímodelu aplikace ...... 30 5.3.3 Rízeníˇ databázových požadavk ˚u...... 31 5.4 Uživatelské znaˇcky ...... 32 5.4.1 Rozšíˇrenímodelu aplikace ...... 34 6 Webová aplikace LogoArena.cz ...... 35 6.1 Úˇcela charakteristika projektu ...... 35 6.2 Fáze realizace projektu ...... 35 6.3 Architektura aplikace ...... 36 6.3.1 Model ...... 36 6.3.2 Pohled (View) ...... 37 6.3.3 Rídícíˇ ˇcást(Controller) ...... 37 6.4 Propojení se SMS platebním systémem ...... 37 7 Závˇer ...... 39 Literatura ...... 41 Rejstˇrík ...... 42 A PˇriloženéCD - obsah a zprovoznˇeníaplikací ...... 43

vi Kapitola 1 Úvod

Cílem práce je seznámit ˇctenáˇres technologií JSP, demonstrovat nˇekterépostupy pˇritvorbˇe webové aplikace a ukázat jejich použití. Není možné v rozsahu bakaláˇrsképráce komplexnˇe popsat JSP technologii, tudíž je tato práce pojata tak, aby pˇredstavilavybrané nástroje do té míry, do jaké je tˇrebajim rozumˇet,aby byl s nimi ˇctenáˇrschopen vybudovat analogickou webovou aplikaci, jež tvoˇrípraktickou ˇcásttéto bakaláˇrsképráce. M ˚užemese setkat s ˇradousoftwarových nástroj ˚u(napˇr.JSF, Struts, a další. ), které vývoj aplikcí v Javˇeusnadˇnují.Nicménˇevývoj nových technologií jde vysokým tempem kupˇredua objevují se nové nástroje pˇrekonávajícíty minulé. Proto není cílem této práce urˇcittu pravou a „nejlepší“ cestu jak tvoˇritwebové aplikace v Javˇe,nýbrž popsat základní principy návrhu aplikace, jejichž znalost lze s úspˇechemvyužít i pro pochopení a používání nadstavbových technologií. Praktickou ˇcásttéto bakaláˇrsképráce tvoˇríwebová aplikace, která bude v praxi použí- vána jako internetový obchod se software pro mobilní telefony. Aplikace respektuje návr- hový vzor Model-Pohled-Rídícíˇ ˇcást(ˇcastose lze setkat s anglickým ekvivalentem Model- View-Controller). Skládá se z nˇekolikaˇrídícíchservlet ˚u,JSP stránek zajišt’ujících prezentaci dat a sloužících jako rozhraní mezi aplikací a uživatelem. Pro práci s daty je využita data- báze MySQL. Webová aplikace bude umístˇenana server dostupný pod URL http://logoarena.cz. Ob- sah, který má být pˇredmˇetemobchodování, podléhá autorským práv ˚umr ˚uznýchprávních subjekt ˚u.Internetový obchod m ˚užetedy být v plné míˇrespuštˇenaž po vyˇrešenítˇechtopráv- ních záležitostí. Samotné doruˇcenísoftwaru na mobilní telefon zajistí firma zabývající se touto problematikou, tedy takzvanými mikroplatbami, kdy platba je zahrnuta v cenˇetex- tové zprávy, jíž je požadovaný objekt objednáván. Poslední krok pro zkompletování celé aplikace je provázání již funkˇcníhoinformaˇcníhosystému a této mikroplatební služby. Tato fáze nespadá do rozsahu zadání bakaláˇrsképráce. Nˇekteréz mikroplatebních spoleˇcností však (za urˇcitýpˇríplatek)nabízí vlastní zajištˇenítohoto propojení. Více informací o této pro- blematice nabízí kapitola 6.4.

1 Kapitola 2 JavaServlets

JavaServlets jsou platformovˇenezávislé moduly pro obsluhu protokolu HTTP na stranˇeser- veru. Z technického hlediska je servletem každá java tˇrída,která implementuje rozhraní javax.servlet.Servlet. Servlety tvoˇrízákladní stavební jednotky, na kterých jsou vy- stavˇenydalší vrstvy webových java aplikací. Jedná se o nízkoúrovˇnovýnástroj, s jehož pomocí lze obsloužit jakýkoliv HTTP požadavek a vygenerovat libovolnou odpovˇed’. Pro pˇrímégenerování HTML stránek ,tedy zajištˇeníprezentaˇcnívrstvy aplikace, se však jedná o nástroj dosti tˇežkopádný.Proto jsou k dispozici nadstavby, pˇredevšímJSP. Servlety však své uplatnˇenínachází ve webových aplikacích v roli ˇrídícíhoˇclenu.

2.1 Životní cyklus servletu

Životní cyklus servletu se dá popsat následujícími tezemi.

1. Web kontejner nahraje tˇrídusevletu. Web kontejnerem je mínˇenwebový server, který podporuje vykonávání servlet ˚u(napˇr.Tomcat, JBoss, GlassFish aj.).

2. Kontejner volá metodu init() . Tato metoda inicializuje servlet a je volána dˇríve, než m ˚užebýt obsloužen jakýkoliv pˇríchozípožadavek. V životním cyklu servletu je metoda init() volána pouze jednou.

3. Po inicializaci m ˚užeservlet obsluhovat klientské požadavky. Každý požadavek je obsluhován v oddˇelenémvláknˇe.Pro každý požadavek volá kontejner metodu service() .

4. Pokud kontejner potˇrebujeodstranit servlet, zavolá metodu destroy() . Tato me- toda je stejnˇejako init() volána bˇehemživotního cyklu servletu pouze jednou.

2.2 Sdílení informací

Webové komponenty, jakož i vˇetšinaobjekt ˚u,obvykle pˇriplnˇenísvých funkcí navzájem spo- lupracují. Pod výrazem „webová komponenta“ ˇci„webovýprostˇredek“je, v tomto pˇrípadˇe, myšlen bud’ servlet, soubor nebo JSP soubor. Spolupracující webové komponenty sdílí informace prostˇrednictvímobjekt ˚u,které mohou nabývat jednoho ze ˇctyˇrrozsah ˚uplatnosti.

2 2.2. SDÍLENÍ INFORMACÍ

Pro rozsah platnosti se obvykle používá anglický výraz scope. Doménu tˇechtohodnot po- pisuje tabulka 2.1.

Scope Tˇrída Dostupnost objektu z application javax.servlet.ServletContext webové kompo- nenty uvnitˇraplikace session javax.servlet.http.HttpSession webové komponenty, které obsluhují požadavek patˇrícísezení (session) request javax.servlet.ServletRequest webové komponenty obsluhující požadavek page javax.servlet.jsp.PageContext JSP stránky, která objekt vytvoˇrí

Tabulka 2.1: Rozsah platnosti objekt ˚u

Pro sdílení informací lze využít v podstatˇejen první tˇriobjekty z tabulky 2.1. Application session a request. Data uložená v application mají platnost po celou dobu bˇehuwebové aplikace. Data v session jsou držena po dobu trvání sezení daného uživatele a request je zachovává jen po dobu svého trvání. Promˇennás rozsahem platnosti page je jednoduše implementována jako lokální promˇennáv servletu a na rozdíl od ostatních tˇríobjekt ˚unení pˇrímovyužitelná pro sdílení dat mezi jednotlivými webovými prostˇredky. Pro nastavování hodnot promˇennýchse využívá metoda setAttribute. Komplemen- tární metodou pro získání hodnoty promˇennéz objektu je getAttribute. Tyto metody jsou volány vždy na jednom z uvedených objekt ˚uz tabulky 2.1 v závislosti na požadova- ném rozsahu platnosti promˇenné.

2.2.1 Rozsah platnosti application Objekt s rozsahem platnosti application lze použít u promˇenné,která má mít stejnou hod- notu pro všechny uživatele dané webové stránky. Napˇr.on-line monitor návštˇevník˚u.Kon- text, ve kterém webové komponenty vykonávají svou ˇcinnost,je technicky vzato, objekt, který implementuje rozhraní ServletContext. Pˇrístupk webovému kontextu (application scope) zajišt’uje metoda getServletContext. Ukázka ˇcástikódu servletu popisuje situaci, kdy je z požadavku (request) získáno sezení (session) a z nˇej application. Metoda setAttribute pˇredápromˇennou onLineMonitor k dispozici pod názvem online jiné webové komponentˇe.Pˇredáníˇrízeníwebové kompo- nentˇevrozsahu aplikace zajišt’uje metoda forward objektu RequestDispatcher. Více informací o pˇredáváníˇrízenínabízí kapitola 2.3.2. HttpSession session = request.getSession(true); session.getServletContext().setAttribute("online", onLineMonitor); session.getServletContext() .getRequestDispatcher("/index.jsp").forward(request, response);

3 2.3. VOLÁNÍ DALŠÍCH WEBOVÝCH PROSTREDKˇ U˚

2.2.2 Rozsah platnosti session Mnoho aplikací vyžaduje vzájemné propojení skupiny požadavk ˚uod jednoho klienta. Jeli- kož http protokol patˇrído skupiny bezstavových, musí tento stav, nazývaný sezení (session), udržovat webová aplikace. Sezení jsou reprezentována objektem HttpSession. Pˇrístupk session vede pˇresob- jekt tˇrídy HttpRequest, voláním jeho metody getSession. Tato metoda vrací souˇcas- nou session asociovanou s požadavkem. Pokud požadavek nemá žádnou session, vytvoˇrí se nová. V následujícím výpisu kódu servletu je objekt userName pˇriˇrazendo stejnojmenné pro- mˇenné,která bude pˇrístupnápo dobu trvání sezení daného uživatele. Poslední pˇríkaz pˇredá ˇrízenístránce index.jsp vˇcetnˇeobjekt ˚urequest, response a userName HttpSession session = request.getSession(); session.setAttribute("userName", userName); session.getServletContext() .getRequestDispatcher("/index.jsp").forward(request, response);

2.2.3 Rozsah platnosti request Data uložená s rozsahem platnosti request jsou dostupná po dobu existence požadavku. Ukázka ˇcástiservletu pˇredáˇrízenístránce index.jsp s atributem image a objekty request a response. request.setAttribute("image", imageURL); request.getRequestDispatcher("/index.jsp").forward(request, response);

2.3 Volání dalších webových prostˇredk˚u

Webová komponenta m ˚užepˇrímovyvolat další webový prostˇredekbˇehemsvého vykoná- vání dvˇemazp ˚usoby:Obsah jiného prostˇredkum ˚užedo sebe vložit (include) nebo m ˚uže pˇredat(forward) požadavek jinému prostˇredku. Aby bylo možné volat jiný prostˇredek,je nutné nejprve obdržet objekt RequestDispatcher voláním metody getRequestDispatcher("URL"). Argument URL ukazuje na daný webový prostˇredek.

2.3.1 Vkládání webových prostˇredk˚u Mnohdy je užiteˇcnévložit do tˇelawebové stránky další webový prostˇredek,napˇr.reklamní banner, informaci o autorských právech apod. Toho lze dosáhnout voláním metody include patˇrícíobjektu RequestDispatcher. RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/banner"); if (dispatcher != null) dispatcher.include(request, response); Vložená komponenta má pˇrístupk objekt ˚um request a response.

4 2.4. FILTROVÁNÍ POŽADAVKUAODPOV˚ ED͡

2.3.2 Pˇredáníˇrízenídalšímu webovému prostˇredku K pˇredáníˇrízeníjiné webové komponentˇeje tˇrebavolat metodu forward patˇrícíobjektu RequestDispatcher. Tato technika se používá typicky pro pˇresmˇerování na JSP stránku, které se pˇredajíi atributy request a response. Webová aplikace m ˚užetedy pracovat tak, že uživatel prostˇrednictvímwebové stránky pošle požadavek servletu, ten jej obslouží a vý- sledek pˇredádalší webové stránce. S využitím znalostí o sdílení informací mezi webovými prostˇredkylze vytvoˇritpraktickou konstrukci komunikace servletu s dalším webovým pro- stˇredkem.Ukázková ˇcástkódu servletu zjistí aktuální datum a pˇredáˇrízeníJSP stránce, na které se pak tato informace m ˚užeuplatnit. Pozn.: Pˇredanýatribut actualDate bude mít rozsah platnosti jen v rámci daného po- žadavku konkrétního uživatele. request.setAttribute("actualDate", new Date()); RequestDispatcher dispatcher = request.getRequestDispatcher("/info.jsp"); if (dispatcher != null) dispatcher.forward(request, response);

2.4 Filtrování požadavk ˚ua odpovˇedí

Filtr je objekt, který m ˚užetransformovat jak hlaviˇcku,tak obsah požadavku (request) ˇciod- povˇedi(response). Filtry se od webových komponent liší tím, že samy obvykle nevytváˇrí odpovˇed’ (response). Na druhou stranu, filtr poskytuje funkcionalitu, která m ˚užebýt pˇri- pojena k jakémukoliv webovému prostˇredku.Z tohoto d ˚uvoduby filtr nemˇelmít žádnou závislost na webovém prostˇredku,pro který plní funkci filtru, aby si zachoval vlastnost slu- ˇcitelnostis jinými druhy webových prostˇredk˚u.Mezi hlavní úkoly filtru patˇrí:

• pˇredzpracovatpožadavek

• blokovat zpracování požadavku a odpovˇedi

• modifikovat data hlaviˇckypožadavku

• modifikovat data hlaviˇckyodpovˇedi

• komunikovat s vnˇejšímizdroji

Mezi typická využití filtr ˚upatˇrínapˇr.autentizace, logování, konverze obrázk ˚u,komprese dat, šifrování ˇciXML transformace.

5 Kapitola 3 Java Server Pages

JSP stránka je textový dokument obsahující dva typy textu: statická data, jež mohou být vyjádˇrenajakýmkoliv textovým formátem (jako napˇr.HTML, SVG, WML a XML) a JSP elementy tvoˇrícídynamický obsah. Životní cyklus JSP má dvˇed ˚uležitéfáze.

1. pˇreklad

2. zpracování požadavku

V první fázi je JSP stránka pˇreloženana servlet a zkompilována. Ve druhé fázi již obsluhuje požadavky jakožto servlet stejnˇejako popisuje kapitola 2.1.

3.1 Struktura JSP stránky

Z element ˚una JSP stránce není žádný sám o sobˇepovinný. Obvykle má JSP stránka stejnou strukturu jako HTML stránka, obohacená o JSP elementy. JSP elementy použitelné na stránce shrnuje tabulka 3.1

JSP Syntaxe Popis element komentáˇre <%– – ... – –%> Komentáˇrje pˇripˇrekladuna servlet ignorován. deklarace <%! ... %> Kód je vložen do tˇelatˇrídyser- vletu mimo metodu service. direktivy <%@ taglib .. %> Zpˇrístupˇnujevnˇejšíknihovny znaˇcek. <%@ page .. %> Definuje globální nastavení JSP stránky. <%@ include .. %> Urˇcujesoubor vkládaný do JSP stránky. výrazy <%= ... %> Výraz je vyhodnocen a vložen na výstup. skriptlety <% ... %> Uvedený kód je vložen do metody service. akce R ˚uznýmzp ˚usobemovlivˇnujíchování výsledného servletu. Viz kapitola 3.4.

Tabulka 3.1: JSP elementy

6 3.2. SKRIPTOVACÍ ELEMENTY

3.2 Skriptovací elementy

Skriptovací elementy umožˇnujípoužívat pˇríkazyprogramovacího jazyka uvnitˇrJSP stránky. K jejich typickým užitím patˇrívytváˇreníobjekt ˚u,metod a pˇrístupk nim. Vˇetšinapˇrípad˚u vyžadujících použití skriptovacích element ˚um ˚užebýt eliminována použitím uživatelských znaˇcekˇci JSP standard tag library. Jedním z cíl ˚uJSP je oddˇelitstatická data od kódu potˇreb- ného pro generování dynamického obsahu. Proto je vysoce nedoporuˇcovanétyto elementy používat. Implicitní skriptovací jazyk v JSP je java, nicménˇelze používat i jiné programovací ja- zyky. Staˇcínastavit atribut language v direktivˇe page na zaˇcátkuJSP stránky.

<%@ page language="scripting-language" %>

3.2.1 Deklarace

JSP deklarace slouží k deklarování promˇennýcha metod. V pˇrípadˇepoužití skriptovacího jazyka java, se deklarace v JSP stanou deklaracemi v servletu, na nˇejžse JSP stránka pˇre- kládá. Obecný tvar deklarace vypadá následovnˇe:

<%! deklarace %>

3.2.2 Výrazy

JSP výrazy pracují tak, že výraz ve skriptovacím jazyce je konvertován na string a vložen do datového toku vraceného klientovi. Používá-li se jako skriptovací jazyk java, potom výraz ve tvaru stringu je vložen do implicitního objektu out. Syntax JSP výrazu:

<%= výraz %>

3.2.3 Scriptlety

Scriptlet m ˚užeobsahovat libovolný platný fragment kódu. Pˇriužití javy jako skriptovacího jazyka se pˇríkazyobsažené ve scriptletu vloží do metody service pˇríslušícíservletu, na nˇejžje JSP stránka pˇreložena. Scriptlet má obecný tvar:

<% kód ve skriptovacím jazyku %>

3.3 Direktivy JSP

JSP direktivy definují globální nastavení stránky. K dispozici jsou 3 direktivy: page, include a taglib.

7 3.3. DIREKTIVY JSP

3.3.1 Direktiva page Tato direktiva definuje nastavení stránky. M ˚užeobsahovat atributy, které uvádí tabulka 3.2:

Atribut Popis language Specifikuje jazyk, v jakém je JSP napsána. Výchozí hodnota je java a vˇetšinaser- vlet kontejner ˚uani jiné jazyky neumí. extends Má stejnou funkci jako u tˇríd,nastavuje pˇredka. import Opˇetstejná funkce jako u tˇríd,dovo- luje používat tˇrídyi bez názvu balíku. session Definuje, jestli bude mít JSP pˇrístupk ob- jektu session. Výchozí hodnota je true. buffer Definuje, jestli má JSP používat buffer. Velikost urˇcujeˇcíselnáhodnota, která znaˇcívelikost v kilobytech. Pokud není žádoucí používat buffer, je tˇrebazvolit hodnotu none. Výchozí hodnota je 8 kB. autoFlush Definuje, jestli se bude buffer odesílat sám (true) nebo jestli se bude provádˇetflush (false) podle urˇceníprogramátora. Výchozí hodnota je true. isThreadSafe Definuje, jestli m ˚užebýt stránka spuštˇenavíce klienty najednou (true) nebo jestli mají stát ve frontˇe(false). Výchozí hodnota je true. info Obdoba metody getServletInfo. errorPage Specifikuje URL, na které bude stránka pˇre- smˇerována, pokud neodchytnete výjimku. isErrorPage Definuje, jestli je tato stránka cílem z de- finice errorPage. Pokud je true, pak má stránka další implicitní objekt ex- ception, což je neodchycená výjimka. contentType Definuje typ odpovˇedi(text/html) a její kódo- vání. Je ve tvaru contentType="text/html; charset=UTF-8".

Tabulka 3.2: Atributy direktivy page

3.3.2 Direktiva include Tato direktiva je výjimeˇcnátím, že se m ˚užeobjevovat kdekoli v souboru JSP. Atribut file definuje soubor, který se „includuje“ ještˇepˇredtím,než se pˇreložístránka. Direktiva include

8 3.3. DIREKTIVY JSP je analogická s metodou include používanou v servletu, jak popisuje kapitola 2.3.1. Obecné použití této direktivy vypadá následovnˇe:

<%@ include file="relative url" %>

Jelikož direktiva include vkládá soubor do stránky pˇredjejím pˇreložením,tak v pˇrí- padˇezmˇenyvloženého souboru, je tˇrebaznovu pˇreložitvšechny JSP stránky, které na tento soubor odkazují. Proto je efektivní tuto direktivu použít v pˇrípadˇe,kdy se vkládaný soubor ˇcastonemˇení.Pokud se vkládaný soubor mˇeníˇcastˇeji,tak že není výhodné vždy pˇrekládat všechny odkazující JSP stránky, nabízí se alternativa použití akce:

Tato akce vkládá soubor do JSP až v momentˇe,kdy je požadována.

3.3.3 Direktiva taglib Direktiva taglib umožˇnujepoužívat další znaˇcky(tagy), než jen ty, které nabízí HTML ˇcizákladní sada JSP akcí. Tyto znaˇcky se obvykle oznaˇcujívýrazem „uživatelské“ (custom tags). Jedná se o silný nástroj, pomocí nˇehožlze elegantnˇetvoˇritdynamicky generovaný obsah webových sránek.

3.3.3.1 Uživatelské znaˇcky Pomocí této technologie lze vytvoˇritvlastní znaˇcky, které mohou vykonávat stejnou práci jako scriptlety. Tag ale staˇcínadefinovat jen jednou, a pak už se dá i opakovanˇepoužívat. Tyto znaˇckym ˚užepoužívat i nˇekdo,kdo nemá ani ponˇetí,co je to java (autor html, grafik, ...). Oproti scriptlet ˚umnemíchají uživatelské znaˇckyHTML s útržky Java kódu dohromady, ˇcímžse lze vyhnout vysoce nepˇrehlednémua tˇežkoudržovatelnému zdrojovému textu. V mnoha pˇrípadechnení tˇrebavytváˇretvlastní znaˇcky, ale porozhlédnout se na inter- netu, zdali již potˇrebnoufunkcionalitu nˇekdodˇrívedo uživatelské znaˇckynezapouzdˇril. Tímto zp ˚usobemjsou dostupné spousty hotových znaˇceks velmi širokou škálou funkcí. Na druhou stranu nutno dodat, že není vhodné webovou aplikaci vystavˇetzp ˚usobem, kdy ˇradaJSP stránek bude protkána uživatelskými znaˇckami,zajišt’ujícími aplikaˇcnílogiku. Existují lépe udržovatelnˇejšía pˇrehlednˇejšínávrhy webových aplikací. Více v kapitole 4. JSP uživatelské znaˇckyjsou v podstatˇeobyˇcejnéjavovské tˇrídy, které mají za pˇredka tˇrídu javax.servlet.jsp.tagext.TagSupport nebo javax.servlet.jsp.tagext .BodyTagSupport. První z nich nemají tˇelo,tzn. že znaˇckavypadá obecnˇetakto:

Ve druhém pˇrípadˇetˇelomají: ... teloˇ ...

9 3.3. DIREKTIVY JSP

Pro vytvoˇrenívlastní znaˇckyje nezbytné udˇelat3 vˇeci:

1. Napsat javovskou tˇríduprovádˇejícípožadovanou funkci znaˇcky. Napˇr:

javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; public SimpleExampleTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello."); } catch (Exception ex) { throw new JspTagException("SimpleExampleTag: " + ex.getMessage()); }return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } }

2. Napsat tag library descriptor, který popisuje znaˇcky, jejich parametry a vztahy mezi nimy. Je v XML formátu a má koncovku tld.

1.0 1.1 tag simpleExample myPackage.SimpleExampleTag

3. Informace o tag library descriptoru vložit do souboru web., konkrétnˇedo ele- mentu web-app

tag /WEB-INF/simpleExamplTag.tld

Použití takto definované uživatelské znaˇckyvypadá v JSP stránce následovnˇe:

10 3.4. AKCE

<%@page contentType="text/html"%> <%@taglib uri="simpleExamplTag.tld" prefix="myTag"%> JSP Page

3.4 Akce

JSP akce využívají konstrukcí jazyka XML. Umožˇnujídynamicky vložit do stránky jiný sou- bor, používat JavaBeans komponenty, pˇresmˇerovat uživatele na jinou stránku ˇcigenerovat HTML pro java pluginy. Obecný tvar použití akce vypadá:

JSP technologie nabízí k použití akce uvedené v tabulce 3.3

3.4.1 JavaBeans

JavaBeans jsou java tˇrídy, které mají konkrétnˇedefinovanou strukturu. Za JavaBean kompo- nentu se m ˚užeprohlásit každá tˇrída,která:

• Obsahuje konstruktor bez parametr ˚u.

• Implementuje rozhraní java.io.Serializable .

• Má své ˇclensképromˇennéprivate a dovoluje k nim pˇristupovatpomocí get/set me- tod.

JavaBeans komponenty jsou zajímavé tím, že jdou jednoduše pˇripojitna JSP stránku pomocí akce useBean. Tato akce deklaruje, že stránka bude používat bean, jež je uložena ve specifikovaném scope (application, session, request nebo page).Pokud uvedená JavaBean ještˇeneexistuje, vytvoˇríse nová a uloží se jako atribut scope objektu. JavaBeans lze používat ve více JSP najednou. Její kód staˇcínapsat pouze jednou, a ten pak dle potˇrebyvyužívat. Mimo to, oproti servlet ˚umjdou podstatnˇelépe debugovat. Ke každému atributu tˇrídybeanu lze pˇristupovatpˇresget/set metody. Pˇripoužití v JSP stránce plní tuto práci akˇcníznaˇcky getProperty/ setProperty. Jiný zp ˚usob,jak zís- kat z JavaBean komponenty její vlastnost, je použít místo znaˇcky getProperty výraz Ex- pression Language. Není pak potˇrebadeklarovat na stránce použití beanu pomocí znaˇcky useBean. Proto je tento zp ˚usobzískávání vlastností z JavaBeans preferovaný. Pˇrístupk vlast- nosti JavaBeanu vypadá takto:

${packages.className.property}

11 3.4. AKCE

Akce Popis jsp:attribute Dovoluje definovat hodotu znaˇckyat- tribute v tˇeleXML elementu namísto je- jího definování v atributu XML znaˇcky. jsp:body Specifikuje tˇeloznaˇcky. jsp:element Dynamicky generuje XML element. jsp:expression Obsahuje výraz, který je platný v po- užitém skriptovacím jazyku pro da- nou JSP stránku. Obdoba <%= výraz >. jsp:fallback Textová zpráva, která se má zobrazit uži- vateli pˇrineúspˇešnémzobrazení pluginu. jsp:forward Pˇredáˇrízeníurˇcenémuwebovému prostˇredku. jsp:include Vloží do stránky statický soubor nebo výsledek jiné webové komponenty. jsp:useBean Instanciuje bean s urˇcenýmrozsahem platnosti. jsp:getProperty Vloží hodnotu vlastnosti da- ného beanu do výsledku. jsp:setProperty Nastaví hodnotu vlastnosti ˇcihod- noty vlastností pˇríslušnéhobeanu. jsp:param Parametr a hodnota, která má být pˇredánaappletu nebo beanu. jsp:params Parametry a hodnoty, které mají být pˇredányappletu nebo beanu. jsp:plugin Vyvolá spuštˇeníappletu nebo beanu. Po- kud není plugin dostupný, vyvolá di- alog pro stažení potˇrebnéhosoftware. jsp:text Používá se pro šablonová data.

Tabulka 3.3: JSP akce

Následující pˇríkladpopisuje realizaci poˇcítadlapˇrístup˚una stránku pomocí JavaBean komponenty. package example; public class CounterBean { private long counter = 0; public CounterBean() { } public long getCounter() { return counter; } public void setCounter(long counter) { this.counter = counter; }

12 3.5. UNIFIED EXPRESSION LANGUAGE

public long increment() { return ++counter; } }

Použití JavaBeanu v JSP stránce znázorˇnujeukázka následujícího kódu.

<%@ page contentType="text/html; charset=iso-8859-1" %> JavaBean Test

JSP with JavaBean

Number of visits of this page:

Za povšimnutí stojí, že JavaBean komponenta je uložena v rozsahu platnosti application, tudíž je spoleˇcnápro všechny návštˇevníkystránky.

3.5 Unified Expression Language

Novinkou v JSP 2.1 je Unified Expression Language. Tento reprezentuje spojení Expression Language známý z JSP 2.0 a Expression Language vytvoˇrenýpro technologii Java Server Faces. Expression Language pˇredstavenýv JSP 2.0 dovoluje používání jednoduchých výraz ˚u k dynamickému ˇctenídat z JavaBeans komponent. Expression Language používaný v Java Server Faces nabízí odkládání evaluace výraz ˚u, data nejen ˇcíst,ale i mˇenit,a možnost volat metody. Unifikovaný Expression Language tedy nabízí:

• Dynamicky ˇcístdata uložená v JavaBeans komponentách, r ˚uznýchdatových struk- turách a implicitních objektech.

• Dynamicky zapisovat data (napˇr.vstupní data ve formuláˇrích,do JavaBeans kom- ponent).

• Volat static a public metody.

• Dynamicky vykonávat aritmetické operace.

13 3.6. JSP STANDARD TAG LIBRARY

• Okamžité vyhodnocení výrazu pˇripˇrekladuJSP stránky nebo odložené vyhodno- cení výrazu pozdˇejipˇripožadavku na výraz.

Pro pˇrístupke konkrétním promˇennýmvyužívají výrazy teˇckovounotaci. Napˇr.

${user.name}

Syntaxe použití Unified Expression Language závisí na tom, zda požadujeme evaluaci vý- razu „bezprostˇrední“,tedy pˇripˇrekladuJSP stránky na servlet, nebo „odloženou“.

3.5.1 Bezprostˇrednívyhodnocování výraz ˚u

Bezprostˇrednˇevyhodnocované výrazy používají syntaxi :

${ výraz }

Tento výraz m ˚užebýt používán jako hodnota atributu znaˇckypoužité v JSP.Vyhodnocované hodnoty jsou pouze pro ˇctení.Pˇríkladpoužití v obecné znaˇcce:

3.5.2 Odložené vyhodnocování výraz ˚u

Syntaxe výraz ˚u,jejichž vyhodnocení neprobíhá již v pˇrekladuJSP stránky, vypadá násle- dovnˇe:

#{ výraz }

Takto zapsaný výraz m ˚užebýt vyhodnocen až v dalších fázích životního cyklu stránky v zá- vislosti na použité technologii.

3.6 JSP Standard Tag Library

JSP Standard Tag Library (JSTL) je standardizovaná knihovna znaˇcek,která zapouzdˇruje bˇežnéfunkce využívané v JSP aplikacích. Tato standardizace umožˇnujeumístˇeníaplikace využívající JSTL na jakýkoliv JSP kontejner podporující JSTL. U takovéto aplikace je vyšší pravdˇepodobnost,že použité znaˇckyjsou implementovány optimálnˇe.Lépe než znaˇckyse stejnou funkcionalitou od jiného dodavatele. JSTL nabízí pˇetknihoven znaˇcekzamˇeˇrujícíchse na r ˚uznéoblasti užití. Tabulka 3.4 shr- nuje jednotlivé knihovny. PˇrestožeJSTL nabízí knihovnu znaˇcekpro práci s databází pomocí jazyka SQL, nedopo- ruˇcujese používat. Argumentem podkládajícím toto tvrzení je fakt, že aplikace pˇristupující k databázi z JSP stránky pˇresznaˇckyporušuje návrh aplikace Model-View-Controller. Možnosti JSP Standard Tag Library lze plnˇevyužít pˇrispolupráci s Expression Language.

14 3.6. JSP STANDARD TAG LIBRARY

Název URI Popis Core http://java.sun.com/jsp/jstl/core práce s promˇen- nými, vˇetvení,cykly, URL management XML http://java.sun.com/jsp/jstl/xml zabývá se XML a XSLT transformacemi Internationalization http://java.sun.com/jsp/jstl/fmt internacionalizace SQL http://java.sun.com/jsp/jstl/sql funkce SQL Functions http://java.sun.com/jsp/jstl/functions práce s ˇretˇezci a kolekcemi

Tabulka 3.4: JSP Standard Tag Library

3.6.1 knihovna znaˇcek Core

Inicializace knihovny Core vypadá následovnˇe: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

K práci s promˇennýmislouží znaˇcky set a remove. První z nich nastavuje hodnotu promˇennéEL nebo vlastnost promˇennéEL v jednom z rozsahu platnosti (page, request, session nebo application). Pokud promˇennáještˇeneexistuje, je vytvoˇrena.Napˇr.

Pro odstranˇenípromˇennéEL lze využít znaˇcku remove.

Pro vˇetveníprogramu slouží znaˇcky choose a if. Cykly obstarávají forEach a forToken. Názorné použití ukazuje níže uvedený pˇríklad:

more than 5

Bezpeˇcnýzp ˚usob,jak vypsat hodnotu promˇenné,je pˇristoupitna implicitní objekt JSP stránky out pomocí standardní znaˇcky.

15 3.6. JSP STANDARD TAG LIBRARY

3.6.2 knihovna znaˇcek XML Knihovna XML nabízí tˇrisady znaˇcek.XML Core, XML Flow Control a XML Transfor- mation. JSTL XML znaˇckypoužívají pro pˇrístupk obsahu XML dokumentu výrazy jazyka XPath. Rovnˇežnabízí XSLT transformace. Naˇcteníznaˇcekdo pamˇetizajistí volání direktivy taglib. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>

3.6.3 knihovna znaˇcek Internationalization Tato knihovna nabízí pˇrizp˚usobenístránky lokálnímu nastavení poˇcítaˇce.Vytváˇrenízpráv zavislých na tomto nastavení, formátování a analyzování datových element ˚u,ke kterým patˇríˇcísla,mˇena,data, ˇcasapod. Základem internacionalizace je lokalizaˇcníkontext obsahující promˇenné locale a resource bundle. Nastavení locale specifikovaného klientem lze pˇrepsatpomocí znaˇcky setLocale. Pomocí znaˇcek setBundle a bundle se nastavuje resource bundle, což je místo s ulože- nými texty v daném konkrétním jazyce. Pro výstup lokalizovaného ˇretˇezcena obrazovku prohlížeˇceslouží znaˇcka message. Následující pˇríkladukazuje, jakým zp ˚usobemzobrazit datum a ˇcasv podobˇeodpovída- jící lokálnímu nastavení prostˇredí. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> ...

3.6.4 knihovna znaˇcek SQL Používání knihovny znaˇcekSQL porušuje návrhový vzor aplikace Model-View-Controller, tudíž není doporuˇceníhodnéji používat. Databázové operace jsou normálnˇezapouzdˇreny v JavaBeans komponentách.

3.6.5 knihovna znaˇcek Functions Tato knihovna disponuje znaˇckou length, která vrací délku libovolné kolekce podporo- vané znaˇckou c:forEach. Aplikovaná na String vrací poˇcetznak ˚uˇretˇezce.Dalších patnáct znaˇceknabízí nejr ˚uznˇejšímanipulace s daty právˇetypu String. Inicializace knihovny Functi- ons vypadá takto: <%@ taglib uri="http://java.sun.com/jsp/jstl/function" prefix="fn" %>

16 Kapitola 4 Webové aplikace

Webová aplikace je aplikace, která využívá webový prohlížeˇcjako rozhraní pro komunikaci s uživatelem. Využívá schopnost prohlížeˇcezobrazovat HTML obsah. Takováto aplikace disponuje zásadní výhodou, že uživatel ji nemusí instalovat a v pˇrípadˇejejího umístˇenína internetu ji má dostupnou z libovolného poˇcítaˇce( s pˇripojenímna internet a instalovaným webovým prohlížeˇcem). Díky podpoˇreCSS, JavaScriptu, XMLHttpRequestu, DOM ˇcimož- nosti plug-in ˚usouˇcasnýchwebových prohlížeˇc˚ulze budovat tzv. rich internet application (RIA). RIA se vyznaˇcujetím, že dokáže poskytnout podobné možnosti, jako tradiˇcnídeskto- pová aplikace. Obvykle pˇrenášíprocesní data pro uživatelské rozhraní k webovému klien- tovi, ale urˇcitouˇcást dat ponechává na aplikaˇcnímserveru. Stupnici mezi prostou webovou aplikací a RIA vyplˇnujíaplikace s r ˚uznýmistupni komplexnosti a množstvím použitých technologií.

4.1 Vlastnosti webové aplikace

Požadavky na vlastnosti webové aplikace se liší podle toho, jakému úˇcelumá aplikace slou- žit. Obecnˇelze tyto požadavky shrnout v následujících bodech: • Výkonnost: Napˇríkladvystavení urˇcitéhopoˇctustránek za ˇcasovoujednotku ve ve- ˇrejnéˇcástiaplikace.

• Robustnost: Provozuschopnost aplikace i pˇriselhání nˇekterýchslužeb.

• Škálovatelnost: Možnost distribuovat služby, zvýšit výkon aplikace v pˇrípadˇepo- tˇreby.

• Udržovatelnost a rozšiˇritelnost:Možnost nadále rozšiˇrovataplikaci o další funkcio- nality a udržovat ji.

• Bezpeˇcnost:Dostateˇcnábezpeˇcnostaplikace vzhledem k úˇcelu,ke kterému slouží.

• Uživatelská pˇrívˇetivost:Spoˇcíváobvykle v dobrém návrhu GUI. Podle úˇceluaplikace je tˇrebase zamˇeˇritna odpovídající body. Neznamená to ovšem, že každá webová aplikace by mˇelav maximální míˇrevšechny výše uvedené body splˇnovat. V praxi se vždy jedná o kompromis mezi náklady na její realizaci a požadovanou funkcio- nalitou.

17 4.2. ARCHITEKTURA APLIKACE

4.2 Architektura aplikace

Architektura znamená podle [9] a [7] všeobecné oznaˇceníurˇcujícícelkovou strukturu a zá- kladní konstrukci ˇcástínebo kompletního poˇcítaˇcovéhosystému. V pˇrípadˇearchitektury webové aplikace se dá mluvit o zp ˚usoburozdˇeleníaplikace (jako jsou aplikaˇcnídata, pro- cesy, datové toky) do logických celk ˚u,stanovení vzájemných vztah ˚ua interakcí mezi nimi. To vše s rozumnou mírou obecnosti. K návrhu aplikace se vyplatí pˇristupovats rozmyslem a vˇenovatmu dostatek ˇcasu.Jedná se o prvotní fázi vzniku aplikace, jejíž pozdˇejšímodifikace stojí neúmˇernˇevelké množství prostˇredk˚u.At’ už ve formˇepracovní energie ˇcifinanˇcníchprostˇredk˚u. Pˇribudování JSP aplikací jsou nejznámˇejšídva zp ˚usoby, kterými lze k návrhu pˇristoupit. Obvykle jsou uvádˇenypod názvy Model 1 a Model 2.

4.2.1 Model 1 V architektuˇreModel 1 jsou samotné JSP stránky zodpovˇednéza obsluhování požadavk ˚u od klienta. Existuje zde oddˇeleníprezentaˇcnívrstvy od obsahu, nebot’ pˇrístupk dat ˚umza- jišt’ují JavaBeans. Rízeníˇ založené na této architektuˇreje decentralizované, nebot’ aktuální zobrazovaná JSP stránka urˇcuje,jaká ze stránek bude zobrazena následnˇe.Model 1 m ˚uže být vhodný pro jednoduché aplikace, nicménˇenedostateˇcnýpro vˇetšinuaplikací, jež chtˇejí dostát požadavk ˚umjako jsou napˇr.dobrá udržovatelnost ˇcirozšiˇritelnost.Schéma funkce nastiˇnujeobrázek 4.1

Obrázek 4.1: Model 1

4.2.2 Model 2 Architektura Model 2 , ˇcastonazývaný jako Model-View-Controller (MVC), spojuje výhody servlet ˚ua JSP stránek. Jedná se o návrh aplikace respektující oddˇeleníˇrídícílogiky, dato-

18 4.2. ARCHITEKTURA APLIKACE vého modelu a uživatelského rozhraní. Servlet se chová jako ˇrídícíˇcástodpovídající za ob- sluhu požadavk ˚ua vytváˇreníbean ˚uužívaných v JSP.V JSP samotné není žádná ˇrídícílogika. Úloha JSP stránek spoˇcívápouze v zobrazování informací z objekt ˚ua bean ˚uvytváˇrených servletem, ˇcijejich zakomponování do statického obsahu stránky. Model by mˇeltzv. odrážet obraz reálného svˇeta.Tvoˇríjej tedy tˇrídymodelující objekty používané v aplikaci, tak aby byly nezávislé na ostatních vrstvách aplikace. D ˚uvodyproˇcpoužít MVC lze shrnout do dvou hlavních bod ˚u:

• Znovupoužitelnost: pro opakující se problém není tˇrebavyvíjet nové ˇrešení,ale pˇri- zp ˚usobitpˇríslušnouˇcástaplikace novým potˇrebám.

• Pˇrehlednost:separování jednotlivých vrstev aplikace umožˇnujesnadnˇejšíorientaci v kódu a její udržovatelnost.

Obrázek 4.2: Model 2

Aplikaci, navrženou podle MVC, znázorˇnujeobrázek 4.2. Aplikace bˇežícína aplikaˇcním serveru tvoˇrítedy tˇriprincipiální ˇcásti:

• Model (Model) reprezentuje informace a data, se kterými aplikace pracuje, vˇcetnˇe aplikaˇcnílogiky pracující s tˇemito daty. V contextu J2EE aplikace se jedná o tˇrídy s aplikaˇcnílogikou, jako jsou napˇr.javaBeans apod.

• Pohled (View) tvoˇríuživatelské rozhraní, které zpˇrístupˇnujeinformace a data mo- delu. Tuto roli pˇrebírajíJSP stránky.

• Rídícíˇ ˇcást(Controller) pˇredstavujeˇrídícílogiku aplikace. Reaguje na vzniklé poža- davky (obvykle od uživatele) voláním pˇríslušnýchmetod modelu. Tuto úlohu pˇre- bírají servlety, nˇekdyse jedná o jediný ˇrídícíservlet.

19 4.3. INTERNACIONALIZACE

4.3 Internacionalizace

U mnohých webových aplikací by se mˇelopoˇcítat s tím, že jejich uživatelé jsou pˇríslušníky r ˚uznýchnárod ˚u,z ˇcehožvyplývá, že mluví r ˚uznýmijazyky, používají r ˚uznéabecedy, zapi- sují urˇcitéúdaje ve formátu odpovídajícímu jejich národním zvyklostem apod. Schopnost aplikace podporovat r ˚uznénárodní zvyklosti se nazývá internacionalizace. Výrazem lokalizace se pak rozumí podpora daného konkrétního národního prostˇredí. Všechny tyto tˇrídypoužívají tˇrídu Locale pro specifikaci jazyka ˇcinárodních zvyklostí. Pro tyto úˇcelynabízí java velmi kvalitní nástroje. Správné zobrazování ˇcasovýchúdaj ˚ua ˇcíselmá na starosti tˇrída DateFormat a NumberFormat. Tˇrída TimeZone se stará o to, aby byl ˇcaszobrazen správnˇe,v závislosti na ˇcasovézónˇe,ve které se uživatel nachází. Tˇrída ResourceBundle ˇrešínalézání a používání text ˚uve správném jazyce. Každá z tˇechtotˇríd se ˇrídítˇrídou Locale urˇcujícíaktuální jazyk ˇcinárodní zvyklosti. Základním principem u lokalizovatelné aplikace je, aby texty nebyly pˇrímov kódu, ale uloženy externˇev souborech typu .properties. Na nˇese pak odkazuje pomocí klíˇc˚u. Výsledný zobrazený text se dohledá v závislosti na hodnotˇeobjektu Locale. Tento pˇrístup lze realizovat používáním tˇrídy ResourceBundle. Aplikace LogoArena.cz je urˇcena výhradnˇepro ˇcesképrostˇredía proto nepodporuje lo- kalizaci do jiných jazyk ˚u.Nicménˇeukázková aplikace, která je souˇcástítéto práce, pod- poruje ˇceskýa anglický jazyk. Konkrétní návod, jak aplikaci internacionalizovat, podává kapitola 5.2. Podrobný popis veškerých funkcí souvisejících s internacionalizací lze najítv dokumentaci jazyka java [10].

4.4 Webové rámce

Úˇcelemwebových rámc ˚u( anglicky web frameworks ) je zjednodušit a zproduktivnit vý- voj aplikací. Pˇripsaní r ˚uznýchwebových aplikací vývojáˇrzjistí, že urˇcitéˇcástiaplikce jsou víceménˇestále stejné. Z tohoto faktu vychází smysl webových rámc ˚u.Vytvoˇriturˇcitoušab- lonu aplikace, která se pak nakonfiguruje k obrazu vývojáˇrovýchpˇredstav. Další výhodou webových rámc ˚uje, že využívají do znaˇcnémíry osvˇedˇcenépostupy, což je dobrým pˇred- pokladem k tomu, aby aplikace byla z hlediska architektury a rozvrstvení v poˇrádku. Mnoho webových rámc ˚unabízí knihovny poskytující pˇrístupk databázi, ˇrešíproblém autentifikace a autorizace, nabízí mapování URL na lidsky zapamatovatelné adresy, posy- tuje recyklovatelné šablony webových stránek a podobnˇe.Vˇetšinawebových rámc ˚uje zalo- žena na osvˇedˇcenémnávrhovém vzoru Model-Vew-Controller , viz kapitola 4.2.2. Obecnˇelze webové rámce rozdˇelitna dvˇeskupiny:

• rámce orientované na zpracování HTTP požadavku

• rámce orientované na vizuální komponenty

V následující ˇcástibudou zmínˇenyjen ty nejznámˇejšíwebové rámce. Pro javu jich totiž exis- tuje pomˇernˇevelké množství. Jejich seznam lze nalézt na webových stránkách [12].

20 4.4. WEBOVÉ RÁMCE

4.4.1 Rámce orientované na zpracování HTTP požadavku Mezi první skupinu patˇrízatím asi nejpoužívaˇnejšíframework Apache Struts [1] , který má i širokou podporu v mnoha vývojových prostˇredích.Dnes již je Struts pˇrekonán.K nevýho- dám tohoto frameworku patˇrízávislost na velkém množství konfiguraˇcníchsoubor ˚u. Spring MVC [4] je dalším velmi populárním webovým rámcem.K jeho charakteristice patˇrí,že je založen na Inversion of Control, tzn, že závislosti mezi tˇrídamise zabývá webový kontejner, nikoliv samotné tˇrídy. Umožˇnujerovnˇežkombinovat další frameworky. Stripes [5] je nový webový rámec, jehož tv ˚urci si vzali pouˇceníz negativních vlastností Struts i Spring. Jeho pˇrednostispoˇcívajív možnosti držet pohromadˇevšechen kód obsluhu- jící jednu stránku, a pˇritomnepotˇrebuježádné konfiguraˇcnísoubory, nebot’ využívá systém anotací zavedený v javˇe5.

4.4.2 Rámce orientované na vizuální komponenty Tapestry [6] je framework z dílny Apache. Zajímavostí je, že nevyužívá JSP, ale je sám nád- stavbou nad JavaServlet API. Disponuje vlastní soustavou šablon, úzce provázanou s ˇrídící ˇcástíaplikace. Java Server Faces [?] je webový rámec, jejž prosazuje tv ˚urce Javy, firma Sun. Významnou devizou je jeho pˇrímézaˇclenˇenído standardu J2EE 5. Tímto má zaruˇcenoukvalitní podporu v mnohých vývojových nástrojích. JSF je rovnˇežpostaven pˇrímona JavaServlet API. M ˚uže, ale nemusí, používat JSP.

21 Kapitola 5 Ukázková webová aplikace

V následujících podkapitolách bude vystavˇenawebová aplikace, která pˇredstavujejednodu- chý informaˇcnísystém. Aplikace bude vybudována pomocí JSP a JavaServlets technologií. K práci s daty se využije databáze MySQL. Úˇcelemtéto webové aplikace je demonstrovat na pˇrehledném pˇríkaldu, jak lze pˇres webové rozhraní pˇristoupitk databázi, inteligentnˇezobrazit naˇctenádata na obrazovku a jakým zp ˚usobemlze využívat promˇennénapˇríˇcJSP stránkami a servlety aplikace.

5.1 Návrh Model-View-Controller aplikace

První verze aplikace nabízí sice jen obdobu obligátního "Ahoj svˇete!"vylepšenou o možnost pˇridánívlastního jména k pozdravu, nicménˇei tak lze na ní dobˇredemonstrovat rozvrstvení podle návrhového vzoru Model-View-Controller. V této kapitole bude ukázáno, jak využít direktivy include pro vkládání opakujících se prvk ˚una stránkách, jakým je napˇríkladna- vigaˇcnímenu. Jak vytvoˇritJavaBean komponentu a jak je možné pomocí EL pˇristupovat, k dat ˚um,které nese. Bude rovnˇežvysvˇetlenopoužití servletu zajišt’ujícího ˇrízenícelé apli- kace.

5.1.1 Model

Model je zastoupen tˇrídou,která splˇnujeparametry JavaBean komponenty. Jedná se o tˇrídu, která pomocí svých privátních promˇenných(tzv. vlastností) popisuje model osoby, jakožto objekt se kterým tato aplikace pracuje. Pro pˇrehlednost,je model zjednodušen na maximální možnou míru, takže ona osoba je popsána pouze jedinou vlastností, a to svým jménem. Rov- nˇežpráce s tímto objektem spoˇcíváv zapamatování zadaného jména a následném poskyt- nutí této informace, když je vyžadována. K tomuto úˇceluslouží get/set metody pro danou vlastnost, jimiž JavaBean komponenta disponuje. Nejlépe podpoˇrípochopení pˇredešléhoodstavce ukázka kódu JavaBean komponenty, tedy souboru PersonBean.java. package model; public class PersonBean implements java.io.Serializable { private String name; public PersonBean() { } public String getName() {

22 5.1. NÁVRH MODEL-VIEW-CONTROLLER APLIKACE

return name; } public void setName(String name) { this.name = name; } }

Jak je vidˇet,jediná vlastnost této JavaBean komponenty se jmenuje name. Konstruktor je bez parametr ˚ua pˇrístupk vlastnosti name zajišt’ují metody getName a setName.

5.1.2 Pohled (View)

Pohled zajišt’ují JSP stránky. Stránka index.jsp nabízí formuláˇr,který vyzývá návštˇev- níka ke vložení svého jména. Druhá JSP stránka helloOutput.jsp zobrazuje pozdrav, ke kterému je pˇripojenojméno zadané do formuláˇrena úvodní stránce. Pro celou aplikaci je spoleˇcnénavigaˇcnímenu. Aby se, v pˇrípadˇezmˇenyv menu, nemusely dˇelatopravy ve všech stránkách, je zde využita direktiva include, která vloží menu na konkrétní místo ve stránce. Samotné menu je tedy obsaženo v souboru menu.jsp, který je „includován“ do zbylých dvou JSP stránek. Následující výpis kódu je souˇcástíJSP stránky index.jsp.

<%@page contentType="text/html" pageEncoding="UTF-8"%> Ukazkova aplikace <%@ include file="menu.jsp" %>

Welcome in example application!

Enter your name:

After submiting your name ...

23 5.1. NÁVRH MODEL-VIEW-CONTROLLER APLIKACE

Oproti klasické HTML stránce se tato JSP stránka liší na tˇrechmístech: Direktiva na prv- ním ˇrádku <%@page contentType="text/html" pageEncoding="UTF-8"%> definuje nastavení JSP stránky. Následující ˇrádeks direktivou <%@ include file="menu.jsp" %> bude pˇripˇrekladunahrazen kódem, který obsahuje soubor menu.jsp. Poslední zajímavost se nachází ve znaˇcces formuláˇrem.

Enter your name:
Poté, co uživatel stiskne tlaˇcítkoOK, odešle se požadavek servletu HelloServlet.jsp. Zaslaný požadavek v sobˇeponese parametr userName. Po zpracování požadavku pˇredáservlet ˇrízenístránce helloOutput.jsp: <%@page contentType="text/html" pageEncoding="UTF-8"%> Ukazkova aplikace <%@ include file="menu.jsp" %>

Hello ${person.name}!

Rádekˇ

Hello ${person.name}!

ukazuje, jak je možné pomocí Expression Language získat hodnotu vlastnosti z JavaBean komponenty, do níž servlet uložil hodnotu jména získanou z formuláˇre. Na první pohled by se mohlo zdát,že pˇrecenení možné, aby se pomocí teˇckovénotace pˇristupovalona promˇennou name, která má zabezpeˇcenítypu private. Nicménˇezápisem ${person.name} se ve skuteˇcnostivolá get metoda od promˇenné name. Tímto zp ˚usobemse tedy praktikuje získávání dat z JavaBean komponent. Existuje ještˇedruhý zp ˚usobpomocí jsp akcí, ale vyu- žívání EL je více používané.

24 5.2. JSTL A FILTROVÁNÍ POŽADAVKU˚

5.1.3 Rídícíˇ ˇcást(Controller)

Jako ˇrídícíjednotka této aplikace slouží servlet, konkrétnˇe HelloServlet.java. Nejd ˚ule- žitˇejšímetoda tˇrídyservletu vypadá takto: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PersonBean person = new PersonBean(); person.setName((String)request.getParameter("userName")); request.getSession().setAttribute("person", person); request.getRequestDispatcher("/helloOutput.jsp") .forward(request, response); }

V aplikaci se po zadání jména do formuláˇrea odeslání požadavku na servlet zavolá zmínˇenámetoda. Jak je vidˇet,vytvoˇríse nová instance JavaBean komponenty se jménem person. Z objektu požadavku se získá parametr userName a tato hodnota se uloží do Ja- vaBeanu. Celá tato komponenta je pak vložena do objektu session, tedy do objektu, který je dostupný na všech stránkách aplikace pro jednoho konkrétního uživatele. Po té je pˇredáno ˇrízenína stránku helloOutput.jsp. Tam se pomocí EL zobrazí hodnota jména z JavaBean komponenty person, kterou servlet instancioval.

5.2 JSTL a filtrování požadavk ˚u

Ukázková aplikace 2 pˇridávák první verzi jazykové pˇrizp˚usobeníaplikace pomocí knihovny JSTL. Princip spoˇcíváv umístˇenítext ˚umimo samotné stránky a JSP obsahuje pouze odkazy na daný text. Do jakého jazykového souboru je odkaz namíˇrenzávisí na nastavení systé- mové promˇenné locale. Dále se v této kapitole pˇredvede,jak je možné využívat knihovny JSTL a jak zapojit filtry na pˇredzpracováníuživatelských požadavk ˚u.

5.2.1 Internacionalizace v JSP

Tato ukázková aplikace nabízí lokalizaci do dvou jazyk ˚u,a to ˇceštinya angliˇctiny. Po pr- votním spuštˇeníse aplikce pˇrizp˚usobímístnímu jazykovému nastavení klienta a mimo to je nabídnuta možnost ruˇcníhopˇrepínánímezi tˇemitojazyky. Pro internacionalizaci v JSP je výhodné použít, k tomuto úˇcelunavrženou, JSTL knihovnu. Následující ukázka souboru index.jsp ukazuje jak na to. <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>

25 5.2. JSTL A FILTROVÁNÍ POŽADAVKU˚

Ukazkova aplikace <%@ include file="menu.jsp" %>

, ${person.name}!

:

2

...
Aby bylo možno v ˚ubecknihovnu JSTL zabývající se internacionalizací používat, je tˇreba ji nejprve v JSP deklarovat pomocí direktivy: <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %> V hlaviˇcceJSP stránky se pomocí znaˇcky setLocale nastavuje promˇennáprostˇredí locale a tím pádem i jaký jazyk se má použít. EL výraz ${language} evaluuje promˇennoulanguage, která je zaslána servletem starajícím se o internacionalizaci. Znˇcka setBundle definuje resourceBundle, což je soubor, který má koncovku properties.

26 5.2. JSTL A FILTROVÁNÍ POŽADAVKU˚

Soubor .properties má formát typu: klíc1=text1ˇ klíc2=text2ˇ ...

Oddˇelovacísymbol klíˇcea hodnoty m ˚užebýt také mezera nebo dvojteˇcka.Je potˇrebamít tolik soubor ˚u,kolik jazykových variant má být k dispozici. V tomto konkrétním pˇrípadˇese jedná o soubory:

• ukazkovaAplikaceTexty_cs.properties - použije se v pˇrípadˇe,žeje promˇenná locale nastavena na hodnou cs

• ukazkovaAplikaceTexty_en.properties - použije se v pˇrípadˇe,žeje promˇenná locale nastavena na hodnou en

• ukazkovaAplikaceTexty.properties - implicitní použití v pˇrípadˇe,že žádný soubor neodpovídá hodnotˇesystémové promˇenné locale

Samotné vypisování textu v pˇríslušnémjazyce pak zajišt’uje znaˇcka message:

Celá tato znaˇckaje ve výsledku nahrazena textem odpovídajícím hodnotˇe,z pˇríslušného . properties souboru, asociované s obsahem atributu key.

5.2.2 Internacionalizace v servletech V této verzi ukázkové aplikace se dá volit jazyk pˇrepínánímpromˇenné locale pˇrímov JSP. Kdyby však bylo potˇrebamanipulovat s promˇennou locale v servletu, je možné využít metod objektu response: response.getLocale(); response.setLocale(new Locale("cs"));

5.2.3 Dynamické generování obsahu pomocí JSTL AˇckolivJSP stránky patˇrí ˇcistˇedo zobrazovací vrstvy aplikace, dá se do nich vetknout i urˇcitámíra inteligence, která dokáže generovat dynamický obsah v závislosti na nˇejakých podmínkách. Jedním z nástroj ˚u,který toto dokáže jsou knihovny JSTL. V tomto konkrétním pˇrípadˇebyla využita knihovna core o níž se zmiˇnujekapitola 3.6.1. Výše uvedený výpis kódu souboru index.jsp obsahuje direktivu, která tuto knihovnu inicializuje: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

27 5.2. JSTL A FILTROVÁNÍ POŽADAVKU˚

Následující výsek stránky v sobˇeskrývá rozhodovací logiku: Pokud uživatel dosud ne- zadal jméno, vypíše se prosté uvítání. Pakliže již jméno zadal, za uvítáním pˇribydeˇcárkaa jeho jméno. Pokud servlet posílá nˇejakouchybovou zprávu, tak je místo pozdravu zobra- zena pˇredanázpráva.

, ${person.name}!

Rozhodovací znaˇckymají atribut test. Tento atribut obsahuje výraz, jehož pravdivostní hodnota je bud’ TRUE nebo FALSE. V závislosti na vyhodnocení tohoto výrazu se pak vy- koná nebo nevykoná tˇeloznaˇcky. V JSTL znaˇckáchse dá s výhodou využít výraz ˚uExpres- sion Language. Tímto se JSTL stává silným nástrojem, který dokáže ušetˇritspoustu kódu a programátorské práce.

5.2.4 Filtrování požadavk ˚u Filtr je javovská tˇrída,která implementuje rozhraní Filter. Více již bylo napsáno v kapitole 2.4. V této verzi ukázkové aplikace jsou zapojeny dva filtry. NameFilter zjišt’uje, zda ode- slané jméno z formuláˇrena úvodní stránce není pouze prázdný ˇretˇezec.Pokud ano nastaví do promˇenné errorMsg chybovou zprávu a vrátí se ˇrízenízpˇet. package controller; import java.io.IOException; import javax.servlet.*; public class NameFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request.getParameter("userName") != null) { if (request.getParameter("userName").equals("")) { request.setAttribute("errorMsg", "empty_name"); request.getRequestDispatcher("/index.jsp").forward(request, response); } else { chain.doFilter(request, response); } } else { chain.doFilter(request, response); }

28 5.3. PRÁCE S DATABÁZÍ

} } SetCharacterEncodingFilter má na starosti zajistit, aby kódování znak ˚uvšech po- žadavk ˚ubylo nastaveno na UTF-8. package controller; import java.io.IOException; import javax.servlet.*; public class SetCharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("utf-8"); } chain.doFilter(request, response); } } Aby aplikace vˇedˇela,že je tˇrebapožadavky filtrovat, je tˇrebatuto informaci zavést do descriptoru aplikace web.xml: SetCharacterEncodingFilter controller.SetCharacterEncodingFilter NameFilter controller.NameFilter SetCharacterEncodingFilter /* NameFilter /*

5.3 Práce s databází

Tˇretíverze ukázkové aplikace umí pˇresnˇeto, co pˇredešlá.K tomu však pˇridávápráci s da- tabází. V tomto konkrétním pˇrípadˇebyla využita databáze MySQL. Pokud nˇekdochce tuto aplikaci používat, musí si nejprve vytvoˇritjednoduchou databázi (viz kapitola 5.3.1). Apli- kace mu potom umožní pˇridávatzáznamy do databáze a zobrazovat je. Pro pˇripojeník da- tabázi je využito rozhraní JDBC . Pˇriparalelním pˇrístupuvíce uživatel ˚uk databázi, se stává tato operace tzv. úzkým hrdlem webové aplikace, nebot’ vytváˇreníspojení je pomˇernˇeˇca- sovˇenároˇcnáoperace. Eliminaci tohoto problému nabízí ˇrešenínazývané connection poo- ling. Princip spoˇcíváv tom, že po té co je spojení vytvoˇreno,je uloženo do poolu. Pˇridalším

29 5.3. PRÁCE S DATABÁZÍ požadavku na spojení je již použito ono spojení z poolu. Pokud jsou momentálnˇevšechna spojení z poolu využívaná, vytvoˇríse spojení nové. Výhodou je, že se nemusí pro každý požadavek spojení pracnˇevytváˇreta zavírat, ale pouze se odkládají do poolu, kde ˇcekajína svoje využití. Pˇripojeník databázi má na starosti tˇrída,která poskytuje pˇrístupk jednomu ˇcivíce connection pool ˚u databáze definovaných v .properties souboru. Klient dostane pˇrístup k jedné instanci prostˇrednictvímmetody getInstance a m ˚užepak z poolu pˇripojeníbrát a zpˇetdo nˇejvracet. Zmínˇenátˇrídase jmenuje DBConnectionManager.java a je volnˇedostupná jakožto souˇcástprojektu [2].

5.3.1 Vytvoˇrenídatabáze Pˇredpoklademvytvoˇrenídatabáze podle návodu této kapitoly je mít nainstalovaný a spuš- tˇenýdatabázový server MySQL. Následnˇebude ukázáno, jak vytvoˇritdatabázi, která se jmenuje „lide“ a v ní jednu tabulku s názvem „clovek“ s atributy „jmeno“ a „hobby“. V pˇríkazovékonzole operaˇcníhosystému je tˇrebazadat následující sadu pˇríkaz˚u: mysql -u root create database lide; use lide; create table clovek (jmeno VARCHAR(255) NOT NULL, hobby VARCHAR(255)); exit

Tímto je pˇripravenoprostˇredípro použití tˇretíverze ukázkové aplikace.

5.3.2 Rozšíˇrenímodelu aplikace Databáze obsahuje informace o lidech. Konkrétnˇeo jejich jménech a koníˇccích.Každá po- ložka databáze tedy popisuje ˇclovˇekatˇemitodvˇemaatributy. Z tohoto d ˚uvoduje tˇrebapˇri- zp ˚usobiti model aplikace zmínˇenýmpožadavk ˚um. JavaBean komponenta PersonBean je rozšíˇrenapouze o vlastnost hobby a její metody getHobby a setHobby. Tˇrídamodelu, která pˇribylase jmenuje People.java : package model; import java.util.Vector; public class People { private Vector persones; private int personesAmount; public People() { persones = new Vector(); } public Vector getPersones() { return persones; }

30 5.3. PRÁCE S DATABÁZÍ

public void addPerson(PersonBean person) { persones.add(person); } public int getPersonesAmount () { personesAmount = persones.size(); return personesAmount; } }

Tato tˇrídanepatˇrímezi klasické JavaBean komponenty, nemá get/set metody, nicménˇe takto lépe vyhovuje potˇrebámaplikace. Obsahuje dvˇevlastnosti. Promˇennou persones, která je typu Vector sloužící na uskladˇnovánízáznam ˚udatabáze a promˇennou personesAmount, jejímž úˇcelemje pamatovat si poˇcetzáznam ˚uv promˇenné persones. Složení tˇechtodvou tˇrídtedy pˇresnˇemodeluje podobu databáze. Tˇrída PersonBean od- povídá jedné položce databáze, tedy ˇclovˇeku,a kolekce tˇechtoprvk ˚uukládaných do vlast- nosti tˇrídy People koresponduje s tabulkou v databázi.

5.3.3 Rízeníˇ databázových požadavk ˚u

Rozšíˇrenímrozsahu funkcí aplikace se musela rozšíˇriti její ˇrídícíˇcást.Databázové operace ˇrídínovˇepˇridanýservlet DbServlet. Názorný pˇríkladkomunikace uživatele s databází pˇreswebovou aplikaci je realizován následujícím zp ˚usobem:

Obrázek 5.1: Schéma funkce komunikace s databází

Uživatel kliknutím na odkaz, popˇr.odesláním dat formuláˇreposílá požadavek na DbServlet. K požadavku jsou pˇridruženy parametry podle nichž pak servlet rozpozná, jaká operace se po nˇemvyžaduje. Parametr urˇcující,zda se budou data do databáze zapisovat nebo z ní ˇcíst, se jmenuje jobType. V pˇrípadˇezápisu obsahuje požadavek i parametry se samotnými daty name a hobby. Jedná-li se o ˇctenídat z databáze, parametr dataType rozhoduje o tom, jaká data se uživateli zobrazí. Aby bylo možné realizovat uvedenou komunikaci, je potˇrebavˇedˇetjak pˇredávatpara- metry v objektu request. V pˇrípadˇe,že je potˇrebazavolat servlet kliknutím na odkaz ve

31 5.4. UŽIVATELSKÉ ZNACKYˇ stránce, používá se tato obecná konstrukce: odkaz

Jméno servletu patˇrína místo pˇredotazník. Za znakem otazníku pak lze pˇredatlibovolné množství parametr ˚uoddˇelenýchznakem &. V jiném pˇrípadˇeje potˇrebaservletu poslat data z formuláˇre,právˇetak, jak ukazuje výsek JSP stránky ukázkové aplikace.

:

Zde se volá servlet uvedený v atributu action. Servlet pak m ˚užez požadavku získat hod- noty tˇechznaˇcek,které disponují atributem name. Parametr s názvem userName má hod- notu jména zadaného do vstupního pole formuláˇre.Z parametru sendName je možné získat ˇretˇezec„OK“. Jedná se o hodnoty atribut ˚u value.

5.4 Uživatelské znaˇcky

Ctvrtᡠa poslední verze ukázkové aplikace umožˇnujezobrazovat data z databáze po strán- kách, což zajišt’uje knihovna uživatelských znaˇcek.Mimo to pˇribylai funkce vymazání dat z databáze, která je ovšem principiálnˇetotožná s funkcemi pracujícími s databází z pˇredešlé kapitoly 5.3. Struˇcnýnávod jak vytvoˇritvlastní znaˇckudává kapitola 3.3.3.1. Naznaˇcenýmzp ˚usobem je možné vyrobit znaˇcku,která zapouzdˇrujetémˇeˇrlibovolnou funkcionalitu. Pˇredzapoˇce- tím tvorby vlastní znaˇckyje však dobré si zjistit, zda již daný problém nevyˇrešilnˇekdodˇríve. Na internetu jsou dostupné stovky nejr ˚uznˇejšíchuživatelských znaˇceka bylo by zbyteˇcné, obraznˇeˇreˇceno,znovu objevovat kolo. V této aplikaci, stejnˇejako v mnoha jiných, bylo tˇrebarozdˇelitvypisovaná data na nˇeko- lik menších množin. Oproti výpisu všech dat na jedné stránce, rozumnˇevelké celky infor- mací uživatel vnímá jako pˇrehlednˇejší.K tomuto úˇceluje vhodná znaˇcka,která dokáže data rozdˇelitdo jednotlivých stránek, v nichž lze listovat. Právˇetak, jako jsou vypisovány vý- sledky hledání jakéhokoliv internetového vyhledávaˇce.Tuto funkˇcnostnabízí znaˇckapager- tag [11], volnˇedostupná prostˇrednictvíminternetu. Souˇcástítéto znaˇckyje :

• pagertag.jar pagertag.jar - knihovna obsahující program znaˇcky

• taglib139.tld - tag library descriptor

Použití znaˇckyspoˇcíváv umístˇenísouboru taglib139.tld do adresáˇre WEB-INF, sou- boru pagertag.jar mezi ostatní knihovny a její registraci v souboru web.xml

32 5.4. UŽIVATELSKÉ ZNACKYˇ

http://www.servletsuite.com/servlets/pager /WEB-INF/taglib139.tld

Dále již nic nebrání jejímu použití. Následující výsek kódu patˇrí stránce getOutput. jsp starající se o zobrazování dat.

... <%@ taglib uri="http://www.servletsuite.com/servlets/pager" prefix="pg" %> ...

${people.personesAmount} , 10 10 20 20 30 30

<%-- PAGER --%>
  • ${man.name} ${man.hobby} ${man.name} ${man.hobby}

    33 5.4. UŽIVATELSKÉ ZNACKYˇ

<%=thisPage%>
<%-- /PAGER --%> ...

Na úvod je tˇrebainicializovat knihovnu znaˇcek,pro danou JSP, direktivou <%@ taglib uri="http://www.servletsuite.com/servlets/pager" prefix="pg" %>

V sekci uzavˇrenéznaˇckami se nachází odkazy umožˇnujícínastavení promˇenné itemsPerPage a potažmo i množství údaj ˚una stránku. Dále následuje úsek kódu, který pomocí kombinace JSTL, EL a uživatelské knihovny znaˇcekpro stránkování dokáže zobrazit data na stránky a rovnˇežvygeneruje odkazy na listování v nich, takzvaný index. Použité techniky, které se v této JSP stránce vyskytují, již byly v pˇredešlýchkapitolách popisovány. Detailnˇejšíinformace o knihovnˇeznaˇcekpager-tag [11] lze nalézt pˇrímona stránkach distributora.

5.4.1 Rozšíˇrenímodelu aplikace Zmˇenachování vypisování dat se odráží v rozšíˇrenímodelu aplikace o JavaBean kompo- nentu, která pˇredstavujemodel zobrazování informací z databáze. Jde o to, že uživatel si m ˚užezvolit poˇcetpoložek na jednu stránku. Tato tˇrída BehaviourBean si pomocí své vlastnosti personesPerPage pamatuje, kolik položek si uživatel pˇrejeaktuálnˇezobrazo- vat. Pokud si uživatel nepˇrejejinak, je použito defaultní nastavení, které nese konstanta defaultPersonesPerPage. Tato JavaBean komponenta je pˇredávánapomocí objektu session. Má tedy platnost po dobu trvání uživatelova sezení, nebo do doby, kdy je její vlastnost opˇetzmˇenˇena.

34 Kapitola 6 Webová aplikace LogoArena.cz

6.1 Úˇcela charakteristika projektu

Webová aplikace s názvem LogoArena.cz tvoˇrípraktickou ˇcásttéto bakaláˇrsképráce. Jedná se o projekt, jenž by mˇelbýt v druhé polovinˇeroku 2008 nasazen na internet. Jedná se o webovou aplikaci postavenou na platformˇeJava 2 Enterprise Edition. Úˇcelemprojektu je nabídnout veˇrejnostiobrázky a animace pro mobilní telefony se sportovní tématikou. Aplikace byla konstruována tak, aby mohla návštˇevníkovinabídnout pˇrehlednéa ergono- micky navržené uživatelské rozhraní, jehož ovládnutí po nˇemnebude vyžadovat pˇrílišné množství ˇcasu,v dobˇetržní ekonomiky tolik drahoceného. Aplikace umožˇnujeprocházet databázi obrázk ˚ua animací se sportovní tématikou. Pokud uživatel nalezne v databázi na- bízených objekt ˚utakový, který by chtˇelmít na konkrétním mobilním telefonu, m ˚užesi jej objednat pomocí odeslání textové zprávy pˇríslušnéhotvaru na uvedené ˇcíslo.Pomocí tech- nologie WAP mu bude mobilní obsah doruˇcen.Platba za tuto službu je zahrnutá v cenˇe odeslané textové zprávy. Tento zp ˚usobplacení se stává ˇcímdál populárnˇejšíma nazývá se mikroplatba. Nejˇcastˇejise lze s touto službou setkat pod názvem Premium SMS . Tento zp ˚u- sob placení se rozšiˇrujev oblasti hlasování do televizních poˇrad˚u,vˇeˇrejnýchdobroˇcinných sbírek (dárcovské SMS), objednávání mobilního obsahu (Java hry, melodie, obrázky...). Více informací na toto téma lze nalézt na internetu, napˇr.http://mikroplatby.cz <>. V souˇcasné dobˇeexistují až desítky spoleˇcností,které tyto služby nabízejí.

6.2 Fáze realizace projektu

Vytvoˇrenícelého projektu LogoArena.cz se skládá z nˇekolikafází, pˇriˇcemžne všechny se týkají programování. Nápˇntéto práce spoˇcíváv realizaci bodu 3.

1. návrh a plánování projektu

2. tvorba sady ukázkových objekt ˚upro mobilní telefony

3. tvorba webových stránek s nabídkou ukázkových objekt ˚u

4. tvorba skuteˇcnýchobjekt ˚upro mobilní telefony

5. oslovení sportovních klub ˚u,jejichž loga se budou vyskytovat v nabízených objektech a domluva podmínek, za nichž jsou ochotni je poskytnout

35 6.3. ARCHITEKTURA APLIKACE

6. výbˇerspoleˇcnosti,která zajistí platební systém pˇresmobilní telefony

7. napojení tohoto systému na webovou aplikaci LogoArena.cz

8. nasazení na web - testovací provoz

9. nasazení na web - oficiální provoz

6.3 Architektura aplikace

Aplikace ctí návrhový vzor Model-View-Controller. Dynamické generování obsahu zajišt’ují ˇrídícíservlety, které získávají data z databáze MySQL. Data jsou držena v JavaBeans kompo- nentách a publikována uživateli prostˇrednictvímJSP stránek. Pro pochopení mechanism ˚u, kterých tato aplikace využívá byla vybudována ukázková aplikace popsaná v kapitole 5, která je zjednodušeným modelem aplikace LogoArena.cz.

6.3.1 Model

Model aplikace tvoˇrípˇettˇríd:

• ObjectBean Jedná se o JavaBean komponentu, která je modelem objektu (mínˇeno mobilního obsahu, nikoliv instance tˇrídy)pro mobilní telefon. Obsahuje tedy právˇe takové vlastnosti, jaké atributy má tabulka object_item v MySQL databázi.

• PhoneBean JavaBean komponenta zastupující konkrétní mobilní telefon, nesoucí všechny informace o nˇem.

• ObjectItems Tˇrída,která slouží jako kontejner pro objekty tˇrídy ObjectBean. Má dva atributy. Jeden typu Vector, do kterého lze pomocí metody addObjectItem pˇridávatjednotlivé objekty tˇrídyObjectBean. Druhý atribut objectsAmount, který ve spolupráci s metodou getObjectsAmount nese informaci o celkovém poˇctuJa- vaBean objekt ˚uuložených ve vektoru.

• PhoneItems Obdoba tˇrídy ObjectItems s tím rozdílem, že pracuje s objekty tˇrídy PhoneBean.

• BehaviourBean Pˇredstavujemodel chování aplikace. Její vlastnosti odpovídají po- ˇctuzobrazovaných položek na jednu stranu výpisu dat, ˇcikonkrétnímu vybranému telefonu.

36 6.4. PROPOJENÍ SE SMS PLATEBNÍM SYSTÉMEM

6.3.2 Pohled (View)

Zobrazovací vrstvu aplikace mají na starost ˇcistˇeJSP stránky. V aplikaci je využito následu- jících vlastností technologie JSP, které HTML nenabízí.

• Skládání JSP stránky z více stránek dohromady pomocí akce jsp:include. Viz ka- pitola 3.4

• Rozhodovací funkce (choose, when, if) z knihovny JSTL, pomocí nichž se zobra- zuje obsah stránky v závislosti na obsahu vlastností JavaBean komponent.

• Cyklus forEach z knihovny JSTL, pomocí nˇejžjsou vypisována data z databáze uložená ve vektoru, jenž je souˇcástímodelu aplikace.

• Využití uživatelské knihovny znaˇcek[11] sloužící ke stránkování výpisu dat z data- báze.

6.3.3 Rídícíˇ ˇcást(Controller)

Rídícíˇ centrum aplikace je relizováno pomocí nˇekolikaservlet ˚u. DataServlet se stará o ob- sluhování požadavk ˚una výpis dat z databáze. Ke komunikaci s databází využívá pomoc- nou tˇrídu DBConnectionManager, která je souˇcástí[2]. Tato tˇrídáslouží jako wrapper con- nection poolingu databáze. Servlet PhoneServlet provádí operace spojené s vybíráním mobilního telefonu. ListObjectServlet a ListPhoneServlet se uplatˇnujípˇripožadavku na zmˇenu poˇctuvypisovaných objekt ˚u,respektive telefon ˚u,na stránku. Jejich úkolem je adekvátnˇe nastavit vlastnosti JavaBean komponenty BehaviourBean. Výše uvedené prvky tvoˇríaplikaci, která je schopna dynamicky generovat obsah v zá- vislosti na požadavcích uživatele.

6.4 Propojení se SMS platebním systémem

Propojení se SMS platebním systémem je krok, kterému musí pˇredcházetvýbˇerspoleˇcnosti, která jej zajistí. Jedná se o tzv. agregátora, jenž má nasmlouvané propojení se sítˇemivšech mobilních operátor ˚up ˚usobícíchna území CR.ˇ Spolupráce s agregátorem je snazší, než za- jišt’ovat komunikaci pˇrímos jednotlivými operátory. Návazný krok spoˇcíváv dojednání finanˇcníchpomínek se subjekty, jejichž loga se objeví v nabídce LogoArena.cz. Na základˇe výsledk ˚utˇechtojednání lze vytvoˇritfinanˇcnírozvahu, která bude urˇcujícípˇrivýbˇeru agre- gátora, zajišt’ujícího platební systém, tedy službu, která obvykle nese obchodní název Pre- mium SMS. V této oblasti ˇceskéhotrhu momentálnˇefiguruje nˇecopˇresdeset firem. Nutno dodat, že s r ˚uznoukvalitou nabízených služeb a cen. Pˇrestoženení momentálnˇeznáma spoleˇcnost,která bude službu Premium SMS posky- tovat , lze zp ˚usobfungování služby obecnˇepopsat.

37 6.4. PROPOJENÍ SE SMS PLATEBNÍM SYSTÉMEM

• uživatel zašle SMS s objednávkou agregátorovi

• agregátor pˇredáobsah SMS na LogoArena.cz

• vygeneruje se odpovˇed’ (odkaz na wap server)

• odpovˇed’ pˇredáteagregátorovi

• agregátor pˇredáodpovˇed’ uživateli

• uživatel stáhne objekt z wap serveru

Zjednodušený model popsané službu znátorˇnujeobrázek 6.1

Obrázek 6.1: SMS platebním systém

Ke komunikaci s platebním systémem bude tˇrebavytvoˇritservlet reagující na pˇríchozí požadavky zasílané od agregátora. Každý z agregátor ˚umá konkrétní specifikaci svého sys- tému, v níž je popsán zp ˚usob,jakou formu má odpovˇed’ generovaná servletem mít. Zjedno- dušenˇeˇreˇceno:pomocí specifikované formy komunikace je tˇrebasystému agregátora sdˇe- lit, na jaké adrese je dosažitelný požadovaný objekt, který si následnˇezákazník ˚uvtelefon stáhne pomocí služby WAP.

38 Kapitola 7 Závˇer

Tato bakaláˇrskápráce obsahuje teorii potˇrebnouk tomu, aby mohl ˇctenáˇrpochopit, jakým zp ˚usobemaplikace LogoArena.cz funguje. M ˚užeji použít jako návod pro vytvoˇreníapli- kace obdobných parametr ˚u.Práce seznamuje s technologií JavaServlets, jakým zp ˚usobemje možné sdílet informace mezi jednotlivými servlety, potažmo webovými stránkami, jak ob- sluhovat požadavky. Nachází se zde informace o technologii Java Server Pages, která byla vytvoˇrenajakožto nádstavba JavaServlets. Jsou zmínˇenyprvky, které z technologie JSP dˇe- lají efektivní nástroj. Mezi nˇepatˇrípˇredevšímExpression Language, JSTL, JSP direktivy a akce. Souˇcástípráce jsou ˇctyˇriverze ukázkové aplikace, které postupnˇedemonstrují praktické použití popsané teorie. Každá následující aplikace rozšiˇrujepˇredchozío další funkcionalitu. První aplikace popisuje pouze užití JavaBeans a sdílení informací mezi jednotlivými webo- vými stránkami, druhá verze ukazuje, jak využít filtrování požadavk ˚ua používat knihovnu JSTL k internacionalizaci aplikace. Tˇretíverze dává návod, jak propojit aplikaci s databází MySQL. Jak používat uživatelské znaˇckyprozrazuje poslední verze. Stav projektu LogoArena.cz v dobˇedokonˇceníbakaláˇrsképráce sestává z webové apli- kace vystavˇenéna platformˇeJava. Nabízí propojení s databází MySQL a je schopna dyna- micky generovat stránky pomocí technologie JSP a JavaServlets. K dokonˇcenícelého pro- jektu zbývá realizovat fázi, která již nepatˇrído zadání bakaláˇrsképráce, a tou jest propojení se SMS platebním systémem. Jako pˇrínostéto bakaláˇrsképráce vidím pˇredevšímto, že jakožto veˇrejnˇepˇrístupnýma- teriál nabídne ucelený návod na vybudování webové aplikace na platformˇeJava ve spojení s relaˇcnídatabází. Vlastnosti, které m ˚uženabídnout, jsou konceptuální korektnost a popis všech d ˚uležitýchprvk ˚u,které je tˇrebapˇritvorbˇeaplikace znát. Ctenáˇrenezahlcujeˇ tématicky irelevantními informacemi. Mnoho tutoriál ˚u,které lze na internetu nalézt, právˇetyto atri- buty postrádá. Mnohé vysvˇetlujíjen izolovanou ˇcástproblematiky. Nˇekteréz nich dokonce nabádají k postup ˚um,které mísí vrstvu modelu aplikace s prezentaˇcnívrstvou ˇciˇrídícílo- gikou. Zp ˚usob˚ujak vytvoˇritwebovou aplikaci založenou na platformˇeJava disponující stej- nými funkcemi existuje více. Tento popsaný je pouze jeden z nich. Realitou je, že s postup- ným vývojem Javy pˇribývajíi další nástroje a cesty, jakými lze webové aplikace budovat. Je známo, že Java hosting ˚uje v nabídce webhostingových spoleˇcností(napˇr.oproti PHP) jak povˇestnéhošafránu. Hlavní pˇríˇcinavychází z vlastností Java Virtual Machine, zejména z problému izolace jednotlivých webových aplikací. Proto je tˇežkézaruˇcitoptimální vlast-

39 7. ZÁVERˇ nosti takto hostovaných aplikací. Do budoucna se dá tedy poˇcítats tím, že LogoArena.cz bude namísto webhostingu využívat služeb serverhostingu. Ten je sice finanˇcnˇenákladnˇejší, ale dokáže zaruˇcitvyšší stabilitu aplikace a tím i vyšší spokojenost jejích uživatel ˚u.

40 Literatura

[1] The Apache Software Foundation: Struts Framework, Dokument dostupný na URL (duben 2008). 4.4.1

[2] Joyce, T. a jiní: Just Another Layer (JAL), Dokument dostupný na URL (duben 2008). 5.3, 6.3.3

[3] NetBeans IDE, http://netbeans webové stránky pro- jektu NetBeans (duben 2008). A

[4] The Apache Software Foundation: Spring Application Framework, Dokument do- stupný na URL (duben 2008). 4.4.1

[5] Hinkle, G.: Stripes Framework, Dokument dostupný na URL (duben 2008). 4.4.1

[6] The Apache Software Foundation: Tapestry, Dokument dostupný na URL (duben 2008). 4.4.2

[7] Tichý, J.: Programová podpora tvorby webových aplikací (diplomová práce), VŠE Praha, 2004, Dokument dostupný na URL. 4.2

[8] Ukázkové Apklikace, testovací webové stránky ukázkových aplikací (kvˇeten2008). A

[9] Woodcock, J.: Slovník výpoˇcetnítechniky, Microsoft Press, Praha, 1993, 80-85297-48-5. 4.2

[10] Sun Microsystems: Java documentation, Dokument dostupný na URL (duben 2008). 4.3

[11] servletsuite.com: Pager Tag, Dokument dostupný na URL (duben 2008). 5.4, 6.3.2

[12] java-source.net: Java Web Frameworks, Dokument dostupný na URL (duben 2008). 4.4

41 Rejstˇrík application scope, 3 uživatelské znaˇcky, 9 Unified EL, 13 custom tags, 9 Unified Expression Language, 13 elementy JSP, 6 WAP, 35 web frameworks, 20 Functions, 16 webová komponenta, 2 webový prostˇredek, 2 internacionalizace, 20 webový rámec, 20 Internationalization, 16 XML, 16 Java Server Faces, 21 Java Server Pages, 6 JavaBeans, 11 JavaServlets, 2 JDBC, 29 JSP, 2, 6 JSP Standard Tag Library, 14 JSTL, 14 lokalizace, 20 mikroplatby, 1 miroplatba, 35 Model 1, 18 Model 2, 18 Model-View-Controller, 14, 18, 20, 22 MVC, 18 page scope, 3 požadavek, 3 Premium SMS, 35, 37 request scope, 3, 4 Rich Internet Application, 17 session scope, 3, 4 sezení, 3 Spring MVC, 21 SQL, 16 Stripes, 21 Struts, 21

Tapestry, 21

42 PˇrílohaA PˇriloženéCD - obsah a zprovoznˇeníaplikací

Souˇcástípˇrílohyje CD, které obdahuje následující položky:

• text bakaláˇrsképráce

• zdrojové kódy ukázkových aplikací

• zdrojové kódy aplikace LogoArena.cz

• potˇrebnéknihovny pro chod aplikací

• webové archívy všech zmínˇenýchaplikací (tedy soubory typu WAR)

• dávkové soubory, které jsou schopny vytvoˇritpotˇrebnoudatabázovou strukturu

Nejsnazší zp ˚usobzprovoznˇeníwebové aplikace z CD, at’ už ukázkové nebo LogoA- rena.cz, nabízejí integrovaná vývojová prostˇredí.Doporuˇcilbych napˇríkladNetBeans, které si lze stáhnout zdarma [3]. V nabídce File je tˇrebazvolit New Project.... Dále vybrat mož- nost with Existing Sources. Po následném lokalizování zdrojového kódu a adresáˇres knihovnami je k dispozici již funkˇcníprojekt, který lze úspˇešnˇespustit. Pro potˇrebytˇretía ˇctvrtéukázkové aplikace je tˇrebavytvoˇritdatabázi. K tomuto úˇcelu je na CD umístˇendávkový soubor, který tuto ˇcinnostprovede. Pˇredpoklademje nainsta- lovaný a spuštˇenýMySQL server. Tento dávkový soubor lze nalézt v adresáˇri Ukázkové aplikace a nese název vytvoreníˇ databáze.bat. Vytvoˇrenídatabáze pro aplikaci LogoArena.cz si žádá spuštˇenítˇrechdávkových sou- bor ˚u.Soubor 1 vytvoreníˇ databáze.bat vytvoˇríuživatele root a založí databázi logo- arenadb spolu s potˇrebnýmitabulkami. Soubory 2 import objekt˚u.bat a 3 import telefon˚u.bat, spoleˇcnˇes textovými soubory obsahujícími data tabulek, naplní databázi požadovanými daty. Ukázkové aplikace jsou, pro možnost testování, nasazeny na web [8].

43