}w!"#$%&'()+,-./012345<ya

Podobné dokumenty
Tvorba informačních systémů

Java Server-side. Štěpán Kuchař. VŠB-TUO FEI Katedra informatiky

Platforma J2EE. Lukáš Zapletal liberix.cz. Platforma Java 2 Enterprise Edition vývoj webových aplikací

Servlety a JSP. Petr Adámek, petr.adamek@ibacz.eu

1. Distribuce Javy. 2. Vlastnosti J2EE aplikace. 3. Fyzická architektura J2EE aplikace. Distribuce Javy se liší podle jejího zamýšleného použití:

Tvorba informačních systémů

(Enterprise) JavaBeans. Lekce 7

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Tvorba informačních systémů

Elektronická podpora výuky předmětu Komprese dat

Tvorba informačních systémů

Michal Krátký, Miroslav Beneš

Tvorba informačních systémů

Tvorba informačních systémů

Semináˇr Java X J2EE Semináˇr Java X p.1/23

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

X33EJA Enterprise Java

TÉMATICKÝ OKRUH Softwarové inženýrství

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

8 Třídy, objekty, metody, předávání argumentů metod

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

1 Webový server, instalace PHP a MySQL 13

JAVA. Webové aplikace Servlety, JSP

UJO Framework. revoluční architektura beans. verze

Vstupní požadavky, doporučení a metodické pokyny

Tvorba informačních systémů

MBI - technologická realizace modelu

PA165: Úvod do Java EE. Petr Adámek

Tvorba podnikových aplikací v jazyce JAVA. Josef Pavlíček KII PEF CZU

Olga Rudikova 2. ročník APIN

KIV/PIA 2013 Jan Tichava

TÉMATICKÝ OKRUH Softwarové inženýrství

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

INFORMAČNÍ SYSTÉMY NA WEBU

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Postup. Úvodem. Hlavní myšlenka frameworku. application. system. assets. uploads

IS pro podporu BOZP na FIT ČVUT

1. Webový server, instalace PHP a MySQL 13

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Tvorba webu. Úvod a základní principy. Martin Urza

PŘEHLED A MOŽNOSTI VYUŽITÍ WEBOVÝCH MAPOVÝCH SLUŽEB

Databázové aplikace pro internetové prostředí PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Software602 Form Designer

HTML Hypertext Markup Language

Přizpůsobení JSTL pro Google App Engine Datastore

Programátorská příručka

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Technology Entry form Entry up-to-date? Internal links Faulty internal Possible internal links

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

3 MOŽNÉ PŘÍSTUPY K TVORBĚ APLIKACÍ NAD SVG DOKUMENTY

1. Programování proti rozhraní

Stručný úvod pro programátory. Michal Kuchta

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

PHP tutoriál (základy PHP snadno a rychle)

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

M4 PDF rozšíření. Modul pro PrestaShop.

Programování v Javě I. Leden 2008

NSWI096 - INTERNET JavaScript

Z. Kotala, P. Toman: Java ( Obsah )

STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

1. Webové služby. K čemu slouží? 2. RPC Web Service. 3. SOA Web Service. 4. RESTful Web services

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

ŠKODA Portal Platform

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PREPROCESOR POKRAČOVÁNÍ

Obrázek 6.14: Prohlížec nápovedy

Programování v Javě I. Únor 2009

Osnova. GIOP a IIOP IDL IOR POA. IDL Klient Server. 2 Historie. 3 Princip a základní pojmy. 4 Implementace. 5 Aplikace CORBA

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Použití inteligentních značek s informačními službami

Základy objektové orientace I. Únor 2010

Pokročilé techniky tvorby sestav v Caché. ZENové Reporty

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Tvorba webových stránek

Tvorba informačních systémů na platformě J2EE Petr Hetmánek Masarykova Univerzita, Fakulta Informatiky, Botanická 68a, Brno

Web Services na SOAP

Úvod do tvorby internetových aplikací

Úvod do programovacích jazyků (Java)

Wonderware Information Server 4.0 Co je nového

Java a XML. 10/26/09 1/7 Java a XML

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

TECHNOLOGIE ELASTICKÉ KONFORMNÍ TRANSFORMACE RASTROVÝCH OBRAZŮ

Snadný vývoj webových aplikací s Nette. Lukáš Jelínek

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Webové rozhraní TELEFONNÍ STYK POD KONTROLOU NÁSTROJ PRO ŘÍZENÍ CHODU CALL CENTRA A ZPRACOVÁNÍ TELEFONNÍCH HOVORŮ. Funkcionalita

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

2012 ET NETERA a.s. Wicket přehled technologie Martin Strejc

KIV/PIA Semestrální práce

KAPITOLA 10. Implementace mezinárodní podpory a lokalizace. V této kapitole:

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Jazyk XSL XPath XPath XML. Jazyk XSL - rychlá transformace dokumentů. PhDr. Milan Novák, Ph.D. KIN PF JU České Budějovice. 9.

Název Live prez Sear enta Maps

Transkript:

MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY }w!"#$%&'()+,-./012345<ya Dynamické generovaní obsahu s Java Server Pages BAKALÁŘSKÁ PRÁCE Petr Lorenc Brno, podzim 2007

Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Vedoucí práce: RNDr. Vlastislav Dohnal, Ph.D. ii

Shrnutí Tato bakalářská práce provádí čtenáře vznikem webové aplikace. Ta je vystavěna na platformě Java, konkrétně na technologiích JavaServlets a Java Server Pages. Umožňuje dynamické generování obsahu uloženého v databázi MySQL. Architektura aplikace ctí návrhový vzor Model-Pohled-Řídící část. Model aplikace reprezentují JavaBean komponenty, pohled tvoří JSP stránky a řídící část zastupují servlety. V prvních čtyřech kapitolách je probrána teorie užitá ve webové aplikaci spolu s vysvětlením pojmů souvisejících s danou problematikou. Pátá kapitola, spolu se zdrojovým kódem webové aplikace, tvoří návod, demonstrující použití výše popsaných teoretických poznatků,k vytvoření webové aplikace. Tato ukázková webová aplikace má čtyři verze. První je obdoba aplikace Ahoj Světe!, následující didakticky přidávají další funkční prvky s tím, že poslední verze je již principiálně plnohodnotnou webovou aplikací nabízející dynamické generování obsahu díky propojení s databází MySQL. Využívá se zde nástrojů technologie JSP nabízejících zefektivnění práce při vývoji webových stránek, jako např. JSTL, Expression Language, JSP direktivy a akce. Vyústěním tohoto návodu je pak webová aplikace LogoArena.cz. Tato je, co do množství zdrojového kódu, rozsáhlejší, nicméně s předešlou ukázkovou aplikací naprosto rovnocenná, bere-li se jako měřítko ná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říklad obrázky či animace. Spuštění těchto stránek se plánuje na druhou polovinu roku 2008. iii

Klíčová 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ředků........................ 4 2.3.1 Vkládání webových prostředků...................... 4 2.3.2 Předání řízení dalšímu webovému prostředku.............. 5 2.4 Filtrování požadavků a odpovědí.......................... 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čky........................ 9 3.4 Akce.......................................... 11 3.4.1 JavaBeans................................... 11 3.5 Unified Expression Language............................ 13 3.5.1 Bezprostřední vyhodnocování výrazů................... 14 3.5.2 Odložené vyhodnocování výrazů..................... 14 3.6 JSP Standard Tag Library.............................. 14 3.6.1 knihovna značek Core............................ 15 3.6.2 knihovna značek XML............................ 16 3.6.3 knihovna značek Internationalization................... 16 3.6.4 knihovna značek SQL............................ 16 3.6.5 knihovna značek 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 Řídící část (Controller)............................ 25 5.2 JSTL a filtrování požadavků............................. 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ů............................ 28 5.3 Práce s databází.................................... 29 5.3.1 Vytvoření databáze.............................. 30 5.3.2 Rozšíření modelu aplikace.......................... 30 5.3.3 Řízení databázových požadavků...................... 31 5.4 Uživatelské značky.................................. 32 5.4.1 Rozšíření modelu aplikace.......................... 34 6 Webová aplikace LogoArena.cz.............................. 35 6.1 Účel a 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 Řídící část (Controller)............................ 37 6.4 Propojení se SMS platebním systémem....................... 37 7 Závěr............................................. 39 Literatura............................................. 41 Rejstřík.............................................. 42 A Přiložené CD - obsah a zprovoznění aplikací..................... 43 vi

Kapitola 1 Úvod Cílem práce je seznámit čtenáře s technologií JSP, demonstrovat některé postupy při tvorbě webové aplikace a ukázat jejich použití. Není možné v rozsahu bakalářské práce komplexně popsat JSP technologii, tudíž je tato práce pojata tak, aby představila vybrané nástroje do té míry, do jaké je třeba jim rozumět, aby byl s nimi čtenář schopen vybudovat analogickou webovou aplikaci, jež tvoří praktickou část této bakalářské práce. Můžeme se setkat s řadou softwarových nástrojů (např. JSF, Struts, Stripes a další. ), které vývoj aplikcí v Javě usnadňují. Nicméně vývoj nových technologií jde vysokým tempem kupředu a objevují se nové nástroje překonávající ty minulé. Proto není cílem této práce určit tu pravou a nejlepší cestu jak tvořit webové aplikace v Javě, nýbrž popsat základní principy návrhu aplikace, jejichž znalost lze s úspěchem využít i pro pochopení a používání nadstavbových technologií. Praktickou část této bakalářské práce tvoří webová aplikace, která bude v praxi používána jako internetový obchod se software pro mobilní telefony. Aplikace respektuje návrhový vzor Model-Pohled-Řídící část (často se lze setkat s anglickým ekvivalentem Model- View-Controller). Skládá se z několika řídících servletů, 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 databáze MySQL. Webová aplikace bude umístěna na server dostupný pod URL http://logoarena.cz. Obsah, který má být předmětem obchodování, podléhá autorským právům různých právních subjektů. Internetový obchod může tedy být v plné míře spuštěn až po vyřešení těchto právních záležitostí. Samotné doručení softwaru na mobilní telefon zajistí firma zabývající se touto problematikou, tedy takzvanými mikroplatbami, kdy platba je zahrnuta v ceně textové zprávy, jíž je požadovaný objekt objednáván. Poslední krok pro zkompletování celé aplikace je provázání již funkčního informačního systému a této mikroplatební služby. Tato fáze nespadá do rozsahu zadání bakalářské práce. Některé z mikroplatebních společností však (za určitý příplatek) nabízí vlastní zajištění tohoto propojení. Více informací o této problematice nabízí kapitola 6.4. 1

Kapitola 2 JavaServlets JavaServlets jsou platformově nezávislé moduly pro obsluhu protokolu HTTP na straně serveru. Z technického hlediska je servletem každá java třída, která implementuje rozhraní javax.servlet.servlet. Servlety tvoří základní stavební jednotky, na kterých jsou vystavěny další vrstvy webových java aplikací. Jedná se o nízkoúrovňový nástroj, s jehož pomocí lze obsloužit jakýkoliv HTTP požadavek a vygenerovat libovolnou odpověd. Pro přímé generování HTML stránek,tedy zajištění prezentační vrstvy aplikace, se však jedná o nástroj dosti těžkopádný. Proto jsou k dispozici nadstavby, především JSP. Servlety však své uplatnění nachází ve webových aplikacích v roli řídícího členu. 2.1 Životní cyklus servletu Životní cyklus servletu se dá popsat následujícími tezemi. 1. Web kontejner nahraje třídu sevletu. Web kontejnerem je míněn webový server, který podporuje vykonávání servletů (např. Tomcat, JBoss, GlassFish aj.). 2. Kontejner volá metodu init(). Tato metoda inicializuje servlet a je volána dříve, než může být obsloužen jakýkoliv příchozí požadavek. V životním cyklu servletu je metoda init() volána pouze jednou. 3. Po inicializaci může servlet obsluhovat klientské požadavky. Každý požadavek je obsluhován v odděleném vlákně. Pro každý požadavek volá kontejner metodu service(). 4. Pokud kontejner potřebuje odstranit servlet, zavolá metodu destroy(). Tato metoda je stejně jako init() volána během životního cyklu servletu pouze jednou. 2.2 Sdílení informací Webové komponenty, jakož i většina objektů, obvykle při plnění svých funkcí navzájem spolupracují. Pod výrazem webová komponenta či webový prostředek je, v tomto případě, myšlen bud servlet, html soubor nebo JSP soubor. Spolupracující webové komponenty sdílí informace prostřednictvím objektů, které mohou nabývat jednoho ze čtyř rozsahů platnosti. 2

2.2. SDÍLENÍ INFORMACÍ Pro rozsah platnosti se obvykle používá anglický výraz scope. Doménu těchto hodnot popisuje tabulka 2.1. Scope Třída Dostupnost objektu z application javax.servlet.servletcontext webové komponenty uvnitř aplikace session javax.servlet.http.httpsession webové komponenty, které obsluhují požadavek patřící sezení (session) request javax.servlet.servletrequest webové komponenty obsluhující požadavek page javax.servlet.jsp.pagecontext JSP stránky, která objekt vytvoří Tabulka 2.1: Rozsah platnosti objektů Pro sdílení informací lze využít v podstatě jen první tři objekty z tabulky 2.1. Application session a request. Data uložená v application mají platnost po celou dobu běhu webové 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ěnná s rozsahem platnosti page je jednoduše implementována jako lokální proměnná v servletu a na rozdíl od ostatních tří objektů není přímo využitelná pro sdílení dat mezi jednotlivými webovými prostředky. Pro nastavování hodnot proměnných se využívá metoda setattribute. Komplementární metodou pro získání hodnoty proměnné z objektu je getattribute. Tyto metody jsou volány vždy na jednom z uvedených objektů z tabulky 2.1 v závislosti na požadovaném rozsahu platnosti proměnné. 2.2.1 Rozsah platnosti application Objekt s rozsahem platnosti application lze použít u proměnné, která má mít stejnou hodnotu pro všechny uživatele dané webové stránky. Např. on-line monitor návštěvníků. Kontext, ve kterém webové komponenty vykonávají svou činnost, je technicky vzato, objekt, který implementuje rozhraní ServletContext. Přístup k webovému kontextu (application scope) zajišt uje metoda getservletcontext. Ukázka části kódu servletu popisuje situaci, kdy je z požadavku (request) získáno sezení (session) a z něj application. Metoda setattribute předá proměnnou onlinemonitor k dispozici pod názvem online jiné webové komponentě. Předání řízení webové komponentěv rozsahu aplikace zajišt uje metoda forward objektu RequestDispatcher. Více informací o předávání ří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.2.2 Rozsah platnosti session 2.3. VOLÁNÍ DALŠÍCH WEBOVÝCH PROSTŘEDKŮ Mnoho aplikací vyžaduje vzájemné propojení skupiny požadavků od jednoho klienta. Jelikož http protokol patří do skupiny bezstavových, musí tento stav, nazývaný sezení (session), udržovat webová aplikace. Sezení jsou reprezentována objektem HttpSession. Přístup k session vede přes objekt třídy HttpRequest, voláním jeho metody getsession. Tato metoda vrací současnou session asociovanou s požadavkem. Pokud požadavek nemá žádnou session, vytvoří se nová. V následujícím výpisu kódu servletu je objekt username přiřazen do stejnojmenné proměnné, která bude přístupná po dobu trvání sezení daného uživatele. Poslední příkaz předá řízení stránce index.jsp včetně objektů request, 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 části servletu předá ří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ředků Webová komponenta může přímo vyvolat další webový prostředek během svého vykonávání dvěma způsoby: Obsah jiného prostředku může do sebe vložit (include) nebo může předat (forward) požadavek jinému prostředku. Aby bylo možné volat jiný prostředek, je nutné nejprve obdržet objekt RequestDispatcher voláním metody getrequestdispatcher("url"). Argument URL ukazuje na daný webový prostředek. 2.3.1 Vkládání webových prostředků Mnohdy je užitečné vložit do těla webové stránky další webový prostředek, např. reklamní banner, informaci o autorských právech apod. Toho lze dosáhnout voláním metody include patřící objektu RequestDispatcher. RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher("/banner"); if (dispatcher!= null) dispatcher.include(request, response); Vložená komponenta má přístup k objektům request a response. 4

2.3.2 Předání řízení dalšímu webovému prostředku 2.4. FILTROVÁNÍ POŽADAVKŮ A ODPOVĚDÍ K předání řízení jiné webové komponentě je třeba volat metodu forward patřící objektu RequestDispatcher. Tato technika se používá typicky pro přesměrování na JSP stránku, které se předají i atributy request a response. Webová aplikace může tedy pracovat tak, že uživatel prostřednictvím webové stránky pošle požadavek servletu, ten jej obslouží a výsledek předá další webové stránce. S využitím znalostí o sdílení informací mezi webovými prostředky lze vytvořit praktickou konstrukci komunikace servletu s dalším webovým prostředkem. Ukázková část kódu servletu zjistí aktuální datum a předá řízení JSP stránce, na které se pak tato informace může uplatnit. Pozn.: Předaný 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ů a odpovědí Filtr je objekt, který může transformovat jak hlavičku, tak obsah požadavku (request) či odpovědi(response). Filtry se od webových komponent liší tím, že samy obvykle nevytváří odpověd (response). Na druhou stranu, filtr poskytuje funkcionalitu, která může být připojena k jakémukoliv webovému prostředku. Z tohoto důvodu by filtr neměl mít žádnou závislost na webovém prostředku, pro který plní funkci filtru, aby si zachoval vlastnost slučitelnosti s jinými druhy webových prostředků. Mezi hlavní úkoly filtru patří: předzpracovat požadavek blokovat zpracování požadavku a odpovědi modifikovat data hlavičky požadavku modifikovat data hlavičky odpovědi komunikovat s vnějšími zdroji Mezi typická využití filtrů patří např. autentizace, logování, konverze obrázků, komprese dat, šifrování či XML 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řena jakýmkoliv textovým formátem (jako např. HTML, SVG, WML a XML) a JSP elementy tvořící dynamický obsah. Životní cyklus JSP má dvě důležité fáze. 1. překlad 2. zpracování požadavku V první fázi je JSP stránka přeložena na servlet a zkompilována. Ve druhé fázi již obsluhuje požadavky jakožto servlet stejně jako popisuje kapitola 2.1. 3.1 Struktura JSP stránky Z elementů na JSP stránce není žádný sám o sobě povinný. 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áře <%... %> Komentář je při překladu na servlet ignorován. deklarace <%!... %> Kód je vložen do těla třídy servletu mimo metodu service. direktivy <%@ taglib.. %> <%@ page.. %> <%@ include.. %> Zpřístupňuje vnější knihovny značek. Definuje globální nastavení JSP stránky. Určuje soubor 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 <jsp:... > Různým způsobem ovlivňují 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žňují používat příkazy programovacího jazyka uvnitř JSP stránky. K jejich typickým užitím patří vytváření objektů, metod a přístup k nim. Většina případů vyžadujících použití skriptovacích elementů může být eliminována použitím uživatelských značek či JSP standard tag library. Jedním z cílů JSP je oddělit statická data od kódu potřebného pro generování dynamického obsahu. Proto je vysoce nedoporučované tyto elementy používat. Implicitní skriptovací jazyk v JSP je java, nicméně lze používat i jiné programovací jazyky. Stačí nastavit atribut language v direktivě page na začátku JSP stránky. <%@ page language="scripting-language" %> 3.2.1 Deklarace JSP deklarace slouží k deklarování proměnných a metod. V případě použití skriptovacího jazyka java, se deklarace v JSP stanou deklaracemi v servletu, na nějž se JSP stránka překládá. Obecný tvar deklarace vypadá následovně: <%! 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ůže obsahovat libovolný platný fragment kódu. Při užití javy jako skriptovacího jazyka se příkazy obsažené ve scriptletu vloží do metody service příslušící servletu, na nějž je JSP stránka přelož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ůže obsahovat atributy, které uvádí tabulka 3.2: Atribut language extends import session buffer autoflush isthreadsafe info errorpage iserrorpage contenttype Popis Specifikuje jazyk, v jakém je JSP napsána. Výchozí hodnota je java a většina servlet kontejnerů ani jiné jazyky neumí. Má stejnou funkci jako u tříd, nastavuje předka. Opět stejná funkce jako u tříd, dovoluje používat třídy i bez názvu balíku. Definuje, jestli bude mít JSP přístup k objektu session. Výchozí hodnota je true. Definuje, jestli má JSP používat buffer. Velikost určuje číselná hodnota, která značí velikost v kilobytech. Pokud není žádoucí používat buffer, je třeba zvolit hodnotu none. Výchozí hodnota je 8 kb. Definuje, jestli se bude buffer odesílat sám (true) nebo jestli se bude provádět flush (false) podle určení programátora. Výchozí hodnota je true. Definuje, jestli může být stránka spuštěna více klienty najednou (true) nebo jestli mají stát ve frontě (false). Výchozí hodnota je true. Obdoba metody getservletinfo. Specifikuje URL, na které bude stránka přesměrována, pokud neodchytnete výjimku. Definuje, jestli je tato stránka cílem z definice errorpage. Pokud je true, pak má stránka další implicitní objekt exception, což je neodchycená výjimka. Definuje typ odpovědi (text/html) a její kódová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čná tím, že se může objevovat kdekoli v souboru JSP. Atribut file definuje soubor, který se includuje ještě předtím, než se přeloží 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ě: <%@ include file="relative url" %> Jelikož direktiva include vkládá soubor do stránky před jejím přeložením, tak v případě změny vloženého souboru, je třeba znovu přeložit všechny JSP stránky, které na tento soubor odkazují. Proto je efektivní tuto direktivu použít v případě, kdy se vkládaný soubor často nemění. Pokud se vkládaný soubor mění častěji, tak že není výhodné vždy překládat všechny odkazující JSP stránky, nabízí se alternativa použití akce: <jsp:include page="relative url" /> Tato akce vkládá soubor do JSP až v momentě, kdy je požadována. 3.3.3 Direktiva taglib Direktiva taglib umožňuje používat další značky (tagy), než jen ty, které nabízí HTML či základní sada JSP akcí. Tyto značky se obvykle označují výrazem uživatelské (custom tags). Jedná se o silný nástroj, pomocí něhož lze elegantně tvořit dynamicky generovaný obsah webových sránek. 3.3.3.1 Uživatelské značky Pomocí této technologie lze vytvořit vlastní značky, které mohou vykonávat stejnou práci jako scriptlety. Tag ale stačí nadefinovat jen jednou, a pak už se dá i opakovaně používat. Tyto značky může používat i někdo, kdo nemá ani ponětí, co je to java (autor html, grafik,...). Oproti scriptletům nemíchají uživatelské značky HTML s útržky Java kódu dohromady, čímž se lze vyhnout vysoce nepřehlednému a těžko udržovatelnému zdrojovému textu. V mnoha případech není třeba vytvářet vlastní značky, ale porozhlédnout se na internetu, zdali již potřebnou funkcionalitu někdo dříve do uživatelské značky nezapouzdřil. Tímto způsobem jsou dostupné spousty hotových značek s velmi širokou škálou funkcí. Na druhou stranu nutno dodat, že není vhodné webovou aplikaci vystavět způsobem, kdy řada JSP stránek bude protkána uživatelskými značkami, zajišt ujícími aplikační logiku. Existují lépe udržovatelnější a přehlednější návrhy webových aplikací. Více v kapitole 4. JSP uživatelské značky jsou v podstatě obyčejné javovské třídy, které mají za předka třídu javax.servlet.jsp.tagext.tagsupport nebo javax.servlet.jsp.tagext.bodytagsupport. První z nich nemají tělo, tzn. že značka vypadá obecně takto: <prefix:jméno atributy /> Ve druhém případě tělo mají: <prefix:jméno atributy >... tělo... </prefix:jméno > 9

3.3. DIREKTIVY JSP Pro vytvoření vlastní značky je nezbytné udělat 3 věci: 1. Napsat javovskou třídu provádějící požadovanou funkci značky. Např: 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čky, jejich parametry a vztahy mezi nimy. Je v XML formátu a má koncovku tld. <?xml version="1.0"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.1</jsp-version> <short-name>tag</short-name> <tag> <name>simpleexample</name> <tag-class>mypackage.simpleexampletag</tag-class> </tag> </taglib> 3. Informace o tag library descriptoru vložit do souboru web.xml, konkrétně do elementu web-app <taglib> <taglib-uri>tag</taglib-uri> <taglib-location>/web-inf/simpleexampltag.tld</taglib-location> </taglib> Použití takto definované uživatelské značky vypadá v JSP stránce následovně: 10

3.4. AKCE <%@page contenttype="text/html"%> <%@taglib uri="simpleexampltag.tld" prefix="mytag"%> <html> <head><title>jsp Page</title></head> <body> <mytag:simpleexample/> </body> </html> 3.4 Akce JSP akce využívají konstrukcí jazyka XML. Umožňují dynamicky vložit do stránky jiný soubor, používat JavaBeans komponenty, přesměrovat uživatele na jinou stránku či generovat HTML pro java pluginy. Obecný tvar použití akce vypadá: <jsp: jméno_akce atributy > JSP technologie nabízí k použití akce uvedené v tabulce 3.3 3.4.1 JavaBeans JavaBeans jsou java třídy, které mají konkrétně definovanou strukturu. Za JavaBean komponentu se může prohlásit každá třída, která: Obsahuje konstruktor bez parametrů. Implementuje rozhraní java.io.serializable. Má své členské proměnné private a dovoluje k nim přistupovat pomocí get/set metod. JavaBeans komponenty jsou zajímavé tím, že jdou jednoduše připojit na 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ě neexistuje, vytvoří se nová a uloží se jako atribut scope objektu. JavaBeans lze používat ve více JSP najednou. Její kód stačí napsat pouze jednou, a ten pak dle potřeby využívat. Mimo to, oproti servletům jdou podstatně lépe debugovat. Ke každému atributu třídy beanu lze přistupovat přes get/set metody. Při použití v JSP stránce plní tuto práci akční značky getproperty/ setproperty. Jiný způsob, jak získat z JavaBean komponenty její vlastnost, je použít místo značky getproperty výraz Expression Language. Není pak potřeba deklarovat na stránce použití beanu pomocí značky usebean. Proto je tento způsob získávání vlastností z JavaBeans preferovaný. Přístup k vlastnosti JavaBeanu vypadá takto: ${packages.classname.property} 11

3.4. AKCE Akce jsp:attribute jsp:body jsp:element jsp:expression jsp:fallback jsp:forward jsp:include jsp:usebean jsp:getproperty jsp:setproperty jsp:param jsp:params jsp:plugin jsp:text Popis Dovoluje definovat hodotu značky attribute v těle XML elementu namísto jejího definování v atributu XML značky. Specifikuje tělo značky. Dynamicky generuje XML element. Obsahuje výraz, který je platný v použitém skriptovacím jazyku pro danou JSP stránku. Obdoba <%= výraz >. Textová zpráva, která se má zobrazit uživateli při neúspěšném zobrazení pluginu. Předá řízení určenému webovému prostředku. Vloží do stránky statický soubor nebo výsledek jiné webové komponenty. Instanciuje bean s určeným rozsahem platnosti. Vloží hodnotu vlastnosti daného beanu do výsledku. Nastaví hodnotu vlastnosti či hodnoty vlastností příslušného beanu. Parametr a hodnota, která má být předána appletu nebo beanu. Parametry a hodnoty, které mají být předány appletu nebo beanu. Vyvolá spuštění appletu nebo beanu. Pokud není plugin dostupný, vyvolá dialog pro stažení potřebného software. Používá se pro šablonová data. Tabulka 3.3: JSP akce Následující příklad popisuje realizaci počítadla přístupů na 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ňuje ukázka následujícího kódu. <%@ page contenttype="text/html; charset=iso-8859-1" %> <html> <head> <jsp:usebean id="counterbeanid" scope="application" class="example.counterbean" /> <title>javabean Test</title> </head> <body> <p>jsp with JavaBean</p> <p> Number of visits of this page: <jsp:getproperty name = "CounterBeanId" property = "increment" /%> </p> </body> </html> Za povšimnutí stojí, že JavaBean komponenta je uložena v rozsahu platnosti application, tudíž je společná pro všechny návštěvníky strá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řený pro technologii Java Server Faces. Expression Language představený v JSP 2.0 dovoluje používání jednoduchých výrazů k dynamickému čtení dat z JavaBeans komponent. Expression Language používaný v Java Server Faces nabízí odkládání evaluace výrazů, data nejen číst, ale i měnit, a možnost volat metody. Unifikovaný Expression Language tedy nabízí: Dynamicky číst data uložená v JavaBeans komponentách, různých datových strukturách a implicitních objektech. Dynamicky zapisovat data (např. vstupní data ve formulářích, do JavaBeans komponent). Volat static a public metody. Dynamicky vykonávat aritmetické operace. 13

3.6. JSP STANDARD TAG LIBRARY Okamžité vyhodnocení výrazu při překladu JSP stránky nebo odložené vyhodnocení výrazu později při požadavku na výraz. Pro přístup ke konkrétním proměnným využívají výrazy tečkovou notaci. Např. ${user.name} Syntaxe použití Unified Expression Language závisí na tom, zda požadujeme evaluaci výrazu bezprostřední, tedy při překladu JSP stránky na servlet, nebo odloženou. 3.5.1 Bezprostřední vyhodnocování výrazů Bezprostředně vyhodnocované výrazy používají syntaxi : ${ výraz } Tento výraz může být používán jako hodnota atributu značky použité v JSP. Vyhodnocované hodnoty jsou pouze pro čtení. Příklad použití v obecné značce: <prefix:sometag value="${expression}"/> 3.5.2 Odložené vyhodnocování výrazů Syntaxe výrazů, jejichž vyhodnocení neprobíhá již v překladu JSP stránky, vypadá následovně: #{ výraz } Takto zapsaný výraz může bý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ček, která zapouzdřuje běžné funkce využívané v JSP aplikacích. Tato standardizace umožňuje umístění aplikace využívající JSTL na jakýkoliv JSP kontejner podporující JSTL. U takovéto aplikace je vyšší pravděpodobnost, že použité značky jsou implementovány optimálně. Lépe než značky se stejnou funkcionalitou od jiného dodavatele. JSTL nabízí pět knihoven značek zaměřujících se na různé oblasti užití. Tabulka 3.4 shrnuje jednotlivé knihovny. Přestože JSTL nabízí knihovnu značek pro práci s databází pomocí jazyka SQL, nedoporučuje se používat. Argumentem podkládajícím toto tvrzení je fakt, že aplikace přistupující k databázi z JSP stránky přes značky porušuje návrh aplikace Model-View-Controller. Možnosti JSP Standard Tag Library lze plně využít při spoluprá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ěnnými, větvení, 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 řetězci a kolekcemi Tabulka 3.4: JSP Standard Tag Library 3.6.1 knihovna značek Core Inicializace knihovny Core vypadá následovně: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> K práci s proměnnými slouží značky set a remove. První z nich nastavuje hodnotu proměnné EL nebo vlastnost proměnné EL v jednom z rozsahu platnosti (page, request, session nebo application). Pokud proměnná ještě neexistuje, je vytvořena. Např. <c:set var="somevariable" scope="session" value="..."/> Pro odstranění proměnné EL lze využít značku remove. <c:remove var="somevariable" scope="session" /> Pro větvení programu slouží značky choose a if. Cykly obstarávají foreach a fortoken. Názorné použití ukazuje níže uvedený příklad: <c:choose > <c:when test="${(amount > 1) and (amount < 5)}" > <c:foreach var="i" begin="1" end="${amount}" step="1"> <c:out value="${list[i]}" /> </c:foreach > </c:when > <c:otherwise > <p>more than 5</p> </c:otherwise > </c:choose > Bezpečný způsob, jak vypsat hodnotu proměnné, je přistoupit na implicitní objekt JSP stránky out pomocí standardní značky. <c:out value="${ výraz }"/> 15

3.6. JSP STANDARD TAG LIBRARY 3.6.2 knihovna značek XML Knihovna XML nabízí tři sady značek. XML Core, XML Flow Control a XML Transformation. JSTL XML značky používají pro přístup k obsahu XML dokumentu výrazy jazyka XPath. Rovněž nabízí XSLT transformace. Načtení značek do paměti zajistí volání direktivy taglib. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> 3.6.3 knihovna značek Internationalization Tato knihovna nabízí přizpůsobení stránky lokálnímu nastavení počítače. Vytváření zpráv zavislých na tomto nastavení, formátování a analyzování datových elementů, ke kterým patří čísla, měna, data, čas apod. Základem internacionalizace je lokalizační kontext obsahující proměnné locale a resource bundle. Nastavení locale specifikovaného klientem lze přepsat pomocí značky setlocale. Pomocí značek setbundle a bundle se nastavuje resource bundle, což je místo s uloženými texty v daném konkrétním jazyce. Pro výstup lokalizovaného řetězce na obrazovku prohlížeče slouží značka message. Následující příklad ukazuje, jakým způsobem zobrazit datum a čas v podobě odpovídající lokálnímu nastavení prostředí. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>... <jsp:usebean id="nowtime" class="java.util.date" /> <jsp:setproperty name="nowtime" property="time" value="${now.time + 432000000}" /> <fmt:message key="shipdate"/> <fmt:formatdate value="${nowtime}" type="date" datestyle="full"/> 3.6.4 knihovna značek SQL Používání knihovny značek SQL porušuje návrhový vzor aplikace Model-View-Controller, tudíž není doporučeníhodné ji používat. Databázové operace jsou normálně zapouzdřeny v JavaBeans komponentách. 3.6.5 knihovna značek Functions Tato knihovna disponuje značkou length, která vrací délku libovolné kolekce podporované značkou c:foreach. Aplikovaná na String vrací počet znaků řetězce. Dalších patnáct značek nabízí nejrůznější manipulace s daty právě typu String. Inicializace knihovny Functions 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č jako rozhraní pro komunikaci s uživatelem. Využívá schopnost prohlížeče zobrazovat HTML obsah. Takováto aplikace disponuje zásadní výhodou, že uživatel ji nemusí instalovat a v případě jejího umístění na internetu ji má dostupnou z libovolného počítače ( s připojením na internet a instalovaným webovým prohlížečem ). Díky podpoře CSS, JavaScriptu, XMLHttpRequestu, DOM či možnosti plug-inů současných webových prohlížečů lze budovat tzv. rich internet application (RIA). RIA se vyznačuje tím, že dokáže poskytnout podobné možnosti, jako tradiční desktopová aplikace. Obvykle přenáší procesní data pro uživatelské rozhraní k webovému klientovi, ale určitou část dat ponechává na aplikačním serveru. Stupnici mezi prostou webovou aplikací a RIA vyplňují aplikace s různými stupni 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 účelu má aplikace sloužit. Obecně lze tyto požadavky shrnout v následujících bodech: Výkonnost: Například vystavení určitého počtu stránek za časovou jednotku ve veřejné části aplikace. Robustnost: Provozuschopnost aplikace i při selhání některých služeb. Škálovatelnost: Možnost distribuovat služby, zvýšit výkon aplikace v případě potřeby. Udržovatelnost a rozšiřitelnost: Možnost nadále rozšiřovat aplikaci o další funkcionality a udržovat ji. Bezpečnost: Dostatečná bezpečnost aplikace vzhledem k účelu, ke kterému slouží. Uživatelská přívětivost: Spočívá obvykle v dobrém návrhu GUI. Podle účelu aplikace je třeba se zaměřit na odpovídající body. Neznamená to ovšem, že každá webová aplikace by měla v maximální míře všechny výše uvedené body splňovat. V praxi se vždy jedná o kompromis mezi náklady na její realizaci a požadovanou funkcionalitou. 17

4.2. ARCHITEKTURA APLIKACE 4.2 Architektura aplikace Architektura znamená podle [9] a [7] všeobecné označení určující celkovou strukturu a základní konstrukci částí nebo kompletního počítačového systému. V případě architektury webové aplikace se dá mluvit o způsobu rozdělení aplikace (jako jsou aplikační data, procesy, datové toky) do logických celků, stanovení vzájemných vztahů a interakcí mezi nimi. To vše s rozumnou mírou obecnosti. K návrhu aplikace se vyplatí přistupovat s rozmyslem a věnovat mu dostatek času. Jedná se o prvotní fázi vzniku aplikace, jejíž pozdější modifikace stojí neúměrně velké množství prostředků. At už ve formě pracovní energie či finančních prostředků. Při budování JSP aplikací jsou nejznámější dva způsoby, kterými lze k návrhu přistoupit. Obvykle jsou uváděny pod názvy Model 1 a Model 2. 4.2.1 Model 1 V architektuře Model 1 jsou samotné JSP stránky zodpovědné za obsluhování požadavků od klienta. Existuje zde oddělení prezentační vrstvy od obsahu, nebot přístup k datům zajišt ují JavaBeans. Řízení založené na této architektuře je decentralizované, nebot aktuální zobrazovaná JSP stránka určuje, jaká ze stránek bude zobrazena následně. Model 1 může být vhodný pro jednoduché aplikace, nicméně nedostatečný pro většinu aplikací, jež chtějí dostát požadavkům jako jsou např. dobrá udržovatelnost či rozšiřitelnost. Schéma funkce nastiňuje obrázek 4.1 Obrázek 4.1: Model 1 4.2.2 Model 2 Architektura Model 2, často nazývaný jako Model-View-Controller (MVC), spojuje výhody servletů a JSP stránek. Jedná se o návrh aplikace respektující oddělení řídící logiky, dato- 18

4.2. ARCHITEKTURA APLIKACE vého modelu a uživatelského rozhraní. Servlet se chová jako řídící část odpovídající za obsluhu požadavků a vytváření beanů užívaných v JSP. V JSP samotné není žádná řídící logika. Úloha JSP stránek spočívá pouze v zobrazování informací z objektů a beanů vytvářených servletem, či jejich zakomponování do statického obsahu stránky. Model by měl tzv. odrážet obraz reálného světa. Tvoří jej tedy třídy modelující objekty používané v aplikaci, tak aby byly nezávislé na ostatních vrstvách aplikace. Důvody proč použít MVC lze shrnout do dvou hlavních bodů: Znovupoužitelnost: pro opakující se problém není třeba vyvíjet nové řešení, ale přizpůsobit příslušnou část aplikace novým potřebám. Přehlednost: separování jednotlivých vrstev aplikace umožňuje snadnější orientaci v kódu a její udržovatelnost. Obrázek 4.2: Model 2 Aplikaci, navrženou podle MVC, znázorňuje obrázek 4.2. Aplikace běžící na aplikačním serveru tvoří tedy tři principiální části: Model (Model) reprezentuje informace a data, se kterými aplikace pracuje, včetně aplikační logiky pracující s těmito daty. V contextu J2EE aplikace se jedná o třídy s aplikační logikou, jako jsou např. javabeans apod. Pohled (View) tvoří uživatelské rozhraní, které zpřístupňuje informace a data modelu. Tuto roli přebírají JSP stránky. Řídící část (Controller) představuje řídící logiku aplikace. Reaguje na vzniklé požadavky (obvykle od uživatele) voláním příslušných metod modelu. Tuto úlohu přebírají servlety, někdy se jedná o jediný řídící servlet. 19

4.3. INTERNACIONALIZACE 4.3 Internacionalizace U mnohých webových aplikací by se mělo počítat s tím, že jejich uživatelé jsou příslušníky různých národů, z čehož vyplývá, že mluví různými jazyky, používají různé abecedy, zapisují určité údaje ve formátu odpovídajícímu jejich národním zvyklostem apod. Schopnost aplikace podporovat různé národní zvyklosti se nazývá internacionalizace. Výrazem lokalizace se pak rozumí podpora daného konkrétního národního prostředí. Všechny tyto třídy používají třídu Locale pro specifikaci jazyka či národních zvyklostí. Pro tyto účely nabízí java velmi kvalitní nástroje. Správné zobrazování časových údajů a čísel má na starosti třída DateFormat a NumberFormat. Třída TimeZone se stará o to, aby byl čas zobrazen správně, v závislosti na časové zóně, ve které se uživatel nachází. Třída ResourceBundle řeší nalézání a používání textů ve správném jazyce. Každá z těchto tříd se řídí třídou Locale určující aktuální jazyk či národní zvyklosti. Základním principem u lokalizovatelné aplikace je, aby texty nebyly přímo v kódu, ale uloženy externě v souborech typu.properties. Na ně se pak odkazuje pomocí klíčů. Výsledný zobrazený text se dohledá v závislosti na hodnotě objektu Locale. Tento přístup lze realizovat používáním třídy ResourceBundle. Aplikace LogoArena.cz je určena výhradně pro české prostředí a proto nepodporuje lokalizaci do jiných jazyků. Nicméně ukázková aplikace, která je součástí této práce, podporuje český 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 Účelem webových rámců ( anglicky web frameworks ) je zjednodušit a zproduktivnit vývoj aplikací. Při psaní různých webových aplikací vývojář zjistí, že určité části aplikce jsou víceméně stále stejné. Z tohoto faktu vychází smysl webových rámců. Vytvořit určitou šablonu aplikace, která se pak nakonfiguruje k obrazu vývojářových představ. Další výhodou webových rámců je, že využívají do značné míry osvědčené postupy, což je dobrým předpokladem k tomu, aby aplikace byla z hlediska architektury a rozvrstvení v pořádku. Mnoho webových rámců nabízí knihovny poskytující přístup k databázi, řeší problém autentifikace a autorizace, nabízí mapování URL na lidsky zapamatovatelné adresy, posytuje recyklovatelné šablony webových stránek a podobně. Většina webových rámců je založena na osvědčeném návrhovém vzoru Model-Vew-Controller, viz kapitola 4.2.2. Obecně lze webové rámce rozdělit na dvě skupiny: rámce orientované na zpracování HTTP požadavku rámce orientované na vizuální komponenty V následující části budou zmíněny jen ty nejznámější webové rámce. Pro javu jich totiž existuje poměrně velké 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ří zatím asi nejpoužívaňejší framework Apache Struts [1], který má i širokou podporu v mnoha vývojových prostředích. Dnes již je Struts překonán. K nevýhodám tohoto frameworku patří závislost na velkém množství konfiguračních souborů. Spring MVC [4] je dalším velmi populárním webovým rámcem.k jeho charakteristice patří, že je založen na Inversion of Control, tzn, že závislosti mezi třídami se zabývá webový kontejner, nikoliv samotné třídy. Umožňuje rovněž kombinovat další frameworky. Stripes [5] je nový webový rámec, jehož tvůrci si vzali poučení z negativních vlastností Struts i Spring. Jeho přednosti spočívají v možnosti držet pohromadě všechen kód obsluhující jednu stránku, a přitom nepotřebuje žádné konfigurační soubory, nebot využívá systém anotací zavedený v javě 5. 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ádstavbou nad JavaServlet API. Disponuje vlastní soustavou šablon, úzce provázanou s řídící částí aplikace. Java Server Faces [?] je webový rámec, jejž prosazuje tvůrce Javy, firma Sun. Významnou devizou je jeho přímé začlenění do standardu J2EE 5. Tímto má zaručenou kvalitní podporu v mnohých vývojových nástrojích. JSF je rovněž postaven přímo na JavaServlet API. Může, ale nemusí, používat JSP. 21

Kapitola 5 Ukázková webová aplikace V následujících podkapitolách bude vystavěna webová aplikace, která představuje jednoduchý informační systém. Aplikace bude vybudována pomocí JSP a JavaServlets technologií. K práci s daty se využije databáze MySQL. Účelem této webové aplikace je demonstrovat na přehledném příkaldu, jak lze přes webové rozhraní přistoupit k databázi, inteligentně zobrazit načtená data na obrazovku a jakým způsobem lze využívat proměnné napříč JSP 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ěte!" vylepšenou o možnost přidání vlastního jména k pozdravu, nicméně i tak lze na ní dobře demonstrovat 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ů na stránkách, jakým je například navigační menu. Jak vytvořit JavaBean komponentu a jak je možné pomocí EL přistupovat, k datům, které nese. Bude rovněž vysvětleno použití servletu zajišt ujícího řízení celé aplikace. 5.1.1 Model Model je zastoupen třídou, která splňuje parametry JavaBean komponenty. Jedná se o třídu, která pomocí svých privátních proměnných (tzv. vlastností) popisuje model osoby, jakožto objekt se kterým tato aplikace pracuje. Pro přehlednost, 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. Rovněž práce s tímto objektem spočívá v zapamatování zadaného jména a následném poskytnutí této informace, když je vyžadována. K tomuto účelu slouží get/set metody pro danou vlastnost, jimiž JavaBean komponenta disponuje. Nejlépe podpoří pochopení předešlého odstavce 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ět, jediná vlastnost této JavaBean komponenty se jmenuje name. Konstruktor je bez parametrů a přístup k 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ář, který vyzývá návštěvníka ke vložení svého jména. Druhá JSP stránka hellooutput.jsp zobrazuje pozdrav, ke kterému je připojeno jméno zadané do formuláře na úvodní stránce. Pro celou aplikaci je společné navigační menu. Aby se, v případě změny v menu, nemusely dělat opravy 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částí JSP stránky index.jsp. <%@page contenttype="text/html" pageencoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>ukazkova aplikace</title> <link href="ukazkovaaplikace1.css" rel="stylesheet" type="text/css" /> </head> <body> <%@ include file="menu.jsp" %> <div id="content"> <h2>welcome in example application!</h2> <p> <form method="post" action="mainservlet"> Enter your name: <input type="text" name="username" value="" /> <input type="submit" value="ok" /> </form> </p> <p> After submiting your name... </p> </div> </body> </html> 23

5.1. NÁVRH MODEL-VIEW-CONTROLLER APLIKACE Oproti klasické HTML stránce se tato JSP stránka liší na třech místech: Direktiva na prvním řádku <%@page contenttype="text/html" pageencoding="utf-8"%> definuje nastavení JSP stránky. Následující řádek s direktivou <%@ include file="menu.jsp" %> bude při překladu nahrazen kódem, který obsahuje soubor menu.jsp. Poslední zajímavost se nachází ve značce s formulářem. <form method="post" action="helloservlet"> Enter your name: <input type="text" name="username" value="" /> <input type="submit" value="ok" /> </form> Poté, co uživatel stiskne tlačítko OK, odešle se požadavek servletu HelloServlet.jsp. Zaslaný požadavek v sobě ponese parametr username. Po zpracování požadavku předá servlet řízení stránce hellooutput.jsp: <%@page contenttype="text/html" pageencoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>ukazkova aplikace</title> <link href="ukazkovaaplikace1.css" rel="stylesheet" type="text/css" /> </head> <body> <%@ include file="menu.jsp" %> <div id="content"> <h2>hello ${person.name}!</h2> </div> </body> </html> Řádek <h2>hello ${person.name}!</h2> 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áře. Na první pohled by se mohlo zdát,že přece není možné, aby se pomocí tečkové notace přistupovalo na proměnnou name, která má zabezpečení typu private. Nicméně zápisem ${person.name} se ve skutečnosti volá get metoda od proměnné name. Tímto způsobem se tedy praktikuje získávání dat z JavaBean komponent. Existuje ještě druhý způsob pomocí jsp akcí, ale využívání EL je více používané. 24

5.2. JSTL A FILTROVÁNÍ POŽADAVKŮ 5.1.3 Řídící část (Controller) Jako řídící jednotka této aplikace slouží servlet, konkrétně HelloServlet.java. Nejdůležitější metoda třídy servletu 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áře a odeslání požadavku na servlet zavolá zmíněná metoda. Jak je vidět, vytvoří se nová instance JavaBean komponenty se jménem person. Z objektu požadavku se získá parametr username a tato hodnota se uloží do JavaBeanu. 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ředáno ří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ů Ukázková aplikace 2 přidává k první verzi jazykové přizpůsobení aplikace pomocí knihovny JSTL. Princip spočívá v umístění textů mimo samotné stránky a JSP obsahuje pouze odkazy na daný text. Do jakého jazykového souboru je odkaz namířen závisí na nastavení systémové proměnné locale. Dále se v této kapitole předvede, jak je možné využívat knihovny JSTL a jak zapojit filtry na předzpracování uživatelských požadavků. 5.2.1 Internacionalizace v JSP Tato ukázková aplikace nabízí lokalizaci do dvou jazyků, a to češtiny a angličtiny. Po prvotním spuštění se aplikce přizpůsobí místnímu jazykovému nastavení klienta a mimo to je nabídnuta možnost ručního přepínání mezi těmito jazyky. Pro internacionalizaci v JSP je výhodné použít, k tomuto účelu navrž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" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> 25