Java Server Java Server PagesPages -...

33
1 Java Server Java Server Java Server Java Server Pages Pages Pages Pages 2 Java Server Java Server Java Server Java Server Java Server Java Server Java Server Java Server Pages Pages Pages Pages Pages Pages Pages Pages 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 scripting scripting scripting scripting: in : in : in : in realt realt realt realtà vengono trasformate in vengono trasformate in vengono trasformate in vengono trasformate in servlet servlet servlet servlet dal container dal container dal container dal container

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>