Java Server Java Server PagesPages -...
Transcript of Java Server Java Server PagesPages -...
1
Java Server Java Server Java Server Java Server PagesPagesPagesPages
2
Java Server Java Server Java Server Java Server Java Server Java Server Java Server Java Server PagesPagesPagesPagesPagesPagesPagesPages
� Le JSP sono uno dei due componenti di base della Le JSP sono uno dei due componenti di base della Le JSP sono uno dei due componenti di base della Le JSP sono uno dei due componenti di base della
tecnologia J2EE, relativamente alla parte web:tecnologia J2EE, relativamente alla parte web:tecnologia J2EE, relativamente alla parte web:tecnologia J2EE, relativamente alla parte web:
� Sono template per la generazione di contenuto
dinamico
� Estendono HTML con codice Java custom.
� Quando viene effettuata una richiesta ad una JSP:Quando viene effettuata una richiesta ad una JSP:Quando viene effettuata una richiesta ad una JSP:Quando viene effettuata una richiesta ad una JSP:
� la parte HTML viene direttamente trascritta sullo
stream di output
� il codice Java viene eseguito sul server per la
generazione del contenuto HTML dinamico
� la pagina HTML così formata (parte statica e + parte
generata dinamicamente) viene restituita al client
� Sono assimilabili ad un linguaggio di Sono assimilabili ad un linguaggio di Sono assimilabili ad un linguaggio di Sono assimilabili ad un linguaggio di scriptingscriptingscriptingscripting: in : in : in : in
realtrealtrealtrealtàààà vengono trasformate in vengono trasformate in vengono trasformate in vengono trasformate in servletservletservletservlet dal containerdal containerdal containerdal container
3
JspServletJspServletJspServletJspServletJspServletJspServletJspServletJspServlet
� Le richieste verso JSP sono gestite da una particolare Le richieste verso JSP sono gestite da una particolare Le richieste verso JSP sono gestite da una particolare Le richieste verso JSP sono gestite da una particolare
servletservletservletservlet (in (in (in (in TomcatTomcatTomcatTomcat si chiama si chiama si chiama si chiama JspServletJspServletJspServletJspServlet) che effettua ) che effettua ) che effettua ) che effettua
le seguenti operazioni:le seguenti operazioni:le seguenti operazioni:le seguenti operazioni:
� traduzione della JSP in una servlet
� compilazione della servlet risultante in una classe
� esecuzione della JSP
� I primi due passi vengono eseguiti solo quando cambia I primi due passi vengono eseguiti solo quando cambia I primi due passi vengono eseguiti solo quando cambia I primi due passi vengono eseguiti solo quando cambia
il codice della JSPil codice della JSPil codice della JSPil codice della JSP
myJsp.jsp
HTML myJsp_jsp.class
myJsp_jsp.javatraduzione
compilazionenessun cambiamento dall’ultima traduzione
carica/esegue
4
Ciclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSPCiclo di vita delle JSP
� Dal momento che le JSP sono compilate in Dal momento che le JSP sono compilate in Dal momento che le JSP sono compilate in Dal momento che le JSP sono compilate in servletservletservletservlet, il , il , il , il
ciclo di vita delle JSP ciclo di vita delle JSP ciclo di vita delle JSP ciclo di vita delle JSP èèèè controllato dal web containercontrollato dal web containercontrollato dal web containercontrollato dal web container
JSP
Instantiation & loading: new
Initialization:jspInit()
Ready:_jspService(..request,..response
)
Destruction:jspDestroy()
Garbace collection:finalize()
Server shutdown
Client requests
5
ServletServletServletServletServletServletServletServlet e JSPe JSPe JSPe JSPe JSPe JSPe JSPe JSP
� Nella Nella Nella Nella servletservletservletservlet la logica per la generazione del la logica per la generazione del la logica per la generazione del la logica per la generazione del
documento HTML documento HTML documento HTML documento HTML èèèè implementata completamente in implementata completamente in implementata completamente in implementata completamente in
JavaJavaJavaJava
� Il processo di generazione delle pagine è tedioso e
soggetto ad errori (una sequenza di println())
� L’aggiornamento delle pagine è scomodo
� Le JSP nascono per facilitare la progettazione grafica Le JSP nascono per facilitare la progettazione grafica Le JSP nascono per facilitare la progettazione grafica Le JSP nascono per facilitare la progettazione grafica
e le le le l’’’’aggiornamento delle pagineaggiornamento delle pagineaggiornamento delle pagineaggiornamento delle pagine
� Si può separare agevolmente il lavoro fra grafici e
programmatori
� I web designer possono produrre pagine senza
dover conoscere i dettagli della logica server side
� La generazione di codice dinamico è implementata
sfruttando il linguaggio Java
6
ServletServletServletServletServletServletServletServlet o JSP?o JSP?o JSP?o JSP?o JSP?o JSP?o JSP?o JSP?
� Le JSP non rendono inutili le Le JSP non rendono inutili le Le JSP non rendono inutili le Le JSP non rendono inutili le servletservletservletservlet
� Le Le Le Le servletservletservletservlet forniscono agli sviluppatori delle forniscono agli sviluppatori delle forniscono agli sviluppatori delle forniscono agli sviluppatori delle
applicazioni web un completo controllo applicazioni web un completo controllo applicazioni web un completo controllo applicazioni web un completo controllo
delldelldelldell’’’’applicazioneapplicazioneapplicazioneapplicazione
� Se si vogliono fornire contenuti differenziati a seconda Se si vogliono fornire contenuti differenziati a seconda Se si vogliono fornire contenuti differenziati a seconda Se si vogliono fornire contenuti differenziati a seconda
di diversi parametri quali ldi diversi parametri quali ldi diversi parametri quali ldi diversi parametri quali l’’’’identitidentitidentitidentitàààà delldelldelldell’’’’utente, utente, utente, utente,
condizioni dipendenti dalla business condizioni dipendenti dalla business condizioni dipendenti dalla business condizioni dipendenti dalla business logiclogiclogiclogic, etc. , etc. , etc. , etc. èèèè
conveniente lavorare con le conveniente lavorare con le conveniente lavorare con le conveniente lavorare con le servletservletservletservlet
� Le JSP rendono viceversa molto semplice presentare Le JSP rendono viceversa molto semplice presentare Le JSP rendono viceversa molto semplice presentare Le JSP rendono viceversa molto semplice presentare
documenti HTML o XML alldocumenti HTML o XML alldocumenti HTML o XML alldocumenti HTML o XML all’’’’utenteutenteutenteutente
7
Come funzionano le JSPCome funzionano le JSPCome funzionano le JSPCome funzionano le JSPCome funzionano le JSPCome funzionano le JSPCome funzionano le JSPCome funzionano le JSP
� Ogni volta che arriva una Ogni volta che arriva una Ogni volta che arriva una Ogni volta che arriva una requestrequestrequestrequest il server compone il server compone il server compone il server compone
dinamicamente il contenuto della pagina dinamicamente il contenuto della pagina dinamicamente il contenuto della pagina dinamicamente il contenuto della pagina
� Ogni volta che incontra un Ogni volta che incontra un Ogni volta che incontra un Ogni volta che incontra un tagtagtagtag <%............%>
� valuta l’espressione Java contenuta al suo interno
� inserisce al suo posto il risultato dell’espressione
� Questo meccanismo permette di generare pagine Questo meccanismo permette di generare pagine Questo meccanismo permette di generare pagine Questo meccanismo permette di generare pagine
dinamicamente dinamicamente dinamicamente dinamicamente
8
Considerazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flussoConsiderazioni sul flusso
� Ricordiamoci come funziona HTTP e Ricordiamoci come funziona HTTP e Ricordiamoci come funziona HTTP e Ricordiamoci come funziona HTTP e qualqualqualqual’è’è’è’è la struttura la struttura la struttura la struttura
delle pagine HTMLdelle pagine HTMLdelle pagine HTMLdelle pagine HTML
� Il Client si aspetta di ricevere tutto il Il Client si aspetta di ricevere tutto il Il Client si aspetta di ricevere tutto il Il Client si aspetta di ricevere tutto il responseresponseresponseresponse headerheaderheaderheader
prima del prima del prima del prima del responseresponseresponseresponse body: body: body: body:
� la JSP deve effettuare tutte le modifiche all’header
(es: modifica di un cookie) prima di cominciare a
creare il body
� Una volta che il web server comincia a restituire la Una volta che il web server comincia a restituire la Una volta che il web server comincia a restituire la Una volta che il web server comincia a restituire la
risposta non può pirisposta non può pirisposta non può pirisposta non può piùùùù interrompere il processo, interrompere il processo, interrompere il processo, interrompere il processo,
altrimenti il browser mostra solo la frazione parziale altrimenti il browser mostra solo la frazione parziale altrimenti il browser mostra solo la frazione parziale altrimenti il browser mostra solo la frazione parziale
che ha ricevuto: che ha ricevuto: che ha ricevuto: che ha ricevuto:
� se la JSP ha cominciato a produrre output non si
può più effettuare un forward ad un’altra JSP
9
Esempio: Esempio: Esempio: Esempio: Esempio: Esempio: Esempio: Esempio: HelloHelloHelloHelloHelloHelloHelloHello worldworldworldworldworldworldworldworld
� Creiamo una Creiamo una Creiamo una Creiamo una jspjspjspjsp, denominata , denominata , denominata , denominata helloWorld.jsphelloWorld.jsphelloWorld.jsphelloWorld.jsp che che che che
realizza il classico esempio realizza il classico esempio realizza il classico esempio realizza il classico esempio ““““HelloHelloHelloHello World!World!World!World!”””” in modo in modo in modo in modo
parametrico:parametrico:parametrico:parametrico:
<html><body><% String visitor=request.getParameter("name");
if (visitor == null) visitor = "World"; %>Hello, <%= visitor %> !
</body></html>
<html><body>
Hello, World!</body>
</html>
http://myHost/myWebApp/helloWord.jsp http://myHost/myWebApp/helloWord.jsp?name=Mario
<html><body>
Hello, Mario!</body>
</html>
10
TagTagTagTagTagTagTagTag
� La parti variabili della pagina sono contenute La parti variabili della pagina sono contenute La parti variabili della pagina sono contenute La parti variabili della pagina sono contenute
allallallall’’’’interno interno interno interno tagtagtagtag speciali speciali speciali speciali
� Sono possibili due tipi di sintassi per questi Sono possibili due tipi di sintassi per questi Sono possibili due tipi di sintassi per questi Sono possibili due tipi di sintassi per questi tagtagtagtag::::
� Scripting-oriented tag
� XML-Oriented tag
� Le Le Le Le scriptingscriptingscriptingscripting----orientedorientedorientedoriented tagtagtagtag sono definite da delimitatori sono definite da delimitatori sono definite da delimitatori sono definite da delimitatori
entro cui entro cui entro cui entro cui èèèè presente lo presente lo presente lo presente lo scriptingscriptingscriptingscripting ((((selfselfselfself----containedcontainedcontainedcontained))))
� Sono di quattro tipi:Sono di quattro tipi:Sono di quattro tipi:Sono di quattro tipi:
� <%! %> Dichiarazione
� <%= %>Espressione
� <% %> Scriptlet
� <%@ %>Direttiva
11
XMLXMLXMLXMLXMLXMLXMLXML--------orientedorientedorientedorientedorientedorientedorientedoriented tagtagtagtagtagtagtagtag
� Le Le Le Le XMLXMLXMLXML----orientedorientedorientedoriented tagtagtagtag: seguono la sintassi XML. : seguono la sintassi XML. : seguono la sintassi XML. : seguono la sintassi XML.
� Sono presenti XML Sono presenti XML Sono presenti XML Sono presenti XML tagtagtagtag equivalenti ai delimitatori visti equivalenti ai delimitatori visti equivalenti ai delimitatori visti equivalenti ai delimitatori visti
nella pagina precedentenella pagina precedentenella pagina precedentenella pagina precedente
� Rispettivamente:Rispettivamente:Rispettivamente:Rispettivamente:� <jsp:declaration> declaration</jsp:declaration>
� <jsp:expression> expression</jsp: expression>
� <jsp:scriptlet> java_code</jsp:scriptlet>
� <jsp:directive. dir_type dir_attribute />
� Nel seguito useremo le Nel seguito useremo le Nel seguito useremo le Nel seguito useremo le scriptingscriptingscriptingscripting----orientedorientedorientedoriented tagtagtagtag che che che che
sono pisono pisono pisono piùùùù diffusediffusediffusediffuse
12
DichiarazioniDichiarazioniDichiarazioniDichiarazioniDichiarazioniDichiarazioniDichiarazioniDichiarazioni
� Si usano i delimitatori Si usano i delimitatori Si usano i delimitatori Si usano i delimitatori <%! e e e e %>per dichiarare variabili per dichiarare variabili per dichiarare variabili per dichiarare variabili
e metodie metodie metodie metodi
� Le variabili e i metodi dichiarati possono poi essere Le variabili e i metodi dichiarati possono poi essere Le variabili e i metodi dichiarati possono poi essere Le variabili e i metodi dichiarati possono poi essere
referenziati in qualsiasi punto del codice JSPreferenziati in qualsiasi punto del codice JSPreferenziati in qualsiasi punto del codice JSPreferenziati in qualsiasi punto del codice JSP
� I metodi diventano metodi della I metodi diventano metodi della I metodi diventano metodi della I metodi diventano metodi della servletservletservletservlet quando la quando la quando la quando la
pagina viene tradottapagina viene tradottapagina viene tradottapagina viene tradotta
<%! String name = “Paolo Rossi”;double[] prices = {1.5, 76.8, 21.5};
double getTotal() {double total = 0.0;for (int i=0; i<prices.length; i++)
total += prices[i];return total;
} %>
13
EspressioniEspressioniEspressioniEspressioniEspressioniEspressioniEspressioniEspressioni
� Si usano i delimitatori Si usano i delimitatori Si usano i delimitatori Si usano i delimitatori <%= eeee %>per valutare per valutare per valutare per valutare
espressioni Javaespressioni Javaespressioni Javaespressioni Java
� Risultato dellRisultato dellRisultato dellRisultato dell’’’’espressione vien convertito in stringa espressione vien convertito in stringa espressione vien convertito in stringa espressione vien convertito in stringa
inserito nella pagina al posto del inserito nella pagina al posto del inserito nella pagina al posto del inserito nella pagina al posto del tagtagtagtag
� Continuando lContinuando lContinuando lContinuando l’’’’esempio della pagina precedente:esempio della pagina precedente:esempio della pagina precedente:esempio della pagina precedente:
<p>Sig. <%=name%>,</p><p>l’ammontare del suo acquisto è: <%=getTotal()%> euro.</p><p>La data di oggi è: <%=new Date()%> </p>
<p>Sig. Paolo Rossi ,</p><p>l’ammontare del suo acquisto è: 99.8 euro.</p><p>La data di oggi è: Tue Feb 20 11:23:02 2010 </p>
JSP
Pagina HTML risultante
14
ScriptletScriptletScriptletScriptletScriptletScriptletScriptletScriptlet
� Si usanoSi usanoSi usanoSi usano <%e e e e %>per aggiungere un frammento di per aggiungere un frammento di per aggiungere un frammento di per aggiungere un frammento di
codice Java eseguibile alla JSP (codice Java eseguibile alla JSP (codice Java eseguibile alla JSP (codice Java eseguibile alla JSP (scriptletscriptletscriptletscriptlet))))
� Lo Lo Lo Lo scriptletscriptletscriptletscriptlet consente tipicamente di inserire logiche di consente tipicamente di inserire logiche di consente tipicamente di inserire logiche di consente tipicamente di inserire logiche di
controllo di flusso nella produzione della paginacontrollo di flusso nella produzione della paginacontrollo di flusso nella produzione della paginacontrollo di flusso nella produzione della pagina
� La combinazione di tutti gli La combinazione di tutti gli La combinazione di tutti gli La combinazione di tutti gli scriptletscriptletscriptletscriptlet in una in una in una in una
determinata JSP deve definire un blocco logico determinata JSP deve definire un blocco logico determinata JSP deve definire un blocco logico determinata JSP deve definire un blocco logico
completo di codice Javacompleto di codice Javacompleto di codice Javacompleto di codice Java
<% if (userIsLogged) { %><h1>Benvenuto Sig. <%=name%></h1>
<% } else { %><h1>Per accedere al sito devi fare il login</h1>
<% } %>
15
DirettiveDirettiveDirettiveDirettiveDirettiveDirettiveDirettiveDirettive
� Sono comandi JSP valutati a tempo di compilazioneSono comandi JSP valutati a tempo di compilazioneSono comandi JSP valutati a tempo di compilazioneSono comandi JSP valutati a tempo di compilazione
� Le piLe piLe piLe piùùùù importanti sono:importanti sono:importanti sono:importanti sono:
� page: permette di importare package, dichiarare
pagine d’errore, definire il modello di esecuzione
della JSP relativamente alla concorrenza, ecc.
� include: include un altro documento
� taglib: carica una libreria di custom tag
implementate dallo sviluppatore
� Non producono nessun output visibileNon producono nessun output visibileNon producono nessun output visibileNon producono nessun output visibile
<%@page info =“Esempio di direttive" %><%@ page language ="java" import ="java.net.*" %><%@ page import ="java.util.List, java.util.ArrayList" %><%@ include file =“myHeaderFile.html" %>
16
La direttiva La direttiva La direttiva La direttiva La direttiva La direttiva La direttiva La direttiva pagepagepagepagepagepagepagepage
� La direttiva La direttiva La direttiva La direttiva pagepagepagepage definisce una serie di attributi che si definisce una serie di attributi che si definisce una serie di attributi che si definisce una serie di attributi che si
applicano allapplicano allapplicano allapplicano all’’’’intera paginaintera paginaintera paginaintera pagina
� La sua sintassi La sua sintassi La sua sintassi La sua sintassi èèèè::::
<%@ page [ language="java " ] [ extends=" package.class" ] [ import="{ package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info=" text" ] [ errorPage=" relativeURL" ] [ contentType=" mimeType [ ;charset= characterSet ]"|
"text/html ; charset=ISO-8859-1 " ] [ isErrorPage="true | false" ]
%>
N.B. I valori sottolineati sono quelli di default
17
Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di pagepagepagepagepagepagepagepage -------- 11111111
� language="java " linguaggio di scripting utilizzato linguaggio di scripting utilizzato linguaggio di scripting utilizzato linguaggio di scripting utilizzato nelle parti dinamiche, allo stato attuale lnelle parti dinamiche, allo stato attuale lnelle parti dinamiche, allo stato attuale lnelle parti dinamiche, allo stato attuale l’’’’unico valore unico valore unico valore unico valore ammesso ammesso ammesso ammesso èèèè ““““javajavajavajava””””
� import="{package.class|package.*},… " lista di " lista di " lista di " lista di package da importare. Gli import pipackage da importare. Gli import pipackage da importare. Gli import pipackage da importare. Gli import piùùùù comuni sono comuni sono comuni sono comuni sono impliciti e non serve inserirliimpliciti e non serve inserirliimpliciti e non serve inserirliimpliciti e non serve inserirli ((((java.lang.*, javax.servlet.*,javax.servlet.jsp.*, javax.servlet.http.* ) ) ) )
� session="true |false" : indica se la pagina fa uso : indica se la pagina fa uso : indica se la pagina fa uso : indica se la pagina fa uso della sessione (altrimenti non si può usare della sessione (altrimenti non si può usare della sessione (altrimenti non si può usare della sessione (altrimenti non si può usare session ))))
� buffer="none|8kb |sizekb" dimensione in kilobyte dimensione in kilobyte dimensione in kilobyte dimensione in kilobyte del buffer di uscita del buffer di uscita del buffer di uscita del buffer di uscita
� autoFlush="true |false" dice se il buffer viene dice se il buffer viene dice se il buffer viene dice se il buffer viene svuotato automaticamente quando svuotato automaticamente quando svuotato automaticamente quando svuotato automaticamente quando èèèè pieno. Se il pieno. Se il pieno. Se il pieno. Se il valore valore valore valore èèèè false viene generata unfalse viene generata unfalse viene generata unfalse viene generata un’’’’eccezione quando il eccezione quando il eccezione quando il eccezione quando il buffer buffer buffer buffer èèèè pieno pieno pieno pieno
18
Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di Attributi di pagepagepagepagepagepagepagepage -------- 22222222
� isThreadSafe="true|false" indica se il coindica se il coindica se il coindica se il coddddice ice ice ice
contenuto nella pagina contenuto nella pagina contenuto nella pagina contenuto nella pagina èèèè threadthreadthreadthread----safe. Se safe. Se safe. Se safe. Se vale vale vale vale false le le le le
chiamate alla JSP vengono serializzate. chiamate alla JSP vengono serializzate. chiamate alla JSP vengono serializzate. chiamate alla JSP vengono serializzate.
� info=" text" ttttesto di commento. Può essere letto esto di commento. Può essere letto esto di commento. Può essere letto esto di commento. Può essere letto
con il metodo Servlet.getServletInfo()con il metodo Servlet.getServletInfo()con il metodo Servlet.getServletInfo()con il metodo Servlet.getServletInfo()
� errorPage=" relativeURL" indirizzo della pagina a indirizzo della pagina a indirizzo della pagina a indirizzo della pagina a
cui vengono inviate le eccezionicui vengono inviate le eccezionicui vengono inviate le eccezionicui vengono inviate le eccezioni
� isErrorPage="true|false " indica sel la JSP indica sel la JSP indica sel la JSP indica sel la JSP
corrente corrente corrente corrente èèèè una pagina di errore. Si può utilizzare una pagina di errore. Si può utilizzare una pagina di errore. Si può utilizzare una pagina di errore. Si può utilizzare
llll’’’’oggetto eccezione solo se loggetto eccezione solo se loggetto eccezione solo se loggetto eccezione solo se l’’’’attributo attributo attributo attributo èèèè truetruetruetrue
� contentType=" mimeType [;charset= charSet ]" | "text/html;charset=ISO-8859-1" indica il tipo indica il tipo indica il tipo indica il tipo
MIME e il codice di caratteri usato nella rispostaMIME e il codice di caratteri usato nella rispostaMIME e il codice di caratteri usato nella rispostaMIME e il codice di caratteri usato nella risposta
19
La direttiva includeLa direttiva includeLa direttiva includeLa direttiva includeLa direttiva includeLa direttiva includeLa direttiva includeLa direttiva include
� Sintassi: Sintassi: Sintassi: Sintassi: <%@ include file = " localURL"%>
� Serve ad includere il contenuto del file specificatoServe ad includere il contenuto del file specificatoServe ad includere il contenuto del file specificatoServe ad includere il contenuto del file specificato
� EEEE’’’’ possibile nidificare un numero qualsiasi di inclusionipossibile nidificare un numero qualsiasi di inclusionipossibile nidificare un numero qualsiasi di inclusionipossibile nidificare un numero qualsiasi di inclusioni
� LLLL’’’’inclusione viene fatta a tempo di compilazione: inclusione viene fatta a tempo di compilazione: inclusione viene fatta a tempo di compilazione: inclusione viene fatta a tempo di compilazione:
eventuali modifiche al file incluso non determinano eventuali modifiche al file incluso non determinano eventuali modifiche al file incluso non determinano eventuali modifiche al file incluso non determinano
una ricompilazione della pagina che lo includeuna ricompilazione della pagina che lo includeuna ricompilazione della pagina che lo includeuna ricompilazione della pagina che lo include
� Esempio: Esempio: Esempio: Esempio: <%@ include file="/shared/copyright.html"%>
20
Direttiva Direttiva Direttiva Direttiva Direttiva Direttiva Direttiva Direttiva taglibtaglibtaglibtaglibtaglibtaglibtaglibtaglib
� Le JSP permettono di definire Le JSP permettono di definire Le JSP permettono di definire Le JSP permettono di definire tagtagtagtag custom oltre a quelli custom oltre a quelli custom oltre a quelli custom oltre a quelli
predefinitipredefinitipredefinitipredefiniti
� Una Una Una Una taglib èèèè una collezione di questi una collezione di questi una collezione di questi una collezione di questi tagtagtagtag non non non non
standard, realizzata mediante una classe Javastandard, realizzata mediante una classe Javastandard, realizzata mediante una classe Javastandard, realizzata mediante una classe Java
� Sintassi: Sintassi: Sintassi: Sintassi: <%@ uri=“ tagLibraryURI" prefix=" tagPrefix"%>
� LLLL’’’’attributo uri fa riferimento ad un file xml, con attributo uri fa riferimento ad un file xml, con attributo uri fa riferimento ad un file xml, con attributo uri fa riferimento ad un file xml, con
estensione estensione estensione estensione tldtldtldtld ((((tagtagtagtag librarylibrarylibrarylibrary descriptordescriptordescriptordescriptor), che contiene ), che contiene ), che contiene ), che contiene
informazioni sulle classe che implementa i informazioni sulle classe che implementa i informazioni sulle classe che implementa i informazioni sulle classe che implementa i tagtagtagtag. . . .
� NellNellNellNell’’’’esempio sotto riportato, nel descrittore associato esempio sotto riportato, nel descrittore associato esempio sotto riportato, nel descrittore associato esempio sotto riportato, nel descrittore associato
alla alla alla alla taglibtaglibtaglibtaglib èèèè presente un elemento <presente un elemento <presente un elemento <presente un elemento <endProgramendProgramendProgramendProgram> che > che > che > che
definisce la classe Java associata al definisce la classe Java associata al definisce la classe Java associata al definisce la classe Java associata al tagtagtagtag....
� direttiva: <%@ taglib uri="/EncomTags" prefix="mcp"%>
� utilizzo: <mcp:endProgram/>
21
BuiltBuiltBuiltBuiltBuiltBuiltBuiltBuilt--------inininininininin objectsobjectsobjectsobjectsobjectsobjectsobjectsobjects
� Le specifiche JSP definiscono 8 Le specifiche JSP definiscono 8 Le specifiche JSP definiscono 8 Le specifiche JSP definiscono 8 oggetti oggetti oggetti oggetti builtbuiltbuiltbuilt----inininin (o (o (o (o
implicitiimplicitiimplicitiimpliciti) utilizzabili senza dover di creare istanze) utilizzabili senza dover di creare istanze) utilizzabili senza dover di creare istanze) utilizzabili senza dover di creare istanze
� Rappresentano utili riferimenti ai corrispondenti Rappresentano utili riferimenti ai corrispondenti Rappresentano utili riferimenti ai corrispondenti Rappresentano utili riferimenti ai corrispondenti
oggetti presenti nelle oggetti presenti nelle oggetti presenti nelle oggetti presenti nelle servletservletservletservlet....
Java.lang.Throwableexception
javax.servlet.jsp.PageContextpageContext
javax.servlet.ServletContextapplication
javax.servlet.http.HttpSessionsession
javax.servlet.jsp.JspWriterout
javax.servlet.http.HttpServletResponseresponse
javax.servlet.http.HttpServletRequestrequest
javax.servlet.ServletConfigconfig
javax.servlet.jsp.HttpJspPagepage
Classe/InterfacciaClasse/InterfacciaClasse/InterfacciaClasse/InterfacciaOggettoOggettoOggettoOggetto
22
LLLLLLLL’’’’’’’’oggetto oggetto oggetto oggetto oggetto oggetto oggetto oggetto pagepagepagepagepagepagepagepage
� LLLL’’’’oggetto oggetto oggetto oggetto pagepagepagepage rappresenta lrappresenta lrappresenta lrappresenta l’’’’istanza corrente della istanza corrente della istanza corrente della istanza corrente della
servletservletservletservlet
� Ha come tipo lHa come tipo lHa come tipo lHa come tipo l’’’’interfaccia interfaccia interfaccia interfaccia HTTPJspPageHTTPJspPageHTTPJspPageHTTPJspPage che discende che discende che discende che discende
da JSP da JSP da JSP da JSP pagepagepagepage, la quale a sua volta estende , la quale a sua volta estende , la quale a sua volta estende , la quale a sua volta estende ServletServletServletServlet
� Può quindi essere quindi utilizzato per accedere a tutti Può quindi essere quindi utilizzato per accedere a tutti Può quindi essere quindi utilizzato per accedere a tutti Può quindi essere quindi utilizzato per accedere a tutti
i metodi definiti nelle i metodi definiti nelle i metodi definiti nelle i metodi definiti nelle servletservletservletservlet
<%@ page info=“Esempio di uso page." %><p>Page info:
<%=page.getServletInfo() %></p>
<p>Page info: Esempio di uso di page</p>
Pagina HTMLJSP
23
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto configconfigconfigconfigconfigconfigconfigconfig
� Contiene la configurazione della Contiene la configurazione della Contiene la configurazione della Contiene la configurazione della servletservletservletservlet (parametri di (parametri di (parametri di (parametri di
inizializzazione)inizializzazione)inizializzazione)inizializzazione)
� Poco usato in pratica in quanto in generale nelle JSP Poco usato in pratica in quanto in generale nelle JSP Poco usato in pratica in quanto in generale nelle JSP Poco usato in pratica in quanto in generale nelle JSP
sono poco usati i parametri di inizializzazionesono poco usati i parametri di inizializzazionesono poco usati i parametri di inizializzazionesono poco usati i parametri di inizializzazione
� Metodi di Metodi di Metodi di Metodi di config ::::
� getInitParameterName() : restituisce tutti i nomi
dei parametri di inizializzazione
� getInitParameter(name) : restituisce il valore del
parametro passato per nome
24
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto requestrequestrequestrequestrequestrequestrequestrequest
� Rappresenta la richiesta alla pagina JSP Rappresenta la richiesta alla pagina JSP Rappresenta la richiesta alla pagina JSP Rappresenta la richiesta alla pagina JSP
� EEEE’’’’ il parametro il parametro il parametro il parametro requestrequestrequestrequest passato al metodo service passato al metodo service passato al metodo service passato al metodo service
della della della della servletservletservletservlet
� Consente lConsente lConsente lConsente l’’’’accesso a tutte le informazioni relative alla accesso a tutte le informazioni relative alla accesso a tutte le informazioni relative alla accesso a tutte le informazioni relative alla
richiesta HTTP:richiesta HTTP:richiesta HTTP:richiesta HTTP:
� indirizzo di provenienza, URL, headers, cookie,
parametri, ecc.
<% String xStr = request.getParameter("num") ;try {
long x = Long.parseLong(xStr); %>Fattoriale: <%= x %>! = <%= fact(x) %>
<%} catch (NumberFormatException e) { %>Il parametro <b>num</b>non contiene un valore intero .<%} %>
25
Alcuni metodi di Alcuni metodi di Alcuni metodi di Alcuni metodi di Alcuni metodi di Alcuni metodi di Alcuni metodi di Alcuni metodi di requestrequestrequestrequestrequestrequestrequestrequest
� String getParameter(String parName) restituisce restituisce restituisce restituisce
il valore di un parametro individuato per nome il valore di un parametro individuato per nome il valore di un parametro individuato per nome il valore di un parametro individuato per nome
� Enumeration getParameterNames() restituisce restituisce restituisce restituisce
llll’’’’elenco dei nomi dei parametrielenco dei nomi dei parametrielenco dei nomi dei parametrielenco dei nomi dei parametri
� String getHeader(String name) restituisce il restituisce il restituisce il restituisce il
valore di un valore di un valore di un valore di un headerheaderheaderheader individuato per nome sotto forma individuato per nome sotto forma individuato per nome sotto forma individuato per nome sotto forma
di stringadi stringadi stringadi stringa
� Enumeration getHeaderNames() elenco dei nomi di elenco dei nomi di elenco dei nomi di elenco dei nomi di
tutti gli tutti gli tutti gli tutti gli headerheaderheaderheader presenti nella richiestapresenti nella richiestapresenti nella richiestapresenti nella richiesta
� Cookie[] getCookies() restituisce un restituisce un restituisce un restituisce un arrayarrayarrayarray di di di di
oggetti cookie che il client ha inviato alla oggetti cookie che il client ha inviato alla oggetti cookie che il client ha inviato alla oggetti cookie che il client ha inviato alla requestrequestrequestrequest
� Per lPer lPer lPer l’’’’elenco completo vedere parte su elenco completo vedere parte su elenco completo vedere parte su elenco completo vedere parte su servletservletservletservlet
26
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto responseresponseresponseresponseresponseresponseresponseresponse
� Oggetto legato allOggetto legato allOggetto legato allOggetto legato all’’’’I/O della pagina JSPI/O della pagina JSPI/O della pagina JSPI/O della pagina JSP
� Rappresenta la risposta che viene restituita al clientRappresenta la risposta che viene restituita al clientRappresenta la risposta che viene restituita al clientRappresenta la risposta che viene restituita al client
� Consente di inserire nella risposta diverse Consente di inserire nella risposta diverse Consente di inserire nella risposta diverse Consente di inserire nella risposta diverse
informazioni:informazioni:informazioni:informazioni:
� il content type e l’enconding
� eventuali header di risposta
� URL Rewriting
� i cookie
<%response.setDateHeader ("Expires", 0);response.setHeader ("Pragma", "no-cache");if (request.getProtocol().equals("HTTP/1.1")) {
response.setHeader ("Cache-Control", "no-cache");}
%>
27
Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di responseresponseresponseresponseresponseresponseresponseresponse
� public void setHeader(String headerName, String headerValue) imposta un imposta un imposta un imposta un headerheaderheaderheader
� public void setDateHeader(String name, long millisecs) imposta la dataimposta la dataimposta la dataimposta la data
� addHeader, addDateHeader, addIntHeaderaggiungono una nuova occorrenza di un dato aggiungono una nuova occorrenza di un dato aggiungono una nuova occorrenza di un dato aggiungono una nuova occorrenza di un dato headerheaderheaderheader
� setContentType determina il determina il determina il determina il contentcontentcontentcontent----typetypetypetype
� addCookie consente di gestire i cookie nella rispostaconsente di gestire i cookie nella rispostaconsente di gestire i cookie nella rispostaconsente di gestire i cookie nella risposta
� public PrintWriter getWriter : restituisce uno : restituisce uno : restituisce uno : restituisce uno
streamstreamstreamstream di caratteri (undi caratteri (undi caratteri (undi caratteri (un’’’’istanza di istanza di istanza di istanza di PrintWriter ) ) ) )
� public ServletOutputStream getOuputStream() : : : :
restituisce uno restituisce uno restituisce uno restituisce uno streamstreamstreamstream di byte (undi byte (undi byte (undi byte (un’’’’istanza di istanza di istanza di istanza di ServletOutputStream ) ) ) )
28
Oggetto outOggetto outOggetto outOggetto outOggetto outOggetto outOggetto outOggetto out
� Oggetto legato allOggetto legato allOggetto legato allOggetto legato all’’’’I/O della pagina JSPI/O della pagina JSPI/O della pagina JSPI/O della pagina JSP
� EEEE’’’’ uno uno uno uno streamstreamstreamstream di caratteri e rappresenta lo di caratteri e rappresenta lo di caratteri e rappresenta lo di caratteri e rappresenta lo streamstreamstreamstream di di di di
output della paginaoutput della paginaoutput della paginaoutput della pagina
� Esempio:Esempio:Esempio:Esempio:
<p>Conto delle uova<%
int count = 0;while (carton.hasNext()) {
count++;out.print(".");
} %>
<br/>Ci sono <%= count %> uova.</p>
29
Metodi dellMetodi dellMetodi dellMetodi dellMetodi dellMetodi dellMetodi dellMetodi dell’’’’’’’’oggetto outoggetto outoggetto outoggetto outoggetto outoggetto outoggetto outoggetto out
� isAutoFlush(): dice se ldice se ldice se ldice se l’’’’output buffer output buffer output buffer output buffer èèèè stato stato stato stato
impostato in modalitimpostato in modalitimpostato in modalitimpostato in modalitàààà autoFlushautoFlushautoFlushautoFlush o menoo menoo menoo meno
� getBufferSize(): restituisce le dimensioni del restituisce le dimensioni del restituisce le dimensioni del restituisce le dimensioni del
bufferbufferbufferbuffer
� getRemaining() indica indica indica indica quandiquandiquandiquandi byte byte byte byte liberliberliberliber ci sono nel ci sono nel ci sono nel ci sono nel
bufferbufferbufferbuffer
� clearBuffer() ripulisce il bufferripulisce il bufferripulisce il bufferripulisce il buffer
� flush() forza lforza lforza lforza l’’’’emissione del contenuto del bufferemissione del contenuto del bufferemissione del contenuto del bufferemissione del contenuto del buffer
� flose() fa il fa il fa il fa il flushflushflushflush e chiude lo e chiude lo e chiude lo e chiude lo streamstreamstreamstream
30
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto sessionsessionsessionsessionsessionsessionsessionsession
� Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di
esecuzione della JSPesecuzione della JSPesecuzione della JSPesecuzione della JSP
� Rappresenta la sessione corrente per un utenteRappresenta la sessione corrente per un utenteRappresenta la sessione corrente per un utenteRappresenta la sessione corrente per un utente
� LLLL’’’’attributo attributo attributo attributo session della direttiva della direttiva della direttiva della direttiva page deve essere deve essere deve essere deve essere
valorizzata a valorizzata a valorizzata a valorizzata a truetruetruetrue affinchaffinchaffinchaffinchéééé la JSP partecipi alla la JSP partecipi alla la JSP partecipi alla la JSP partecipi alla
sessionesessionesessionesessione
<% UserLogin userData = new UserLogin(name, password );session.setAttribute ("login", userData);
%><%UserLogin userData=(UserLogin)session.getAttribut e("login");
if (userData.isGroupMember("admin")) {session.setMaxInactiveInterval (60*60*8);
} else {session.setMaxInactiveInterval (60*15);
} %>
31
Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di Metodi di sessionsessionsessionsessionsessionsessionsessionsession
� String getID() restituisce lrestituisce lrestituisce lrestituisce l’’’’ID di una sessioneID di una sessioneID di una sessioneID di una sessione
� boolean isNew() dice se la sessione dice se la sessione dice se la sessione dice se la sessione èèèè nuova nuova nuova nuova
� void invalidate() permette di invalidare permette di invalidare permette di invalidare permette di invalidare
(distruggere) una sessione(distruggere) una sessione(distruggere) una sessione(distruggere) una sessione
� long getCreationTime() ci dice da quanto ci dice da quanto ci dice da quanto ci dice da quanto èèèè attiva attiva attiva attiva
la sessione (in millisecondi)la sessione (in millisecondi)la sessione (in millisecondi)la sessione (in millisecondi)
� long getLastAccessedTime() ci dice quando ci dice quando ci dice quando ci dice quando èèèè stata stata stata stata
utilizzata lutilizzata lutilizzata lutilizzata l’’’’ultima voltaultima voltaultima voltaultima volta
32
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto applicationapplicationapplicationapplicationapplicationapplicationapplicationapplication
� Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di esecuzione della JSP (esecuzione della JSP (esecuzione della JSP (esecuzione della JSP (èèèè il il il il ServletContext ))))
� Rappresenta la web Rappresenta la web Rappresenta la web Rappresenta la web applicationapplicationapplicationapplication a cui la JSP a cui la JSP a cui la JSP a cui la JSP
appartieneappartieneappartieneappartiene
� Consente di interagire con lConsente di interagire con lConsente di interagire con lConsente di interagire con l’’’’ambiente di esecuzione:ambiente di esecuzione:ambiente di esecuzione:ambiente di esecuzione:
� fornisce la versione del JSP Container
� garantisce l’accesso a risorse server-side
� permette accesso ai parametri di inizializzazione
relativi all’applicazione
� consente di gestire gli attributi di un’applicazione
33
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto pageContextpageContextpageContextpageContextpageContextpageContextpageContextpageContext
� Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di Oggetto che fornisce informazioni sul contesto di
esecuzione della JSPesecuzione della JSPesecuzione della JSPesecuzione della JSP
� Rappresenta lRappresenta lRappresenta lRappresenta l’’’’insieme degli oggetti impliciti di una insieme degli oggetti impliciti di una insieme degli oggetti impliciti di una insieme degli oggetti impliciti di una
JSPJSPJSPJSP
� Consente l’accesso a tutti gli oggetti impliciti e ai
loro attributi
� Consente il trasferimento del controllo ad altre
pagine
� Poco usato per lo Poco usato per lo Poco usato per lo Poco usato per lo scriptingscriptingscriptingscripting, utile per costruire custom , utile per costruire custom , utile per costruire custom , utile per costruire custom
tagstagstagstags
34
Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto Oggetto exceptionexceptionexceptionexceptionexceptionexceptionexceptionexception
� Oggetto connesso alla gestione degli erroriOggetto connesso alla gestione degli erroriOggetto connesso alla gestione degli erroriOggetto connesso alla gestione degli errori
� Rappresenta lRappresenta lRappresenta lRappresenta l’’’’eccezione che non viene gestita da eccezione che non viene gestita da eccezione che non viene gestita da eccezione che non viene gestita da
nessun blocco catchnessun blocco catchnessun blocco catchnessun blocco catch
� Non Non Non Non èèèè automaticamente disponibile in tutte le pagine automaticamente disponibile in tutte le pagine automaticamente disponibile in tutte le pagine automaticamente disponibile in tutte le pagine
ma solo nelle ma solo nelle ma solo nelle ma solo nelle ErrorErrorErrorError PagePagePagePage (quelle dichiarate con (quelle dichiarate con (quelle dichiarate con (quelle dichiarate con
llll’’’’attributo attributo attributo attributo errorPageerrorPageerrorPageerrorPage impostato a impostato a impostato a impostato a truetruetruetrue))))
� Esempio:Esempio:Esempio:Esempio:
<%@ page isErrorPage="true" %><h1>Attenzione!</h1>E’ stato rilevato il seguente errore:<br/><b><%= exception %></b><br/><%
exception.printStackTrace(out);%>
35
AzioniAzioniAzioniAzioniAzioniAzioniAzioniAzioni
� Le azioni sono comandi JSP valutati a Le azioni sono comandi JSP valutati a Le azioni sono comandi JSP valutati a Le azioni sono comandi JSP valutati a requestrequestrequestrequest timetimetimetime....
� Sono previsti 6 tipi di azioni definite dai seguenti Sono previsti 6 tipi di azioni definite dai seguenti Sono previsti 6 tipi di azioni definite dai seguenti Sono previsti 6 tipi di azioni definite dai seguenti tagtagtagtag::::
� useBean : istanzia un JavaBean e gli associa un identificativo
� getProperty : ritorna la property indicata come un oggetto
� setProperty : imposta il valore della property indicata per nome
� include : include un file nella JSP
� forward : cede il controllo ad un’altra JSP o servlet
� plugin : genera contenuto per scaricare plug-in Java se necessario
� Sono espresse usando sintassi XMLSono espresse usando sintassi XMLSono espresse usando sintassi XMLSono espresse usando sintassi XML
<html><body>
<jsp:useBean id="hello" class=“it.unibo.deis.my.Hel loBean"/><jsp:setProperty name="hello" property="name" param ="name"/>Hello, <jsp:getProperty name="hello" property="name "/>!
</body></html>
36
Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: forwardforwardforwardforwardforwardforwardforwardforward
� Sintassi: Sintassi: Sintassi: Sintassi: <jsp:forward page=" localURL" />
� Consente il trasferimento del controllo dalla pagina Consente il trasferimento del controllo dalla pagina Consente il trasferimento del controllo dalla pagina Consente il trasferimento del controllo dalla pagina
JSP corrente ad unJSP corrente ad unJSP corrente ad unJSP corrente ad un’’’’altra pagina sul server localealtra pagina sul server localealtra pagina sul server localealtra pagina sul server locale
� L’attributo page definisce l’URL della pagina a cui
trasferire il controllo
� La request viene completamente trasferita in modo
trasparente per il client
37
Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: Azioni: forwardforwardforwardforwardforwardforwardforwardforward
� EEEE’’’’ possibile generare dinamicamente lpossibile generare dinamicamente lpossibile generare dinamicamente lpossibile generare dinamicamente l’’’’attributo attributo attributo attributo pagepagepagepage<jsp:forward page=’<%="message"+statusCode+".html"%> ’/>
� Gli oggetti Gli oggetti Gli oggetti Gli oggetti request , , , , response e e e e session della pagina della pagina della pagina della pagina
dddd’’’’arrivo sono gli stessi della pagina chiamante, ma arrivo sono gli stessi della pagina chiamante, ma arrivo sono gli stessi della pagina chiamante, ma arrivo sono gli stessi della pagina chiamante, ma viene istanziato un nuovo oggetto viene istanziato un nuovo oggetto viene istanziato un nuovo oggetto viene istanziato un nuovo oggetto pageContext
� Attenzione:Attenzione:Attenzione:Attenzione: Il Il Il Il forwardforwardforwardforward èèèè possibile soltanto se non possibile soltanto se non possibile soltanto se non possibile soltanto se non èèèè
stato emesso alcun outputstato emesso alcun outputstato emesso alcun outputstato emesso alcun output
� EEEE’’’’ possibile aggiungere parametri allpossibile aggiungere parametri allpossibile aggiungere parametri allpossibile aggiungere parametri all’’’’oggetto oggetto oggetto oggetto requestrequestrequestrequestdella pagina chiamata utilizzando il della pagina chiamata utilizzando il della pagina chiamata utilizzando il della pagina chiamata utilizzando il tagtagtagtag <jsp:param>
<jsp:forward page="localURL"><jsp:param name="parName1“ value="parValue1"/>...<jsp:param name="parNameN“ value="parValueN"/>
</jsp:forward>
38
Azioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: include
� Sintassi: Sintassi: Sintassi: Sintassi: <jsp:include page=" localURL" flush="true" />
� Consente di includere il contenuto generato Consente di includere il contenuto generato Consente di includere il contenuto generato Consente di includere il contenuto generato dinamicamente da undinamicamente da undinamicamente da undinamicamente da un’’’’altra pagina locale allaltra pagina locale allaltra pagina locale allaltra pagina locale all’’’’interno interno interno interno delldelldelldell’’’’output della pagina correnteoutput della pagina correnteoutput della pagina correnteoutput della pagina corrente
� Trasferisce temporaneamente il controllo ad un’altra pagina
� L’attributo page definisce l’URL della pagina da includere
� L’attributo flush stabilisce se sul buffer della pagina corrente debba essere eseguito un flush prima di effettuare l’inclusione
� Gli oggetti session e request per la pagina da includere sono gli stessi della pagina chiamante, ma viene istanziato un nuovo contesto di pagina
39
Azioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: includeAzioni: include
� EEEE’’’’ possibile aggiungere parametri allpossibile aggiungere parametri allpossibile aggiungere parametri allpossibile aggiungere parametri all’’’’oggetto oggetto oggetto oggetto requestrequestrequestrequestdella pagina inclusa utilizzando il della pagina inclusa utilizzando il della pagina inclusa utilizzando il della pagina inclusa utilizzando il tagtagtagtag <jsp:param>
<jsp:include page="localURL“ flush=“true”><jsp:param name="parName1“ value="parValue1"/>...<jsp:param name="parNameN“ value="parValueN"/>
</jsp:include>
40
JSP e modello a componentiJSP e modello a componentiJSP e modello a componentiJSP e modello a componentiJSP e modello a componentiJSP e modello a componentiJSP e modello a componentiJSP e modello a componenti
� ScriptletScriptletScriptletScriptlet e espressioni consentono uno sviluppo e espressioni consentono uno sviluppo e espressioni consentono uno sviluppo e espressioni consentono uno sviluppo
centrato sulla paginacentrato sulla paginacentrato sulla paginacentrato sulla pagina
� Questo modello non consente una forte
separazione tra logica applicativa e presentazione
dei contenuti
� Applicazioni complesse necessitano di un
architettura a più livelli
� A tal fine le JSP consentono uno sviluppo basato su A tal fine le JSP consentono uno sviluppo basato su A tal fine le JSP consentono uno sviluppo basato su A tal fine le JSP consentono uno sviluppo basato su
un modello a componentiun modello a componentiun modello a componentiun modello a componenti
� Il modello a componenti Il modello a componenti Il modello a componenti Il modello a componenti
� consente di avere una maggiore separazione fra
logica dell’applicazione e contenuti
� Permette di costruire architetture molto più
articolate
41
Componenti softwareComponenti softwareComponenti softwareComponenti softwareComponenti softwareComponenti softwareComponenti softwareComponenti software
� Un componente Un componente Un componente Un componente èèèè un un un un ““““circuito integratocircuito integratocircuito integratocircuito integrato”””” software che software che software che software che comunica con lcomunica con lcomunica con lcomunica con l’’’’esterno attraverso una serie di esterno attraverso una serie di esterno attraverso una serie di esterno attraverso una serie di ““““piedinipiedinipiedinipiedini””””
� UnUnUnUn’’’’entitentitentitentitàààà in grado di incorporare componenti viene in grado di incorporare componenti viene in grado di incorporare componenti viene in grado di incorporare componenti viene definita definita definita definita containercontainercontainercontainer ed ed ed ed èèèè llll’’’’equivalente software di una equivalente software di una equivalente software di una equivalente software di una scheda elettronicascheda elettronicascheda elettronicascheda elettronica
� Abbiamo tre tipi di Abbiamo tre tipi di Abbiamo tre tipi di Abbiamo tre tipi di ““““piedinipiedinipiedinipiedini””””: propriet: propriet: propriet: proprietàààà, metodi, eventi , metodi, eventi , metodi, eventi , metodi, eventi ((((modello PMEmodello PMEmodello PMEmodello PME):):):):
� ProprietProprietProprietProprietàààà (property): “piedini di stato”, pseudo-variabili che consentono di interagire in modo protetto con lo stato interno
� MetodiMetodiMetodiMetodi: “piedini di ingresso”, comandi che provocano l’esecuzione di azioni
� EventiEventiEventiEventi: “piedini di uscita”, provocano l’esecuzione di metodi nel container (callback) in seguito a qualcosa che si verifica nel componente
42
JavaBeansJavaBeansJavaBeansJavaBeansJavaBeansJavaBeansJavaBeansJavaBeans
� I I I I JavaBeansJavaBeansJavaBeansJavaBeans (chicchi di caff(chicchi di caff(chicchi di caff(chicchi di caffèèèè) sono il modello di ) sono il modello di ) sono il modello di ) sono il modello di
componenti di Javacomponenti di Javacomponenti di Javacomponenti di Java
� Un Un Un Un JavaBeanJavaBeanJavaBeanJavaBean, o semplicemente un , o semplicemente un , o semplicemente un , o semplicemente un beanbeanbeanbean, non , non , non , non èèèè altro altro altro altro
che una classe Java dotata di alcune caratteristiche che una classe Java dotata di alcune caratteristiche che una classe Java dotata di alcune caratteristiche che una classe Java dotata di alcune caratteristiche
particolari:particolari:particolari:particolari:
� E’ una classe publicpublicpublicpublic
� Ha un costruttore publicpublicpublicpublic di default (senza
argomenti)
� Espone proprietà, sotto forma di coppie di metodi di
accesso (accessors) costruiti secondo le regole
che abbiamo appena esposto (get… set…)
� Espone eventi con metodi di registrazione che
seguono regole precise
43
ProprietProprietProprietProprietProprietProprietProprietProprietàààààààà -------- 1 1 1 1 1 1 1 1
� Le proprietLe proprietLe proprietLe proprietàààà sono elementi dello stato del componente sono elementi dello stato del componente sono elementi dello stato del componente sono elementi dello stato del componente che vengono esposti in modo protettoche vengono esposti in modo protettoche vengono esposti in modo protettoche vengono esposti in modo protetto
� In alcuni linguaggi (ad esempio In alcuni linguaggi (ad esempio In alcuni linguaggi (ad esempio In alcuni linguaggi (ad esempio C#C#C#C#) esiste una sintassi ) esiste una sintassi ) esiste una sintassi ) esiste una sintassi specifiche per definire le proprietspecifiche per definire le proprietspecifiche per definire le proprietspecifiche per definire le proprietàààà
� In altri (come Java) le proprietIn altri (come Java) le proprietIn altri (come Java) le proprietIn altri (come Java) le proprietàààà sono solo una sono solo una sono solo una sono solo una convenzione: sono coppie di metodi di accesso che convenzione: sono coppie di metodi di accesso che convenzione: sono coppie di metodi di accesso che convenzione: sono coppie di metodi di accesso che seguono regole di denominazioneseguono regole di denominazioneseguono regole di denominazioneseguono regole di denominazione
� La proprietLa proprietLa proprietLa proprietàààà prop èèèè definita da due metodi definita da due metodi definita da due metodi definita da due metodi get Prop()e e e e set Prop()
� Il tipo del parametro di Il tipo del parametro di Il tipo del parametro di Il tipo del parametro di setProp() e del valore di e del valore di e del valore di e del valore di ritorno di ritorno di ritorno di ritorno di getProp() devono essere uguali e devono essere uguali e devono essere uguali e devono essere uguali e rappresentano il tipo della proprietrappresentano il tipo della proprietrappresentano il tipo della proprietrappresentano il tipo della proprietàààà (può essere un (può essere un (può essere un (può essere un tipo primitivo o una qualunque classe java)tipo primitivo o una qualunque classe java)tipo primitivo o una qualunque classe java)tipo primitivo o una qualunque classe java)
� Per esempio Per esempio Per esempio Per esempio void setLenght(int Value) e e e e int getLenght() identificano la proprietidentificano la proprietidentificano la proprietidentificano la proprietàààà lenght di di di di tipo tipo tipo tipo int
44
ProprietProprietProprietProprietProprietProprietProprietProprietàààààààà -------- 22222222
� Se definiamo solo il metodo Se definiamo solo il metodo Se definiamo solo il metodo Se definiamo solo il metodo getgetgetget avremo una proprietavremo una proprietavremo una proprietavremo una proprietààààin sola lettura (in sola lettura (in sola lettura (in sola lettura (readreadreadread----onlyonlyonlyonly))))
� Le proprietLe proprietLe proprietLe proprietàààà di tipo di tipo di tipo di tipo booleanbooleanbooleanboolean seguono una regola seguono una regola seguono una regola seguono una regola leggermente diversa: il metodo di lettura ha la forma leggermente diversa: il metodo di lettura ha la forma leggermente diversa: il metodo di lettura ha la forma leggermente diversa: il metodo di lettura ha la forma isProp() anzichanzichanzichanzichéééé getProp()
� Per esempio la proprietPer esempio la proprietPer esempio la proprietPer esempio la proprietàààà empty sarsarsarsaràààà rappresentata rappresentata rappresentata rappresentata dalla coppia dalla coppia dalla coppia dalla coppia void setEmpty(boolean value) e e e e boolean getEmpty()
� Esiste anche la possibilitEsiste anche la possibilitEsiste anche la possibilitEsiste anche la possibilitàààà di definire proprietdi definire proprietdi definire proprietdi definire proprietààààindicizzate per rappresentare collezioni di valori indicizzate per rappresentare collezioni di valori indicizzate per rappresentare collezioni di valori indicizzate per rappresentare collezioni di valori ((((pesudoarraypesudoarraypesudoarraypesudoarray))))
� In questo caso sia In questo caso sia In questo caso sia In questo caso sia getgetgetget che set prevedono un che set prevedono un che set prevedono un che set prevedono un parametro che ha la funzione di indiceparametro che ha la funzione di indiceparametro che ha la funzione di indiceparametro che ha la funzione di indice
� Per es. Per es. Per es. Per es. String getItem(int index) e e e e setItem(intIndex, String value) definiscono la proprietdefiniscono la proprietdefiniscono la proprietdefiniscono la proprietààààindicizzata indicizzata indicizzata indicizzata String item[]
45
Componenti e containerComponenti e containerComponenti e containerComponenti e containerComponenti e containerComponenti e containerComponenti e containerComponenti e container
� I componenti vivono allI componenti vivono allI componenti vivono allI componenti vivono all’’’’interno di contenitori interno di contenitori interno di contenitori interno di contenitori
((((componentcomponentcomponentcomponent containerscontainerscontainerscontainers) che gestiscono ) che gestiscono ) che gestiscono ) che gestiscono
� il tempo di vita dei singoli componenti
� i collegamenti fra componenti e resto del sistema
� I contenitori non conoscono a priori i componenti che I contenitori non conoscono a priori i componenti che I contenitori non conoscono a priori i componenti che I contenitori non conoscono a priori i componenti che
devono gestire e quindi interagiscono con loro devono gestire e quindi interagiscono con loro devono gestire e quindi interagiscono con loro devono gestire e quindi interagiscono con loro
mediante meccanismi di tipo dinamico (mediante meccanismi di tipo dinamico (mediante meccanismi di tipo dinamico (mediante meccanismi di tipo dinamico (reflectionreflectionreflectionreflection))))
� Un contenitore per Un contenitore per Un contenitore per Un contenitore per JavaBeanJavaBeanJavaBeanJavaBean prende il nome di prende il nome di prende il nome di prende il nome di beanbeanbeanbean
container container container container
� Un Un Un Un beanbeanbeanbean containercontainercontainercontainer èèèè in grado di interfacciarsi con i in grado di interfacciarsi con i in grado di interfacciarsi con i in grado di interfacciarsi con i
beanbeanbeanbean utilizzando la utilizzando la utilizzando la utilizzando la Java Java Java Java ReflectionReflectionReflectionReflection che fornisce che fornisce che fornisce che fornisce
strumenti di strumenti di strumenti di strumenti di introspezioneintrospezioneintrospezioneintrospezione e di e di e di e di dispatchingdispatchingdispatchingdispatching
� LLLL’’’’obbligo del costruttore di default ha lo scopo di obbligo del costruttore di default ha lo scopo di obbligo del costruttore di default ha lo scopo di obbligo del costruttore di default ha lo scopo di
consentire la creazione dinamica delle istanzeconsentire la creazione dinamica delle istanzeconsentire la creazione dinamica delle istanzeconsentire la creazione dinamica delle istanze
46
Introspezione e Introspezione e Introspezione e Introspezione e dispatchingdispatchingdispatchingdispatchingIntrospezione e Introspezione e Introspezione e Introspezione e Introspezione e Introspezione e Introspezione e Introspezione e dispatchingdispatchingdispatchingdispatchingdispatchingdispatchingdispatchingdispatching
� Introspezione:Introspezione:Introspezione:Introspezione: capacitcapacitcapacitcapacitàààà di descrivere le proprie di descrivere le proprie di descrivere le proprie di descrivere le proprie
caratteristiche (proprietcaratteristiche (proprietcaratteristiche (proprietcaratteristiche (proprietàààà e metodi con relativi e metodi con relativi e metodi con relativi e metodi con relativi
parametri). parametri). parametri). parametri).
� Consente lConsente lConsente lConsente l’’’’esplorazione da parte del containeresplorazione da parte del containeresplorazione da parte del containeresplorazione da parte del container
� DispatchingDispatchingDispatchingDispatching (o (o (o (o veryveryveryvery----latelatelatelate bindingbindingbindingbinding): capacit): capacit): capacit): capacitàààà di invocare di invocare di invocare di invocare
i metodi in modo completamente dinamico.i metodi in modo completamente dinamico.i metodi in modo completamente dinamico.i metodi in modo completamente dinamico.
� Estende una caratteristica tipica dellEstende una caratteristica tipica dellEstende una caratteristica tipica dellEstende una caratteristica tipica dell’’’’OOPOOPOOPOOP
� EarlyEarlyEarlyEarly----bindingbindingbindingbinding:::: sia l’interfaccia che
l’implementazione devono essere note a tempo di
compilazione
� LateLateLateLate----bindingbindingbindingbinding:::: a tempo di compilazione viene fissata
solo l’interfaccia mentre l’implementazione dei
metodi è definita a runtime
� VeryVeryVeryVery----latelatelatelate bindingbindingbindingbinding:::: sia interfaccia che
implementazione sono definite solo a runtime
47
EsempioEsempioEsempioEsempioEsempioEsempioEsempioEsempio
� Creiamo un Creiamo un Creiamo un Creiamo un beanbeanbeanbean che espone due proprietche espone due proprietche espone due proprietche espone due proprietàààà in sola in sola in sola in sola
lettura lettura lettura lettura ---- ore e minuti ore e minuti ore e minuti ore e minuti ---- e ci de ci de ci de ci dàààà llll’’’’ora correnteora correnteora correnteora corrente
Import java.util.*public class CurrentTimeBean {
private int hours;private int minutes;public CurrentTimeBean() {
Calendar now = Calendar.getInstance();this.hours = now.get(Calendar.HOUR_OF_DAY);this.minutes = now.get(Calendar.MINUTE);
}public int getHours(){ return hours; }public int getMinutes(){ return minutes; }
}
48
JSP e JSP e JSP e JSP e JSP e JSP e JSP e JSP e JavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBean
� Le JSP prevedono una serie di Le JSP prevedono una serie di Le JSP prevedono una serie di Le JSP prevedono una serie di tagtagtagtag per agganciare un per agganciare un per agganciare un per agganciare un
beanbeanbeanbean e utilizzare le sue propriete utilizzare le sue propriete utilizzare le sue propriete utilizzare le sue proprietàààà allallallall’’’’interno della interno della interno della interno della
pagina:pagina:pagina:pagina:
� Sono di tre tipi:Sono di tre tipi:Sono di tre tipi:Sono di tre tipi:
� Tag per creare un riferimento al bean (creazione di
un’istanza)
� Tag per impostare il valore delle proprietà del bean
� Tag per leggere il valore delle proprietà del bean e
inserirlo nel flusso della pagina
49
Esempio di uso di Esempio di uso di Esempio di uso di Esempio di uso di Esempio di uso di Esempio di uso di Esempio di uso di Esempio di uso di beanbeanbeanbeanbeanbeanbeanbean
<jsp:useBean id="user" class="RegisteredUser" scope ="session"/>
<jsp:useBean id="news" class="NewsReports" scope="r equest"><jsp:setProperty name="news" property="category" va lue="fin."/><jsp:setProprety name="news" property="maxItems" va lue="5"/>
</jsp:useBean>
<html><body>
<p>Bentornato<jsp:getProperty name="user" property="fullName"/> ,la tua ultima visita è stata il <jsp:getProperty name="user" property="lastVisitDat e"/> .</p><p>Ci sono <jsp:getProperty name="news" property="newItems"/>nuove notizie da leggere.</p>
</body></html>
50
TagTagTagTagTagTagTagTag jspjspjspjspjspjspjspjsp::::::::useBeanuseBeanuseBeanuseBeanuseBeanuseBeanuseBeanuseBean
� Sintassi: Sintassi: Sintassi: Sintassi: <jsp:useBean id="beanName" class="class“
scope="page |request|session|application"/>
� Inizializza e crea il riferimento al Inizializza e crea il riferimento al Inizializza e crea il riferimento al Inizializza e crea il riferimento al beanbeanbeanbean
� Gli attributi principali sono Gli attributi principali sono Gli attributi principali sono Gli attributi principali sono idididid e e e e classclassclassclass e scopee scopee scopee scope
� id è il nome con cui l’istanza del bean verrà indicata
nel resto della pagina
� class è la classe Java che definisce il bean
� scope definisce l’ambito di accessibilità e il tempo
di vita dell’oggetto (il default è page)
51
Tempo di vita dei Tempo di vita dei Tempo di vita dei Tempo di vita dei Tempo di vita dei Tempo di vita dei Tempo di vita dei Tempo di vita dei beanbeanbeanbeanbeanbeanbeanbean
� Per default ogni volta che una pagina JSP viene Per default ogni volta che una pagina JSP viene Per default ogni volta che una pagina JSP viene Per default ogni volta che una pagina JSP viene
richiesta e processata viene creata unrichiesta e processata viene creata unrichiesta e processata viene creata unrichiesta e processata viene creata un’’’’istanza del istanza del istanza del istanza del
beanbeanbeanbean (scope di default = (scope di default = (scope di default = (scope di default = pagepagepagepage))))
� Con lCon lCon lCon l’’’’attributo scope attributo scope attributo scope attributo scope èèèè possibile estendere la vita del possibile estendere la vita del possibile estendere la vita del possibile estendere la vita del
beanbeanbeanbean oltre la singola richiesta:oltre la singola richiesta:oltre la singola richiesta:oltre la singola richiesta:
Tempo di vita dell’applicazione
Tempo di vita della sessione
Fino alla fine dell’elaborazione della richiesta e ala restituzione della rispostal
Fino a quando la pagina viene completata o fino al forward
Tempo di vitaTempo di vitaTempo di vitaTempo di vita
Richiesta corrente e ogni altra richiesta che fa parte della stessa applicazione
application
Richiesta corrente e tutte le altre richieste dello stesso client
session
La pagina corrente, quelle incluse e quelle a cui si fa il forward
request
Solo la pagina correntepage
AccessibilitAccessibilitAccessibilitAccessibilitààààScopeScopeScopeScope
52
TagTagTagTagTagTagTagTag jspjspjspjspjspjspjspjsp::::::::getPropertygetPropertygetPropertygetPropertygetPropertygetPropertygetPropertygetProperty
� Sintassi: Sintassi: Sintassi: Sintassi:
<jsp:getPropertyname="beanName" property=" propName"/>
� Consente lConsente lConsente lConsente l’’’’accesso alle proprietaccesso alle proprietaccesso alle proprietaccesso alle proprietàààà del del del del beanbeanbeanbean
� Produce come output il valore della proprietProduce come output il valore della proprietProduce come output il valore della proprietProduce come output il valore della proprietàààà del del del del beanbeanbeanbean
� Il Il Il Il tagtagtagtag non ha mai body e ha solo 2 attributi: non ha mai body e ha solo 2 attributi: non ha mai body e ha solo 2 attributi: non ha mai body e ha solo 2 attributi:
� name: nome del bean a cui si fa riferimento
� property : nome della proprietà di cui si vuole
leggere il valore
53
Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di Esempio 1: uso di CurrentTimeBeanCurrentTimeBeanCurrentTimeBeanCurrentTimeBeanCurrentTimeBeanCurrentTimeBeanCurrentTimeBeanCurrentTimeBean
<jsp:useBean id="time" class="CurrentTimeBean"/><html>
<body><p>Sono le ore
<jsp:getProperty name="time" property=“hours"/> e<jsp:getProperty name="time" property="minutes"/> minuti.
</p></body>
</html>
<html><body>
<p>Sono le ore12 e 18 minuti.></p>
</body></html>
JSP
Output HTML
54
Esempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un poEsempio 2: un caso un po’’’’’’’’ pipipipipipipipiùùùùùùùù complessocomplessocomplessocomplessocomplessocomplessocomplessocomplesso
<jsp:useBean id="style" class="beans.CorporateStyle Bean"/><html>
<body bgcolor=" <jsp:getProperty name="style“ property="color"/> "><center>
<img src=" <jsp:getProperty name="style" property="logo "/>">Welcome to Big Corp!
</center></body>
</html>
<html><body bgcolor="pink" >
<center><img src="http://imageserver/logo.gif">Welcome to Big Corp!
</center></body>
</html>
JSP
Output HTML
55
TagTagTagTagTagTagTagTag jspjspjspjspjspjspjspjsp::::::::setPropertysetPropertysetPropertysetPropertysetPropertysetPropertysetPropertysetProperty
� Sintassi:Sintassi:Sintassi:Sintassi:
<jsp:setPropertyname="beanName"property=" propName"value=" propValue"/>
� Consente di modificare il valore delle proprietConsente di modificare il valore delle proprietConsente di modificare il valore delle proprietConsente di modificare il valore delle proprietàààà del del del del
beanbeanbeanbean
� Esempi:Esempi:Esempi:Esempi:
<jsp:setProperty name="user" property="daysLeft" value="30"/>
<jsp:setProperty name="user" property="daysLeft" value="<%=15*2%>"/>
56
ProprietProprietProprietProprietProprietProprietProprietProprietàààààààà indicizzateindicizzateindicizzateindicizzateindicizzateindicizzateindicizzateindicizzate
� I I I I beanbeanbeanbean tagtagtagtag non supportano le proprietnon supportano le proprietnon supportano le proprietnon supportano le proprietàààà indicizzateindicizzateindicizzateindicizzate
� Però un Però un Però un Però un beanbeanbeanbean èèèè un normale oggetto Java: un normale oggetto Java: un normale oggetto Java: un normale oggetto Java: èèèè quindi quindi quindi quindi
possibile accedere a variabili e metodi.possibile accedere a variabili e metodi.possibile accedere a variabili e metodi.possibile accedere a variabili e metodi.
� Esempio:Esempio:Esempio:Esempio:
<jsp:useBean id=“ weather " class=“weatherForecasts"/>
<p><b>Previsioni per domani:</b>: <%= weather.getForecasts(0) %></p>
<p><b>Resto della settimana:</b><ul>
<% for (int index=1; index < 5; index++) { %><li><%= weather.getForecasts(index) %></li>
<% } %></ul></p>
57
JSP + JSP + JSP + JSP + JSP + JSP + JSP + JSP + JavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBeanJavaBean = = = = = = = = ModelModelModelModelModelModelModelModel 11111111
� LLLL’’’’architettura J2EE a due livelli costituita da architettura J2EE a due livelli costituita da architettura J2EE a due livelli costituita da architettura J2EE a due livelli costituita da
� JSP per il livello di presentazione
� JavaBean per il livello di business logic
viene denominata viene denominata viene denominata viene denominata ModelModelModelModel 1111
58
Custom Custom Custom Custom Custom Custom Custom Custom tagtagtagtagtagtagtagtag e e e e e e e e tagtagtagtagtagtagtagtag librarieslibrarieslibrarieslibrarieslibrarieslibrarieslibrarieslibraries
� Le JSP permettono di definire Le JSP permettono di definire Le JSP permettono di definire Le JSP permettono di definire tagtagtagtag personalizzati personalizzati personalizzati personalizzati
((((custom custom custom custom tagtagtagtag) che estendono quelli predefiniti) che estendono quelli predefiniti) che estendono quelli predefiniti) che estendono quelli predefiniti
� Una Una Una Una taglibtaglibtaglibtaglib èèèè una collezione di questi una collezione di questi una collezione di questi una collezione di questi tagtagtagtag non non non non
standard, realizzata mediante una classe Javastandard, realizzata mediante una classe Javastandard, realizzata mediante una classe Javastandard, realizzata mediante una classe Java
� Per utilizzarla si una la direttiva Per utilizzarla si una la direttiva Per utilizzarla si una la direttiva Per utilizzarla si una la direttiva taglibtaglibtaglibtaglib con la sintassi: con la sintassi: con la sintassi: con la sintassi: <%@ uri=“ tagLibraryURI" prefix=" tagPrefix"%>
� L’attributo uri fa riferimento ad un file xml, con
estensione tld (tag library descriptor), che contiene
informazioni sulle classe che implementa i tag.
� L’attributo prefix indica il prefisso da utilizzare nei
tag che fanno riferimento alla tag library (la tag
library è un namespace)
59
Definizione di Definizione di Definizione di Definizione di Definizione di Definizione di Definizione di Definizione di taglibtaglibtaglibtaglibtaglibtaglibtaglibtaglib
� Per definire una Per definire una Per definire una Per definire una tagtagtagtag librarylibrarylibrarylibrary occorrono due elementi: occorrono due elementi: occorrono due elementi: occorrono due elementi:
� Un file TLD (Tag Lib Definition) che specifica i
singoli Tag ed a quale "classe" corrispondono
� Le classi che effettivamente gestiscono i tag
� Il file TLD Il file TLD Il file TLD Il file TLD èèèè un file XML che specifica: un file XML che specifica: un file XML che specifica: un file XML che specifica:
� i tag che fanno parte della libreria
� i loro eventuali attributi
� il "body" del tag (se esiste)
� la classe Java che gestisce il tag
� Dovremo quindi sviluppare le classi che Dovremo quindi sviluppare le classi che Dovremo quindi sviluppare le classi che Dovremo quindi sviluppare le classi che
implementano il comportamento dei implementano il comportamento dei implementano il comportamento dei implementano il comportamento dei tagtagtagtag
� Una singola libreria può contenere centinaia di Una singola libreria può contenere centinaia di Una singola libreria può contenere centinaia di Una singola libreria può contenere centinaia di tagtagtagtag o o o o
uno solo.uno solo.uno solo.uno solo.
60
Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di taglibtaglibtaglibtaglibtaglibtaglibtaglibtaglib
� Un semplice esempio di file TLD Un semplice esempio di file TLD Un semplice esempio di file TLD Un semplice esempio di file TLD èèèè il seguente:il seguente:il seguente:il seguente:
<?xml version="1.0" encoding="ISO-8859-1" standalon e="no" ?><!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Libr ary 1.1//EN""http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_ 1.dtd">
<taglib><tlibversion>1.0</tlibversion><jspversion>1.1</jspversion><shortname> hellolib </shortname><uri> hellodir </uri><tag>
<name>helloWorld </name><tagclass> helloTagClass </tagclass><bodycontent>emtpy</bodycontent><attribute>
<name>who</name><required>true</required>
</attribute></tag>
</taglib>
61
Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di Esempio di taglibtaglibtaglibtaglibtaglibtaglibtaglibtaglib
� Questo file stabilisce che:Questo file stabilisce che:Questo file stabilisce che:Questo file stabilisce che:
� la versione della libreria è la 1.0 (tlibversion )
� il nome della libreria è hellolib (attributo
shortname ),
� i file .class si trovano nella directory hellodir(attributo uri ).
� Viene definito un solo Viene definito un solo Viene definito un solo Viene definito un solo tagtagtagtag denominato denominato denominato denominato helloWorld:
� Senza contenuto (bodycontent èèèè empty )
� con solo "attributo“, denominato who, obbligatorio (required è true )
� "gestito" dalla classe denominata helloTagClass
62
Uso della Uso della Uso della Uso della Uso della Uso della Uso della Uso della taglibtaglibtaglibtaglibtaglibtaglibtaglibtaglib
� Innanzitutto inseriamo nella JSP la direttiva che Innanzitutto inseriamo nella JSP la direttiva che Innanzitutto inseriamo nella JSP la direttiva che Innanzitutto inseriamo nella JSP la direttiva che
include la libreria di include la libreria di include la libreria di include la libreria di tagtagtagtag ::::
<%@ taglib uri=“hellolib.tld" prefix=“htl" %>
� Il prefisso definisce un Il prefisso definisce un Il prefisso definisce un Il prefisso definisce un namespacenamespacenamespacenamespace e quindi elimina le e quindi elimina le e quindi elimina le e quindi elimina le
eventuali omonimie causate dalleventuali omonimie causate dalleventuali omonimie causate dalleventuali omonimie causate dall’’’’inclusione di piinclusione di piinclusione di piinclusione di piùùùù
librerielibrerielibrerielibrerie
� Possiamo quindi usare il Possiamo quindi usare il Possiamo quindi usare il Possiamo quindi usare il tagtagtagtag con la sintassi:con la sintassi:con la sintassi:con la sintassi:
<htl:helloWorld who=“Mario">
63
Implementazione del Implementazione del Implementazione del Implementazione del Implementazione del Implementazione del Implementazione del Implementazione del tagtagtagtagtagtagtagtag
� Dobbiamo scrivere una apposita classe Java che Dobbiamo scrivere una apposita classe Java che Dobbiamo scrivere una apposita classe Java che Dobbiamo scrivere una apposita classe Java che estende estende estende estende TagSupport
� TagSupport èèèè la classe base per i la classe base per i la classe base per i la classe base per i tagtagtagtag "semplici", per "semplici", per "semplici", per "semplici", per
quelli complessi sono disponibili altre classi basequelli complessi sono disponibili altre classi basequelli complessi sono disponibili altre classi basequelli complessi sono disponibili altre classi base
� La classe deve implementareLa classe deve implementareLa classe deve implementareLa classe deve implementare
� i metodi doStartTag() e doEndTag()� Una coppia di metodi di accesso (set AttrName() e
get AttrName() per ogni attributo
� doStartTag() utilizza lutilizza lutilizza lutilizza l’’’’oggetto out restituito da oggetto out restituito da oggetto out restituito da oggetto out restituito da
PageContextPageContextPageContextPageContext per scrivere nellper scrivere nellper scrivere nellper scrivere nell’’’’output della pagina e se output della pagina e se output della pagina e se output della pagina e se
il il il il tagtagtagtag non ha nessun "bodynon ha nessun "bodynon ha nessun "bodynon ha nessun "body““““ deve ritornare come deve ritornare come deve ritornare come deve ritornare come valore la costante valore la costante valore la costante valore la costante SKIP_BODY
� doEndTag() restituisce usualmente la costante restituisce usualmente la costante restituisce usualmente la costante restituisce usualmente la costante
EVAL_PAGEche indica che dopo il che indica che dopo il che indica che dopo il che indica che dopo il tagtagtagtag prosegue la prosegue la prosegue la prosegue la
normale elaborazione della paginanormale elaborazione della paginanormale elaborazione della paginanormale elaborazione della pagina
64
ImplementazioneImplementazioneImplementazioneImplementazioneImplementazioneImplementazioneImplementazioneImplementazione
import javax.servlet.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;
public class helloTagClass extends TagSupport{
private String who;public int doStartTag() throws JspException{
trypageContext.getOut().println("Hello"+ <br>");
catch( Exception e )throw new JspException( "taglib:" + e.getMessage() );
return SKIP_BODY;}public int doEndTag(){ return EVAL_PAGE; }public void setWho (String value){ who = value; }public String getWho (){ return who; }
}
65
Esempio di usoEsempio di usoEsempio di usoEsempio di usoEsempio di usoEsempio di usoEsempio di usoEsempio di uso
� Scriviamo una versione di Scriviamo una versione di Scriviamo una versione di Scriviamo una versione di HelloWorldHelloWorldHelloWorldHelloWorld che utilizza la che utilizza la che utilizza la che utilizza la
nostra nostra nostra nostra tagtagtagtag librarylibrarylibrarylibrary::::
<%@ taglib uri=“hellolib.tld" prefix=“htl" %><html>
<body><htl:helloWorld
who=<%=request.getParameter("name")%></body>
</html>