VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage Část 3.
Vyřizování dotazů - include Webový server odpověď Servletový kontejner Servlet1 Servlet2 include dotaz
Vyřizování dotazů - forward Webový server odpověď Servletový kontejner Servlet1 Servlet2 forward dotaz
RequestDispatcher Pro vložení výstupu jiného servletu include(request, response) Pro přenechání zpracování forward(request, response) Parametry těchto metod jsou objekty dotazu (ServletRequest) a odpovědi (ServletResponse) stejné, jako předané aktuálním servletu instance obalových tříd ServletRequestWrapper a ServletResponseWrapper
Získání RequestDispatcher Řeší objekt třídy RequestDispatcher (dispečer) ServletContext::getRequestDispatcher(cesta) cesta je relativní ke kořeni kontextu aplikace a začíná / ServletRequest::getRequestDispatcher(cesta) cesta je relativní k aktuálnímu dotazu, nezačíná / ServletContext::getNamedDispatcher(název) předává se název servletu z aplikačního kontextu
Metoda include Vkládá výstup volaného servletu do předaného objektu odpovědi (response) Může být v rámci dotazu volána vícekrát K objektu dotazu má plný přístup Na objektu odpovědi může používat výstupní stream nebo writer nesmí měnit návratový kód, obsah ani počet hlaviček změny jsou ignorovány
Příklad – vložení hlavičky a patičky
Příklad – vložení hlavičky a patičky
Příklad – vložení hlavičky a patičky
Metoda forward Přenechává dokončení zpracování jinému servletu Možno volat pouze pokud ještě žádná data nebyla odeslána na klienta Jinak se vyhazuje výjimka IllegalStateException (viz Spec. 9.4) Před návratem je výstup z cílového servletu kontejnerem odeslán na klienta (commit) a uzavřen volající servlet pak už neřeší potvrzování obsahu
Příklad – forward
Příklad – forward
Posluchači Možnost zaregistrovat posluchače událostí v různých konextech, tzv. „scopes“ ServletContext - kontext celé aplikace HttpSession - kontext uživatelské relace ServletRequest - kontext dotazu Usnadňuje rozdělení logiky do tříd podle účelu (Separation of Concerns) Zvyšuje flexibilitu a rozšiřitelnost Od verze Java EE 6 je možné registrovat posluchače za běhu aplikace. (Dříve jen ve web.xml)
Posluchači ServletContext Životní cyklus Servletový kontext byl nahrán, nebo je nachystán k ukončení rozhraní javax.servlet.ServletContextListener Změny v atributech Atributy v kontextu byly přidány, odebrány či vyměněny rozhraní javax.servlet.ServletContextAttributeListener
Příklad ServletContextListener
Příklad ServletContextListener
Posluchači HttpRequest Životní cyklus javax.servlet.ServletRequestListener requestInitialized, requestDestroyed Změny v atributech javax.servlet.ServletRequestAttributeListener Asynchronní zpracování požadavku javax.servlet.AsyncListener onComplete, onTimeout
Posluchači HttpSession Životní cyklus Http session byla vytvořena, zneplatněna nebo vypršela javax.servlet.http.HttpSessionListener Změny v atributech Atributy v session byly přidány, odebrány či vyměněny javax.servlet.http.HttpSessionAttributeListener
Posluchači HttpSession Připojení/odpojení objektu k session (binding) Objekt byl připojen nebo odpojen ze session javax.servlet.http.HttpSessionBindingListener Neregistruje se ve web.xml. Migrace session Session byla aktivována, nebo se chystá k pasivaci javax.servlet.http.HttpSessionActivationListener Neregistruje se ve web.xml. Stačí samotný fakt, že třída implementuje rozhraní posluchače.
Příklad HttpSessionBindingListener
Příklad HttpSessionBindingListener
Př. HttpSessionActivationListener
Distribuované prostředí Všechny dotazy patřící do jedné relace jsou obslouženy ve stejném JVM Kontejner se však může rozhodnout provést tzv. migraci relace na jiný uzel clusteru load-balancing – rozložení zátěže mezi uzly fail-over – předání zpracování na jiný uzel v případě potíží na původním cílovém uzlu
Migrace session Load Balancer S1 S1 Uzel 1 Klient 1 Uzel 2
Migrovatelnost atributů relace Kontejner akceptuje všechny objekty-atributy, které implementují java.io.Serializable Kontejner se může rozhodnout pro migraci objektů, které nejsou serializovatelné, specifickým způsobem. Způsob migrace není specifikován. Session A1 A3 A2
Java Server Pages (JSP) Technologie pro generování dynamických webových stránek a dokumentů Např. HTML, XHTML, XML, SVG, WML (WAP) Statický obsah tvoří základ šablony Dynamický obsah se získává Java kódem vpisovaným do JSP – tzv. skriptlety odkazem na vlastnosti objektů ve formě Java Beans (EL2 výrazy - ${...}) prostřednictvím tzv. custom tagů
JSP - ukázka
JSP - výsledek
Životní cyklus JSP stránky Fáze překladu (translation phase) Kontejner vyhledá stránku Validace a kontrola syntaxe JSP a tagů Vytvoření implementační třídy JSP stránky obvykle servlet Běhová fáze (execution phase) Předávání objektů požadavku a odpovědi instanci implementační třídy JSP stránky
Syntaktické prvky Direktivy Akce Skriptovací prvky Poskytují informace pro fázi překladu Nemají přímý vztah ke zpracování dotazu stránkou <%@directive...%> Akce Deklarují, jak se má zpracovat dotaz. XML syntaxe. Standardní akce jsou specifikované Custom akce pomocí rozšiřujících tagů (tag extensions) Např. JSTL – JSP Standard Tag Library Skriptovací prvky výrazy, skriptlety, deklarace
Direktivy Syntax: <%@ directive { attr=”value” }* %> page taglib Definují vlastnosti generované stránky <%@ page contentType="text/html" language="java" %> taglib Deklaruje, že stránka používá knihovnu tagů. <%@ taglib uri="http://java.sun.com/jsf/html/" prefix="h" %> include Používá se pro vkládání textu nebo kódu z jiného souboru v době překladu. <%@ include file=”copyright.html” %>
Standardní akce XML reprezentace, elementy mají prefix jsp <jsp:useBean> Deklaruje proměnnou, jejíž hodnota je javovský objekt Lze určit rozsah, kde se objekt nachází Atributy id – jednoznačné ID v rámci JSP, deklarace skript. proměnné scope – rozsah, ve kterém se hledá instance beanu page (default), request, session, application class – třída Java beanu. Pokud není nalezen v zadaném rozsahu, vytvoří se. type – typ proměnné deklarované touto akcí
Standardní akce <jsp:getProperty> Čte hodnotu vlastnosti beanu a zapisuje ji na výstup Atributy name – název beanu, obvykle odpovídá id v <jsp:useBean> property – název vlastnosti beanu
Standardní akce - příklad
Standardní akce - příklad
Standardní akce <jsp:setProperty> Nastavuje hodnotu vlastnosti beanu Atributy name – název beanu, obvykle odpovídá id v <jsp:useBean> property – název vlastnosti beanu param – parametr v dotazu, jehož hodnota se použije value – hodnota vlastnosti, nelze uvádět současně s param <jsp:include>, <jsp:forward> Analogie metodám třídy RequestDispatcher include forward
Knihovny tagů Umožňují rozšířit sadu standardních akcí Doporučeno jako náhrada za skriptlety Typická užití Prosté akce Podmíněné zpracování Iterace Registrace posluchačů (např. v JSF) Existují dva typy tzv. tag handlerů Klasický Zjednodušený
Simple Tag Handler Náhrada za klasické tag handlery Velmi zjednodušuje vývoj vlastních knihoven tagů Dva způsoby implementace Java Základem je třída javax.servlet.jsp.tagext.SimpleTag, resp. SimpleTagSupport Určeno programátorům JSP Tag soubory Určeno neprogramátorům, např. tvůrcům webových stránek
HelloTag - Handler <hello message="Bye"/>
HelloTag – TLD knihovna Uloženo v souboru WEB-INF/mytaglib.tld
HelloTag – Použití v JSP
Tagové soubory Jednoduchý způsob, jak vytvořit nový tag soubor WEB-INF/tags/welcome.tag Tagové soubory se obvykle umisťují do adresáře WEB-INF/tags Import v JSP <%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> Použití: <my:welcome message="Vítejte!"/>
Skriptovací prvky - Scriptlety Skriptlety mohou obsahovat libovolný fragment skriptovacího jazyka Default Java Provádí se v čase dotazu Mohou a nemusí vytvářet výstupní data Kód skriptletu je uzavřen v bloku vymezeném <% scriptlet %>
Scriptlety - příklad
Scriptlety – implicitní objekty Objekty, které jsou deklarovány implicitně prostřednictvím proměnných na začátku stránky request, session, application, pageContext objekty rozsahů (scopes) pageContext je speciální kontext reprezentující JSP stránku response – objekt odpovědi page – objekt stránky out – výstupní proud (javax.servlet.jsp.JspWriter) config – konfigrace servletu generovaného ke stránce
Scriptlety – explicitní proměnné Deklarace beanu akcí <jsp:useBean id="bean"> zavádí proměnnou odpovídající hodnotě atributu id Viz příklad s výpisem čísel telefonů Deklarace pomocí speciální konstrukce <%! deklarace %> Deklarace globální proměnné (v podstatě atribut třídy) <%! int i = 0; %> Pozor v případě více souběžných dotazů! Synchronizovat! Deklarace metody <%! public String f(int i) { if (i<3) return(“...”); ... } %>
Výrazy Konstrukce <%= výraz > definuje výraz, který se po vyhodnocení v čase dotazu vypíše na výstup <%= "Dobrý den!" >
Expression Language – EL 2.1 Od uvedených skriptovacích technik se ustupuje Místo nich se doporučuje používat tagy a EL EL je navržen pro snadné sestavování výrazů nad aplikačními daty uloženými v Java beans Syntaxe: ${expression} ${1} ${"Welcome"} – vrací konstanty ${name} – vrací hodnotu proměnné name ${user.email} – vrací hodnotu vlastnosti email beanu v proměné user ${user.phone[0]} – vrací první prvek v seznamu telefonů
Expression Language – EL 2.1 Možno použít v těle stránky hodnota výrazu se vypíše na výstup v atributu tagu možno použít ve standardních i custom atribut musí povolovat runtime výrazy definuje se v popisovači knihovny tagů TLD prvkem <rtexprvalue>true/false<rtexprvalue>
EL - příklad
JSP dokumenty JSP dokumenty jsou JSP stránky psané v XML Tímto vyjádřením se získá řada výhod K editaci lze použít běžné XML editory Stránky lze validovat oproti schématu (DTD, XSD) Lze využít jmenných prostorů pro oddělení a vnoření různých obsahů Přehlednost
JSP dokument - příklad
JSP dokumenty – analogie s JSP Kořenový prvek je <jsp:root> Direktivy jsou vyjádřeny prvky <jsp:directive.XXX>, kde XXX je direktiva <jsp:directive.page contentType="text/html; utf-8"/> EL výrazy se používají obdobně Knihovny tagů se importují pomocí jmenných prostorů xmlns:c="http://java.sun.com/jsp/jstl/core" Skriptlety se píší do těla tagu <jsp:scriptlet>