Tecnologie lato Server:
JSP (Java Server Pages)
Stefano Clemente
[email protected]
© 2005 Stefano Clemente
I lucidi sono in parte realizzati con materiale tratto dal libro di testo adottato tradotto in italiano:
© 2002 Prentice Hall
H. M. Deitel, P. J. Deitel, T. R. Nieto
Internet & World Wide Web – How To Program (Second Edition)
Riferimenti bibliografici
• H. M. Deitel, P. J. Deitel, T. R. Nieto
Internet & World Wide Web – How
To Program (Second Edition)
ed. Prentice Hall 2002
Capitolo 31 (sul CD allegato al libro)
• http://java.sun.com/developer/onlineTra
ining/JSPIntro/contents.html
• http://jakarta.apache.org
6 Dicembre 2005
Stefano Clemente
2
Introduzione
• JSP sono formate da
− componenti HTML e XML
− appositi tag JSP
− parti opzionali di codice Java dette “scriptlet”
• JSP estende l’API servlet
• Differenze tra JSP e Servlet
− Le Servlet è una tecnologia di programmazione che
richiede esperienza nella programmazione
− JSP si rivolgono a un “pubblico” più ampio, in
quanto utilizzabili sia dagli sviluppatori che dai
disegnatori di pagine
6 Dicembre 2005
Stefano Clemente
3
Introduzione
• Separazione del contenuto statico da quello
dinamico
− Con JSP la logica della generazione del contenuto
dinamico è separata dalle parti statiche attraverso
l’uso di componenti JavaBeans; queste componenti
vengono create e usate dalle pagine JSP attraverso
tag ad hoc e scriptlet e ogni modifica alla pagina
JSP comporta la ricompilazione automatica della
pagina e il ricaricamento nel web server da parte
dello stesso motore JSP
• Write Once Run Anywhere
− La tecnologia JSP usa questo paradigma per le
pagine interattive; le pagine JSP possono essere
portate su varie piattaforme e web server senza
modifiche
6 Dicembre 2005
Stefano Clemente
4
Introduzione
• Il contenuto dinamico può essere inviato in
vari formati
− Le JSP possono essere richieste da vari client
•
•
•
•
Browser
Cellulari
PDA
Applicazioni B2B che fanno uso di XML
• Consigliate per applicazioni client/server a nlivelli
• Sfruttano la potenza delle Servlet
− Le JSP sono un’astrazione ad alto livello delle
Servlet e consentono di fare tutto ciò che si può
fare con le Servlet, ma in modo più semplice
6 Dicembre 2005
Stefano Clemente
5
Introduzione
• Le JavaServer Pages (JSP) sono un’estensione
della tecnologia Servlet
• Sono progettate per semplificare l’invio di
contenuti dinamici
• Package addizionali
− Package javax.servlet.jsp
• Contiene la maggior parte delle classi e dei metodi di JSP
− Package javax.servlet.jsp.tagtest
• Contiene le classi e i metodi per i custom tag
6 Dicembre 2005
Stefano Clemente
6
Componenti di JSP
• Direttive
− Sono messaggi al JSP-Container che permettono di specificare
• impostazioni della pagina
• includere contenuti da altre risorse
• specificare tag definiti dall’utente da utilizzare
• Azioni
− incapsulano funzionalità in tag predefiniti che il
programmatore può inserire nella JSP
− spesso eseguite in base alla richiesta inviata dal client
− creano anche oggetti Java per le Scriptlets
• Scriptlets (SCRIPTing eLEmenTS)
− permettono di inserire codice Java nelle JSP (e altre
componenti dell’applicazione web) per eseguire la richiesta del
client
• Librerie di Tag
− sono parte del meccanismi di estensione dei tag che permette
al programmatore di creare dei propri tag
6 Dicembre 2005
Stefano Clemente
7
JSP o Servlets?
• JSP
− somigliano ai documenti XHTML
− usati quando la maggior parte del contenuto è
statico
• Servlets
− usate quando la maggior parte del contenuto è
dinamico
• JSP e Servlets sono intercambiabili
• la prima volta che viene richiesta, una JSP è compilata in
una Servlet
• hanno lo stesso ciclo di vita
− jspInit
− jspService
− jspDestroy
6 Dicembre 2005
Stefano Clemente
8
Esempio 1
6 Dicembre 2005
Stefano Clemente
9
Esempio 1: clock.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.1: clock.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv = "refresh" content = "60" />
<title>A Simple JSP Example</title>
<style type = "text/css">
.big { font-family: helvetica, arial, sans-serif;
font-weight: bold;
font-size: 2em; }
</style>
</head>
6 Dicembre 2005
Stefano Clemente
10
Esempio 1: clock.jsp
<body>
<p class = "big">Simple JSP Example</p>
<table style = "border: 6px outset;">
<tr>
<td style = "background-color: black;">
<p class = "big" style = "color: cyan;">
<!-- JSP expression to insert date/time -->
<%= new java.util.Date() %>
</p>
</td>
</tr>
</table>
</body>
Espressione JSP
</html>
6 Dicembre 2005
Stefano Clemente
11
Esempio 1
6 Dicembre 2005
Stefano Clemente
12
Oggetti Impliciti
• Gli Oggetti Impliciti forniscono ai programmatori la
possibilità di accedere a molte proprietà delle Sevlet
nel contesto però delle JSP
• Gli Oggetti Impliciti hanno quattro tipi di portata
− applicazione (application scope)
• oggetti posseduti dal JSP/Servlet Container manipolabili da
Servlet e Applicazioni
− pagina (page scope)
• sono gli oggetti che esistono solo nella pagina che li definisce e
che vengono istanziati ad ogni richiesta di quella pagina
− richiesta (request scope)
• sono gli oggetti che esistono solo per la durata di una richiesta
(es. una richiesta che per essere soddisfatta richiama più Servlet)
− sessione (session scope)
• oggetti che esistono per l’intera durata di una sessione di
navigazione di un client
6 Dicembre 2005
Stefano Clemente
13
Oggetti Impliciti
Oggetto Implicito
Descrizione
Application
application
Oggetto javax.servlet.ServletContext che rappresenta il contenitore nel quale la JSP è
eseguita
Page Scope
config
exception
out
page
pageContext
response
Oggetto javax.servlet.ServletConfig che rappresenta le opzioni di configurazione di JSP.
Oggetto java.lang.Throwable che rappresenta l’eccezione passata alla pagina di errore JSP.
Disponibile solo nella pagina di errore JSP.
Oggetto javax.servlet.jsp.JspWriter che scrive testo come parte della risposta a una
richiesta. È usato in modo implicito con le espressioni JSP e le azioni che inseriscono stringhe nella
risposta.
Oggetto java.lang.Object che rappresenta il riferimento this nell’istanza corrente.
Oggetto javax.servlet.jsp.PageContext che nasconde i dettagli implementativi dei
contenitori servlet e JSP, ma permette l’accesso agli oggetti impliciti da parte dei programmatori.
Questo oggetto è la risposta al client. È solitamente un’istanza dell’oggetto HttpServletResponse
(package javax.servlet.http). Nel caso in cui venga usato un protocollo diverso da HTTP,
questo oggetto è l’istanza di una classe che implementa javax.servlet.ServletResponse.
Request Scope
request
Questo oggetto rappresenta la richiesta del client. Normalmente è un’istanza della classe che
implementa HttpServletRequest (package javax.servlet.http). Nel caso venga usato un
protocollo diverso da HTTP è un’istanza della sottoclasse javax.servlet.ServletRequest.
Session Scope
session
6 Dicembre 2005
Oggetto javax.servlet.http.HttpSession che rappresenta le informazioni della sessione del
client se una sessione è stata creata. Disponibile solo nelle pagine che partecipano a una sessione.
Stefano Clemente
14
Scripting
• Permette di inserire del codice Java nelle
pagine JSP aggiungendo così contenuti
dinamici
• Componenti
− Scriptlets (Script Elements)
• Delimitati da <% e %>
• Blocchi di codice Java
− Commenti
• Commenti Scriptlet delimitati da / e /
• Commenti JSP delimitati da <%-- e --%>
• Commenti XHTML delimitati da <!-- e -->
− Espressioni
• Delimitate da <%= and %>
• Risultati convertiti in oggetti String
6 Dicembre 2005
Stefano Clemente
15
Scripting
• … Componenti
− Dichiarazioni
• Delimitate da <%! e %>
• Definiscono variabili e metodi
• Richiedono il ; finale
− Sequenze di Escape
• Permettono di visualizzare nella risposta al client le
sequenze di caratteri usate come solitamente come
delimitatori
−
−
−
−
−
6 Dicembre 2005
<\%
%/>
\’
\”
\\
Stefano Clemente
16
Esempio 2
6 Dicembre 2005
Stefano Clemente
17
Esempio 1: welcome.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.4: welcome.jsp -->
<!-- JSP that processes a "get" request containing data. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<!-- head section of document -->
<head>
<title>Processing "get" requests with data</title>
</head>
<!-- body section of document -->
<body>
<% // begin scriptlet
String name = request.getParameter( "firstName" );
if ( name != null ) {
%> <%-- end scriptlet to insert fixed template data --%>
<h1>
Hello <%= name %>, <br />
6 Dicembre 2005
Stefano Clemente
18
Esempio 1: welcome.jsp
Welcome to JavaServer Pages!
</h1>
<% // continue scriptlet
} // end if
else {
%> <%-- end scriptlet to insert fixed template data --%>
<form action = "welcome.jsp" method = "get">
<p> Type your first name and press Submit</p>
<p><input type = "text" name = "firstName" />
<input type = "submit" value = "Submit" />
</p>
</form>
<% // continue scriptlet
}
// end else
%> <%-- end scriptlet --%>
</body>
</html>
<!-- end XHTML document -->
6 Dicembre 2005
Stefano Clemente
19
Azioni Standard
• Permettono di eseguire alcune tra le più
comuni azioni eseguite in JSP
− Inclusione dei contenuti di un’altra risorsa
− Inoltro di richieste di altre risorse
− Interazione con i JavaBeans
• Sono elaborate dal JSP Container al momento
della richiesta della risorsa
• Sono delimitate dai tag <jsp:action> e
</jsp:action>
− Nel caso in cui non vi fosse niente da includere tra
il tag di inizio e quello di chiusura si può usare
<jsp:action />
6 Dicembre 2005
Stefano Clemente
20
Azioni Standard
Azione
Descrizione
<jsp:include>
Include dinamicamente un’altra risorsa in una JSP. Quando la JSP è eseguita la risorsa
riferita viene inclusa e elaborata.
Inoltra una richiesta a un’altra JSP, servlet o pagina statica. L’azione termina
l’esecuzione della JSP corrente.
Permette di includere un plug-in in una pagina sotto forma di un object specifico del
browser o di un elemento embed HTML. Nel caso di applet Java, l’azione abilita il
<jsp:forward>
<jsp:plugin>
<jsp:param>
download e l’installazione del Java Plug-in, se non già installato sul client.
Usato con le azioni include, forward e plugin per specificare coppie di
informazioni addizionali del tipo nome/valore da usare con queste azioni.
Manipolazione di JavaBean
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
6 Dicembre 2005
Specifica che la JSP usa un’istanza JavaBean. Quest’azione specifica la portata del
bean e assegna a esso un ID che i componenti di scripting possono utilizzare per
manipolare il bean.
Imposta le proprietà dell’istanza JavaBean specificata. Una caratteristica di
quest’azione è il matcheiing automatico dei parametri con le propreità del bean aventi
lo stesso nome.
Riceve una proprietà dall’istanza JavaBean e converte il risultato in una stringa per
l’uso nella risposta al client.
Stefano Clemente
21
<jsp:include>
• JSP fornisce due tipi di meccanismi di
inclusione
− Azione <jsp:include>
• Permette che contenuti dinamici siano inclusi in una risorsa
• Se il contenuto della risorsa inclusa cambia tra due
richieste, sarà incluso nella prossima richiesta della JSP
contenente l’azione <jsp:include>
− Direttiva include
• Include la risorsa una sola volta, vale a dire nel momento
della traduzione della JSP
• Se la risorsa inclusa cambia, il nuovo contenuto non si
riflette nella JSP a meno di ricompilazione di quest’ultima
6 Dicembre 2005
Stefano Clemente
22
<jsp:include>
• Attributi di <jsp:include>
− page
• Specifica la URI della risorsa da includere
• La risorsa deve essere parte della stessa
applicazione
− flush
• Specifica se il buffer deve essere ripulito dopo
l’esecuzione dell’inclusione
• In JSP 1.1 questo attributo deve valere true
6 Dicembre 2005
Stefano Clemente
23
Esempio 3
• Viene mostrato l’uso dell’azione
<jsp:include> attraverso l’inclusione di
contenuti sia statici sia dinamici
• Il documento include.jsp include tre altri
documenti
− banner.html
− toc.html
− clock2.jsp
• In particolare include.jsp è una tabella che:
− nella parte alta mostra banner.html
− a sinistra mostra toc.html
− a destra mostra clock2.jsp
6 Dicembre 2005
Stefano Clemente
24
Esempio 3
6 Dicembre 2005
Stefano Clemente
25
Esempio 3: banner.html
<!-- banner to include in another document -->
<div style = "width: 580px">
<p>
Java(TM), C, C++, Visual Basic(R),
Object Technology, and <br /> Internet and
World Wide Web Programming Training <br />
On-Site Seminars Delivered Worldwide
</p>
<p>
<a href = "mailto:[email protected]">
[email protected]</a><br />
978.579.9911<br />
490B Boston Post Road, Suite 200,
Sudbury, MA 01776
</p>
</div>
6 Dicembre 2005
Stefano Clemente
26
Esempio 3: toc.html
<!-- contents to include in another document -->
<p><a href = "http://www.deitel.com/books/index.html">
Publications/BookStore
</a></p>
<p><a href = "http://www.deitel.com/whatsnew.html">
What's New
</a></p>
<p><a href = "http://www.deitel.com/books/downloads.html">
Downloads/Resources
</a></p>
<p><a href = "http://www.deitel.com/faq/index.html">
FAQ (Frequently Asked Questions)
</a></p>
<p><a href = "http://www.deitel.com/intro.html">
Who we are
</a></p>
<p><a href = "http://www.deitel.com/index.html">
Home Page
</a></p>
<p>Send questions or comments about this site to
<a href = "mailto:[email protected]">
[email protected]
</a><br />
Copyright 1995-2002 by Deitel & Associates, Inc.
All Rights Reserved.
</p>
6 Dicembre 2005
Stefano Clemente
27
Esempio 3: clock2.jsp
<!-- Fig. 10.9: clock2.jsp
-->
<!-- date and time to include in another
document -->
<table>
<tr>
<td style = "background-color: black;">
<p class = "big" style = "color: cyan;
font-size: 3em;
font-weight: bold;">
<%= new java.util.Date() %>
</p>
</td>
</tr>
</table>
6 Dicembre 2005
Stefano Clemente
28
Esempio 3: include.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.7: include.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Using jsp:include</title>
<style type = "text/css">
body {
font-family: tahoma, helvetica, arial, sansserif;
}
6 Dicembre 2005
Stefano Clemente
29
Esempio 3: include.jsp
table, tr, td {
font-size: .9em;
border: 3px groove;
padding: 5px;
background-color: #dddddd;
}
</style>
</head>
<body>
<table>
<tr>
<td style = "width: 160px; textalign: center">
<img src = "images/logotiny.png"
width = "140" height = "93"
6 Dicembre 2005
Stefano Clemente
30
Esempio 3: include.jsp
/>
alt = "Deitel & Associates, Inc. Logo"
</td>
<td>
<%-- include banner.html in this JSP --%>
<jsp:include page = "banner.html"
flush = "true" />
</td>
</tr>
<tr>
<td style = "width: 160px">
6 Dicembre 2005
Stefano Clemente
31
Esempio 3: include.jsp
"true" />
<%-- include toc.html in this JSP --%>
<jsp:include page = "toc.html" flush =
</td>
<td style = "vertical-align: top">
<%-- include clock2.jsp in this JSP --%>
<jsp:include page = "clock2.jsp"
flush = "true" />
</td>
</tr>
</table>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
32
<jsp:forward>
• Permette di inoltrare una richiesta a un’altra
risorsa
• La richiesta alla pagina JSP originaria
contenente l’azione <jsp:forward> termina
non appena viene inoltrata la richiesta
• <jsp:forward> ha solo un attributo page che
specifica l’URI della risorsa (all’interno della
stessa applicazione)
6 Dicembre 2005
Stefano Clemente
33
Esempio 4
6 Dicembre 2005
Stefano Clemente
34
Esempio 4: forward1.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.11: forward1.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Forward request to another JSP</title>
</head>
<body>
<% // begin scriptlet
String name = request.getParameter( "firstName" );
if ( name != null ) {
%> <%-- end scriptlet to insert fixed template data --%>
<jsp:forward page = "forward2.jsp">
<jsp:param name = "date"
value = "<%= new java.util.Date() %>" />
</jsp:forward>
6 Dicembre 2005
Stefano Clemente
35
Esempio 4: forward1.jsp
<% // continue scriptlet
} // end if
else {
%> <%-- end scriptlet to insert fixed template data --%>
<form action = "forward1.jsp" method = "get">
<p>Type your first name and press Submit</p>
<p><input type = "text" name = "firstName" />
<input type = "submit" value = "Submit" />
</p>
</form>
<%
// continue scriptlet
}
// end else
%> <%-- end scriptlet --%>
</body>
</html>
<!-- end XHTML document -->
6 Dicembre 2005
Stefano Clemente
36
Esempio 4: forward2.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- forward2.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Processing a forwarded request</title>
<style type = "text/css">
.big {
font-family: tahoma, helvetica, arial, sansserif;
font-weight: bold;
font-size: 2em;
}
</style>
</head>
6 Dicembre 2005
Stefano Clemente
37
Esempio 4: forward2.jsp
<body>
<p class = "big">
Hello <%= request.getParameter( "firstName" ) %>,
<br />
Your request was received <br /> and forwarded at
</p>
<table style = "border: 6px outset;">
<tr>
<td style = "background-color: black;">
<p class = "big" style = "color: cyan;">
<%= request.getParameter( "date" ) %>
</p>
</td>
</tr>
</table>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
38
<jsp:param>
• Permette di specificare coppie di parametri
nome/valore da passare alle azioni
− <jsp:include>
− <jsp:forward>
− <jsp:plugin>
• <jsp:param> ha due attributi:
− name che specifica il nome del parametro
− value che specifica il valore del parametro
• Se <jsp:param> specifica un parametro già
esistente nella richiesta, il valore passato con
essa ha precedenza su quello della richiesta
6 Dicembre 2005
Stefano Clemente
39
Esempio 5
6 Dicembre 2005
Stefano Clemente
40
Esempio 5: forward3.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.11: forward3.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Forward request to another JSP</title>
</head>
<body>
<% // begin scriptlet
String name = request.getParameter( "firstName" );
if ( name != null ) {
%> <%-- end scriptlet to insert fixed template data --%>
<jsp:forward page = "forward2.jsp">
<jsp:param name = "firstName"
value = "Pippo" />
<jsp:param name = "date"
value = "<%= new java.util.Date() %>" />
</jsp:forward>
6 Dicembre 2005
Stefano Clemente
41
Esempio 5: forward3.jsp
<% // continue scriptlet
} // end if
else {
%> <%-- end scriptlet to insert fixed template data --%>
<form action = "forward3.jsp" method = "get">
<p>Type your first name and press Submit</p>
<p><input type = "text" name = "firstName" />
<input type = "submit" value = "Submit" />
</p>
</form>
<%
// continue scriptlet
}
// end else
%> <%-- end scriptlet --%>
</body>
</html>
<!-- end XHTML document -->
6 Dicembre 2005
Stefano Clemente
42
Esempi 4 e 5: File
6 Dicembre 2005
Stefano Clemente
43
<jsp:plugin>
• Permette di aggiungere Applet o JavaBean a
una pagina sotto forma di un oggetto specifico
del browser o di un elemento XHTML embed
− Applet = … (v. gruppo di lucidi TecnInt8.pdf)
− JavaBean = componente software riutilizzabile
manipolabile in modo visuale attraverso dei tool per
costruzione software Java, es.
• semplici elementi GUI come i bottoni
• componenti software visuali come visualizzatori di DB o
fogli di dati
• elementi senza nessuna apparenza grafica, ma che
possono essere composti insieme in modo visuale
attraverso degli “application builder”
6 Dicembre 2005
Stefano Clemente
44
<jsp:plugin>
• L’azione abilita il client al download e all’installazione
del plug-in nel caso questo non lo avesse già
Attributo
Descrizione
type
code
codebase
align
archive
Tipo del plug-in: bean o applet
Classe del plug-in
Locazione della classe specificata con code o degli archivi specificati con archive
Allineamento
Una lista di nomi di file archivio separati da spazi. Questi file contengono risorse
usate dal plug-in. Un archivio può inccludere anche la classe specificata con code
(cfr. applet – TecnInt8.pdf).
Altezza del plug-in nella pagina (pixel o percentuale).
Spazio in pixel a destra e a sinistra della componente.
Versione di Java Runtime Environment e plug-in richiesti per eseguire il plug-in. Il
valore di default è 1.1.
Nome del plug-in.
Spazio in pixel al di sopra e al di sotto del plug-in.
Descrizione del plug-in.
Ampiezza del plug-in nella pagina (pixel o percentuale).
Locazione per il download del plug-in Java per Netscape Navigator.
Locazione per il download del plug-in Java per Internet Explorer.
height
hspace
jreversion
name
vspace
title
width
nspluginurl
iepluginurl
6 Dicembre 2005
Stefano Clemente
45
Esempio 6
Applet
6 Dicembre 2005
Stefano Clemente
46
Esempio 6: ShapesApplet.java
// Fig. 10.x: ShapesApplet.java
// Applet that demonstrates a Java2D GeneralPath.
package advjhtp1.jsp.applet;
// Java core packages
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
// Java extension packages
import javax.swing.*;
public class ShapesApplet extends JApplet {
// initialize the applet
public void init()
{
// obtain color parameters from XHTML file
6 Dicembre 2005
Stefano Clemente
47
Esempio 6: ShapesApplet.java
try {
int red = Integer.parseInt( getParameter( "red" ) );
int green = Integer.parseInt( getParameter( "green" ) );
int blue = Integer.parseInt( getParameter( "blue" ) );
Color backgroundColor = new Color( red, green, blue );
}
setBackground( backgroundColor );
// if there is an exception while processing the color
// parameters, catch it and ignore it
catch ( Exception exception ) {
// do nothing
}
}
public void paint( Graphics g )
{
6 Dicembre 2005
Stefano Clemente
48
Esempio 6: ShapesApplet.java
// create arrays of x and y coordinates
int xPoints[] =
{ 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 };
int yPoints[] =
{ 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 };
// obtain reference to a Graphics2D object
Graphics2D g2d = ( Graphics2D ) g;
// create a star from a series of points
GeneralPath star = new GeneralPath();
// set the initial coordinate of the GeneralPath
star.moveTo( xPoints[ 0 ], yPoints[ 0 ] );
// create the star--this does not draw the star
for ( int k = 1; k < xPoints.length; k++ )
star.lineTo( xPoints[ k ], yPoints[ k ] );
6 Dicembre 2005
Stefano Clemente
49
Esempio 6: ShapesApplet.java
// close the shape
star.closePath();
// translate the origin to (200, 200)
g2d.translate( 200, 200 );
// rotate around origin and draw stars in random colors
for ( int j = 1; j <= 20; j++ ) {
g2d.rotate( Math.PI / 10.0 );
g2d.setColor(
new Color( ( int ) ( Math.random() * 256 ),
( int ) ( Math.random() * 256 ),
( int ) ( Math.random() * 256 ) ) );
}
}
}
6 Dicembre 2005
g2d.fill( star );
// draw a filled star
Stefano Clemente
50
Esempio 6: plugin.jsp
<html>
<head>
<title>Using jsp:plugin to load an applet</title>
</head>
<body>
<jsp:plugin type = "applet"
code = "com.deitel.advjhtp1.jsp.applet.ShapesApplet"
codebase = "/advjhtp1/jsp"
width = "400"
height = "400">
<jsp:params>
<jsp:param name = "red" value = "255" />
<jsp:param name = "green" value = "255" />
<jsp:param name = "blue" value = "0" />
</jsp:params>
</jsp:plugin>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
51
Esempio 6
6 Dicembre 2005
Stefano Clemente
52
Esempio 6: File JSP
6 Dicembre 2005
Stefano Clemente
53
Esempio 6: File Applet (Plug-in)
6 Dicembre 2005
Stefano Clemente
54
<jsp:usebean>
• Permette alle JSP di manipolare degli oggetti Java
• L’azione crea un oggetto o ne individua uno esistente
per l’uso nella JSP
Attributo
Descrizione
id
Il nome che sarà usato per manipolare l’oggetto Java attraverso le azioni
<jsp:setProperty> e <jsp:getProperty>. Una variabile con questo nome è anche
dichiarata per l’uso negli script delle JSP. Il nome è case-sensitive.
scope
La portata dell’oggetto Java (page, request, session o application). La portata di default
è page.
class
Il nome completo della classe dell’oggetto Java.
beanName
Il nome del bean che può essere usato con il metodo instantiate della classe
java.beans.Beans per caricare un JavaBean in memoria.
type
Il tipo del JavaBean. Può essere dello stesso tipo dell’attributo class, una super-classe di quel
tipo o un’interfaccia implementata da quel tipo. Il valore di default è lo stesso dell’attributo
class. Se l’oggetto Java non è dello stesso tipo specificato con l’attributo type, viene
generata un’eccezione ClassCastException
6 Dicembre 2005
Stefano Clemente
55
<jsp:usebean>
• Se non vengono specificati gli attributi class
e beanName, il JSP-container cerca di
individuare un oggetto del tipo specificato con
l’attributo type
• Proprio come gli oggetti impliciti, gli oggetti
specificati con <jsp:usebean> hanno portate
dei tipi page, request, session, application
− gli oggetti con portata di tipo page possono essere
acceduti solo nella JSP in cui sono definiti
− più JSP possono accedere gli oggetti con i restanti
tipi di portata
6 Dicembre 2005
Stefano Clemente
56
Esempio 7
6 Dicembre 2005
Stefano Clemente
57
Esempio 7: Rotator.java(Bean)
// Fig. 10.17: Rotator.java
// A JavaBean that rotates advertisements.
package com.deitel.advjhtp1.jsp.beans;
public class Rotator {
private String images[] = { "images/jhtp3.jpg",
"images/xmlhtp1.jpg", "images/ebechtp1.jpg",
"images/iw3htp1.jpg", "images/cpphtp3.jpg"};
private String links[] = {
"http://www.amazon.com/exec/obidos/ASIN/0130125075/"
"deitelassociatin",
"http://www.amazon.com/exec/obidos/ASIN/0130284173/"
"deitelassociatin",
"http://www.amazon.com/exec/obidos/ASIN/013028419X/"
"deitelassociatin",
"http://www.amazon.com/exec/obidos/ASIN/0130161438/"
"deitelassociatin",
"http://www.amazon.com/exec/obidos/ASIN/0130895717/"
"deitelassociatin" };
6 Dicembre 2005
Stefano Clemente
+
+
+
+
+
58
Esempio 7: Rotator.java(Bean)
private int selectedIndex = 0;
// returns image file name for current ad
public String getImage()
{
return images[ selectedIndex ];
}
// returns the URL for ad's corresponding Web site
public String getLink()
{
return links[ selectedIndex ];
}
}
// update selectedIndex so next calls to getImage and
// getLink return a different advertisement
public void nextAd()
{
selectedIndex = ( selectedIndex + 1 ) % images.length;
}
6 Dicembre 2005
Stefano Clemente
59
Esempio 7: adrotator.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.18: adrotator.jsp -->
<jsp:useBean id = "rotator" scope = "session"
class = "com.deitel.advjhtp1.jsp.beans.Rotator" />
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>AdRotator Example</title>
<style type = "text/css">
.big { font-family: helvetica, arial, sansserif;
font-weight: bold;
font-size: 2em; }
6 Dicembre 2005
Stefano Clemente
60
Esempio 7: adrotator.jsp
</style>
<%-- update advertisement --%>
<% rotator.nextAd(); %>
</head>
<body>
<p class = "big">AdRotator Example</p>
<p>
<a href = "<jsp:getProperty name = "rotator"
property = "link" />">
<img src = "<jsp:getProperty name = "rotator"
property = "image" />" alt =
"advertisement" />
</a>
</p>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
61
Esempio 7: adrotator1.jsp
</style>
<%-- update advertisement --%>
<% rotator.nextAd(); %>
</head>
<body>
<p class = "big">AdRotator Example</p>
<p>
<a href = "<%= rotator.getLink() %>">
<img src = "<%= rotator.getImage() %>"
alt = "advertisement" />
</a>
</p>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
62
Esempio 7: File JSP
6 Dicembre 2005
Stefano Clemente
63
Esempio 7: File JavaBean (Plug-in)
6 Dicembre 2005
Stefano Clemente
64
<jsp:getProperty>
• Serve per ottenere valori dal bean
• Ha due attributi
− name – il nome del bean
− property – la proprietà da recuperare
• Quando il JSP-container incontra
<jsp:getProperty name = "abc" property = "xyz"
/>
cerca di invocare getXyz dall’oggetto abc
• Equivale a scrivere l’espressione JSP
<%= abc.getXyz() %>
6 Dicembre 2005
Stefano Clemente
65
<jsp:setProperty>
• Serve per settare valori nel bean
Attributo
Descrizione
name
L’ID del JavaBean del quale si vuole settare una o più proprietà.
property Il nome della proprietà che si vuole settare. Assegnando a questo attributo il valore "*", JSP confronta I
parametri della richiesta con quelli del bean: per ogni parametro che corrisponde (per esempio il nome del
parametro della richiesta è identico al nome della proprietà del bean) la corrispondente proprietà del bean
viene settata; se il valore del parametro della richiesta è “” il valore della proprietà del bean rimane
invariato.
param
Se i nomi dei parametri della richiesta non corrispondono ai nomi delle proprietà del bean, questo attributo
serve per specificare quale parametro della richiesta deve essere usato per settare la specifica proprietà
del bean. È un attributo opzionale. Se omesso, i nomi dei parametri della richiesta devono corrispondere a
quelli delle proprietà del bean
value
Valore da assegnare alla proprietà del bean. Il valore è in genere il risultato di un’espressione JSP. Questo
attributo è utile per settare proprietà del bean non settabili attraverso i parametri della richiesta. È opzionale
e se omesso la proprietà del JavaBean deve essere di un tipo di dati che può essere settato con i
parametri della richiesta.
6 Dicembre 2005
Stefano Clemente
66
Esempio 8
1
2
6 Dicembre 2005
Stefano Clemente
67
Esempio 8: GuestBean.java
// Fig. 10.20: GuestBean.java
// JavaBean to store data for a guest in the guestbook.
package com.deitel.advjhtp1.jsp.beans;
public class GuestBean {
private String firstName, lastName, email;
// set the guest's first name
public void setFirstName( String name )
{
firstName = name;
}
// get the guest's first name
public String getFirstName()
{
return firstName;
}
// set the guest's last name
public void setLastName( String name )
6 Dicembre 2005
Stefano Clemente
68
Esempio 8: GuestBean.java
{
}
lastName = name;
// get the guest's last name
public String getLastName()
{
return lastName;
}
// set the guest's email address
public void setEmail( String address )
{
email = address;
}
}
// get the guest's email address
public String getEmail()
{
return email;
}
6 Dicembre 2005
Stefano Clemente
69
Esempio 8: GuestDataBean.java
// GuestDataBean.java
// Class GuestDataBean makes a database connection and supports
// inserting and retrieving data from the database.
package com.deitel.advjhtp1.jsp.beans;
// Java core packages
import java.io.*;
import java.sql.*;
import java.util.*;
public class GuestDataBean {
private Connection connection;
private PreparedStatement addRecord, getRecords;
// construct TitlesBean object
public GuestDataBean() throws Exception
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String filename = "c:/web/advjhtp1/guestbook.mdb";
String database = "jdbc:odbc:Driver={Microsoft Access Driver "
+ "(*.mdb)};DBQ=";
database+= filename.trim() + ";DriverID=22;READONLY=true}";
6 Dicembre 2005
Stefano Clemente
70
Esempio 8: GuestDataBean.java
connection = DriverManager.getConnection( database ,"","");
getRecords =
connection.prepareStatement(
"SELECT firstName, lastName, email FROM guests"
);
addRecord =
connection.prepareStatement(
"INSERT INTO guests ( " +
"firstName, lastName, email ) " +
"VALUES ( ?, ?, ? )"
);
}
// return an ArrayList of GuestBeans
public List getGuestList() throws SQLException
{
List guestList = new ArrayList();
// obtain list of titles
6 Dicembre 2005
Stefano Clemente
71
Esempio 8: GuestDataBean.java
ResultSet results = getRecords.executeQuery();
// get row data
while ( results.next() ) {
GuestBean guest = new GuestBean();
guest.setFirstName( results.getString( 1 ) );
guest.setLastName( results.getString( 2 ) );
guest.setEmail( results.getString( 3 ) );
}
}
guestList.add( guest );
return guestList;
// insert a guest in guestbook database
public void addGuest( GuestBean guest ) throws SQLException
{
addRecord.setString( 1, guest.getFirstName() );
addRecord.setString( 2, guest.getLastName() );
6 Dicembre 2005
Stefano Clemente
72
Esempio 8: GuestDataBean.java
addRecord.setString( 3, guest.getEmail() );
}
addRecord.executeUpdate();
// close statements and terminate database connection
protected void finalize()
{
// attempt to close database connection
try {
getRecords.close();
addRecord.close();
connection.close();
}
}
}
// process SQLException on close operation
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
6 Dicembre 2005
Stefano Clemente
73
Esempio 8: GuestBookLogin.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> DIRETTIVA
<!-- Fig. 10.22: guestBookLogin.jsp -->
<%-- page settings --%>
<%@ page errorPage = "guestBookErrorPage.jsp" %>
<%-- beans used in this JSP --%>
<jsp:useBean id = "guest" scope = "page"
class = "com.deitel.advjhtp1.jsp.beans.GuestBean" />
<jsp:useBean id = "guestData" scope = "request"
class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean" />
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Guest Book Login</title>
<style type = "text/css">
body {
font-family: tahoma, helvetica, arial, sans-serif;
}
6 Dicembre 2005
Stefano Clemente
74
Esempio 8: GuestBookLogin.jsp
table, tr, td {
font-size: .9em;
border: 3px groove;
padding: 5px;
background-color: #dddddd;
}
</style>
</head>
<body>
<jsp:setProperty name = "guest" property = "*" />
<% // start scriptlet
if ( guest.getFirstName() == null ||
guest.getLastName() == null ||
guest.getEmail() == null ) {
%> <%-- end scriptlet to insert fixed template data --%>
<form method = "post" action = "guestBookLogin.jsp">
<p>Enter your first name, last name and email
address to register in our guest book.</p>
<table>
<tr>
6 Dicembre 2005
Stefano Clemente
75
Esempio 8: GuestBookLogin.jsp
<td>First name</td>
<td>
<input type = "text" name = "firstName" />
</td>
</tr>
<tr>
<td>Last name</td>
<td>
<input type = "text" name = "lastName" />
</td>
</tr>
<tr>
<td>Email</td>
<td>
<input type = "text" name = "email" />
</td>
</tr>
<tr>
<td colspan = "2">
6 Dicembre 2005
Stefano Clemente
76
Esempio 8: GuestBookLogin.jsp
<input type = "submit"
value = "Submit" />
</td>
</tr>
</table>
</form>
<% // continue scriptlet
} // end if
else {
guestData.addGuest( guest );
%> <%-- end scriptlet to insert jsp:forward action --%>
<%-- forward to display guest book contents --%>
<jsp:forward page = "guestBookView.jsp" />
<% // continue scriptlet
}
// end else
%> <%-- end scriptlet --%>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
77
Esempio 8: GuestBookView.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
DIRETTIVE
<!-- Fig. 10.23: guestBookView.jsp -->
<%-- page settings --%>
<%@ page errorPage = "guestBookErrorPage.jsp" %>
<%@ page import = "java.util.*" %>
<%@ page import = "com.deitel.advjhtp1.jsp.beans.*" %>
<%-- GuestDataBean to obtain guest list --%>
<jsp:useBean id = "guestData" scope = "request"
class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean"
/>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Guest List</title>
6 Dicembre 2005
Stefano Clemente
78
Esempio 8: GuestBookView.jsp
<style type = "text/css">
body {
font-family: tahoma, helvetica, arial, sans-serif;
}
table, tr, td, th {
text-align: center;
font-size: .9em;
border: 3px groove;
padding: 5px;
background-color: #dddddd;
}
</style>
</head>
<body>
<p style = "font-size: 2em;">Guest List</p>
<table>
<thead>
<tr>
6 Dicembre 2005
Stefano Clemente
79
Esempio 8: GuestBookView.jsp
<th style = "width: 100px;">Last name</th>
<th style = "width: 100px;">First name</th>
<th style = "width: 200px;">Email</th>
</tr>
</thead>
<tbody>
<% // start scriptlet
List guestList = guestData.getGuestList();
Iterator guestListIterator = guestList.iterator();
GuestBean guest;
while ( guestListIterator.hasNext() ) {
guest = ( GuestBean ) guestListIterator.next();
%> <%-- end scriptlet; insert fixed template data --%>
<tr>
6 Dicembre 2005
Stefano Clemente
80
Esempio 8: GuestBookView.jsp
<td><%= guest.getLastName() %></td>
<td><%= guest.getFirstName() %></td>
<td>
<a href = "mailto:<%= guest.getEmail() %>">
<%= guest.getEmail() %></a>
</td>
</tr>
<% // continue scriptlet
} // end while
%> <%-- end scriptlet --%>
</tbody>
</table>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
81
Esempio 8:
GuestBookErrorPage.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd">
<!-- Fig. 10.24: guestBookErrorPage.jsp -->
<%-- page settings --%>
<%@ page isErrorPage = "true" %>
<%@ page import = "java.util.*" %>
<%@ page import = "java.sql.*" %>
DIRETTIVE
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Error!</title>
6 Dicembre 2005
Stefano Clemente
82
Esempio 8:
GuestBookErrorPage.jsp
<style type = "text/css">
.bigRed {
font-size: 2em;
color: red;
font-weight: bold;
}
</style>
</head>
<body>
<p class = "bigRed">
<% // scriptlet to determine exception type
// and output beginning of error message
if ( exception instanceof SQLException ) {
6 Dicembre 2005
Stefano Clemente
83
Esempio 8:
GuestBookErrorPage.jsp
%>
An SQLException
<% }
else if ( exception instanceof
ClassNotFoundException ) {
%>
A ClassNotFoundException
<% }
else {
%>
An exception
6 Dicembre 2005
Stefano Clemente
84
Esempio 8:
GuestBookErrorPage.jsp
%>
<%-- end scriptlet to insert fixed template data --
<%-- continue error message output --%>
occurred while interacting with the guestbook
database.
<% } %>
</p>
<p class = "bigRed">
The error message was:<br />
<%= exception.getMessage() %>
</p>
<p class = "bigRed">Please try again later</p>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
85
Esempio 8: File JSP
6 Dicembre 2005
Stefano Clemente
86
Esempio 8: File JavaBean (Plug-in)
6 Dicembre 2005
Stefano Clemente
87
Esempio 8: le direttive per la
gestione degli errori
• La direttiva
<%@ page errorPage = "guestBookErrorPage.jsp" %>
è una direttiva di pagina che specifica a quale pagina inoltrare la
richiesta in caso di errore
• La direttiva
<%@ page isErrorPage = "true" %>
è una direttiva di pagina
• L’attributo isErrorPage, se settato a true, rende la JSP una
pagina di errore
• L’effetto è di abilitare la JSP all’accesso all’oggetto implicito
exception che contiene le informazioni sull’errore verificatosi
6 Dicembre 2005
Stefano Clemente
88
Direttive
• Sono messaggi al JSP-container che permettono al
programmatore di
− specificare delle impostazioni per le pagine (es. pagina di
errore)
− includere il contenuto di altre risorse
− specificare delle librerie di tag personalizzati da usare nelle
JSP
• Sono elaborate nel momento della traduzione, quindi
prima che la JSP accetti qualsiasi richiesta
• Sono delimitate da <%@ e da %>
• Sono di tre tipi
− page
− include
− taglib
6 Dicembre 2005
Stefano Clemente
89
La direttiva page
• Specifica delle impostazioni globali della JSP
all’interno del JSP-container
• Possono esistere più direttive page purchè ve
ne sia solo una per ogni attributo
− l’unica eccezione è l’attributo import che permette
alla JSP di importare i package necessari per la sua
esecuzione
Attributo
Descrizione
language
extends
Linguaggio di scripting usato nella JSP. Attualmente l’unico valore possibile è java.
Specifica la classe dalla quale la JSP tradotta sarà ereditata. Deve essere un nome
completo di package e classe.
Specifica un elenco di nomi di classi e/o package sparati da virgole che la JSP corrente
utilizzerà. Se il linguaggio di scripting è java, per default l’elenco importato è
java.lang.*, javax.servlet.*, javax.servlet.jsp.* e
javax.servlet.http.*. Se vengono specificate più import, i nomi dei package
sono trasformati in un elenco dal JSP-container
Specifica se la pagina farà parte di una sessione. I valori possibili sono true (default –
partecipa a una sessione) o false (non partecipa). Se la pagina è parte di una sessione,
l’oggetto implicito session è utilizzabile nella pagina. In caso contrario, session non è
disponibile e il suo uso
comporta un errore al momento della traduzione della JSP.
Stefano Clemente
90
import
session
6 Dicembre 2005
La direttiva page
Attributo
Descrizione
buffer
Specifica la dimensione del buffer di output usato con l’oggetto implicito out. Può valere
none quando non si vuole usare un buffer, o un valore del tipo 8kb (dimensione di
default). La specifica di JSP dice che bisogna usare un buffer almeno pari alla
dimensione di default.
Se settato al valore di default, true, indica che il bufferspecificato con out deve essere
svuotato automaticamente quando si riempie. Se false, si verificherà un errore in caso
di overflow del buffer. Deve essere settato a true se buffer vale none.
Specifica se la pagina è thread safe. Se true (default), la pagina è considerata thread
safe, e può elaborare più richieste contemporaneamente. Se false, la servlet relativa
alla pagina implementa l’interfaccia java.lang.SingleThreadModel e verrà accettata
una sola richiesta alla volta. Lo standard JSP permette più istanze delle JSP non thread
safe, in modo che il container possa gestire le richieste in modo più efficiente.
Specifica una descrizione della pagina. Si può accedere a questa informazione attraverso
il metodo getServletInfo della servlet che rappresenta la traduzione della JSP. Il
metodo è invocabile attraverso l’oggetto implicito page.
È la pagina alla quale verranno inviate le eccezioni. L’oggetto implicito exception
conterrà l’eccezione.
Specifica se la pagina è una pagina per la gestione degli errori. Se settato a true, sarà
creato l’oggetto implicito exception contenente i riferimenti all’eccezione, mentre se
settato a false (default), l’uso dell’oggetto exception nella JSP provocherà un errore
durante la traduzione.
Specifica il tipo MIME della risposta. Il default è text/html.
autoFlush
isThreadSafe
info
errorPage
isErrorPage
contentType
6 Dicembre 2005
Stefano Clemente
91
La direttiva include
• Include il contenuto di un’altra risorsa, ma
solo quando la JSP viene tradotta (a differenza
dell’azione <jsp:include>)
• L’unico attributo è
file
e specifica l’URL della pagina da includere
• L’esempio seguente riscrive l’Esempio 3
sostituendo l’azione <jsp:include> con la
direttiva include
6 Dicembre 2005
Stefano Clemente
92
Esempio 8: includeDirective.jsp
<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Fig. 10.28: includeDirective.jsp -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Using the include directive</title>
<style type = "text/css">
body {
font-family: tahoma, helvetica, arial, sans-serif;
}
table, tr, td {
font-size: .9em;
border: 3px groove;
padding: 5px;
background-color: #dddddd;
}
</style>
</head>
<body>
<table>
<tr>
<td style = "width: 160px; text-align: center">
6 Dicembre 2005
Stefano Clemente
93
Esempio 9: includeDirective.jsp
<img src = "images/logotiny.png"
width = "140" height = "93"
alt = "Deitel & Associates, Inc. Logo" />
</td>
<td>
<%-- include banner.html in this JSP --%>
<%@ include file = "banner.html" %>
</td>
</tr>
<tr>
<td style = "width: 160px">
<%-- include toc.html in this JSP --%>
<%@ include file = "toc.html" %>
</td>
<td style = "vertical-align: top">
<%-- include clock2.jsp in this JSP --%>
<%@ include file = "clock2.jsp" %>
</td>
</tr>
</table>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
94
Custom Tag Libraries
• Permettono di definire dei tag personalizzati
attraverso i quali creare contenuti dinamici
• La funzionalità è definita nelle classi Java che
implementano l’interfaccia Tag
javax.servlet.jsp.tagext
in genere estendendo la classe TagSupport o
BodyTagSupport
• Attraverso questo meccanismo un programmatore
Java può creare funzionalità complesse che possono
essere facilmente utilizzate da disegnatori di pagine
senza alcuna conoscenza di Java
− a differenza dei JavaBean, che pur permettendo di realizzare
funzionalità complesse, richiedono agli utilizzatori una certa
conoscenza di Java
6 Dicembre 2005
Stefano Clemente
95
Direttiva taglib
• È la direttiva per l’uso dei custom tag
• Ha due attributi
− uri – specifica l’URI assoluta o relativa del
descrittore della libreria di tag
− prefix – specifica il prefisso che serve per
distinguere i tag personalizzati dagli altri
• non è consentito l’uso dei prefissi jsp, jspx,
java, javax, servlet, sun e sunw
6 Dicembre 2005
Stefano Clemente
96
Implementazione dei custom
tag
• Definire
1.una classe per ogni custom tag che
implementa la funzionalità del tag
2.un descrittore della libreria tag che fornisca
al JSP container le informazioni relative alla
libreria tag e ai suoi custom tag
3.una JSP che usa il custom tag
6 Dicembre 2005
Stefano Clemente
97
Esempio 10
6 Dicembre 2005
Stefano Clemente
98
Esempio 10 – Passo 1 implementazione
custom tag: WelcomeTagHandler.java
// Fig. 10.31: WelcomeTagHandler.java
// Custom tag handler that handles a simple tag.
package com.deitel.advjhtp1.jsp.taglibrary;
// Java core packages
import java.io.*;
// Java extension packages
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class WelcomeTagHandler extends TagSupport {
// Method called to begin tag processing
public int doStartTag() throws JspException
{
// attempt tag processing
try {
// obtain JspWriter to output content
JspWriter out = pageContext.getOut();
}
// output content
out.print( "Welcome to JSP Tag Libraries!" );
// rethrow IOException to JSP container as JspException
catch( IOException ioException ) {
throw new JspException( ioException.getMessage() );
}
}
}
return SKIP_BODY;
6 Dicembre 2005
// ignore the tag's body
Stefano Clemente
99
Esempio 10 – Passo 2 implementazione
custom tag: advjhtp1-taglib.tld
<?xml version = "1.0"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<!-- a tag library descriptor -->
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>advjhtp1</shortname>
<info>
A simple tab library for the examples
</info>
<!-- A simple tag that outputs content -->
<tag>
<name>welcome</name>
<tagclass>
com.deitel.advjhtp1.jsp.taglibrary.WelcomeTagHandler
</tagclass>
<bodycontent>empty</bodycontent>
<info>
Inserts content welcoming user to tag libraries
</info>
</tag>
……… spazio per altri tag ………
</taglib>
6 Dicembre 2005
Stefano Clemente
100
Esempio 10: customTagWelcome.jsp
<?xml version = "1.0"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- Fig. 10.30: customTagWelcome.jsp
-->
<!-- JSP that uses a custom tag to output content. -->
<!-- taglib directive -->
<%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Simple Custom Tag Example</title>
</head>
<body>
<p>The following text demonstrates a custom tag:</p>
<h1>
<advjhtp1:welcome />
</h1>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
101
Esempio 10: i file .jsp e .tld
6 Dicembre 2005
Stefano Clemente
102
Esempio 10: la classe
6 Dicembre 2005
Stefano Clemente
103
Esempio 11: custom tag con
attributi
6 Dicembre 2005
Stefano Clemente
104
Esempio 11: custom tag con
attributi
6 Dicembre 2005
Stefano Clemente
105
Esempio 11:
customTagAttribute.jsp
<?xml version = "1.0"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- Fig. 10.x: customTagAttribute.jsp
-->
<!-- JSP that uses a custom tag to output content. -->
<%-- taglib directive --%>
<%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Specifying Custom Tag Attributes</title>
</head>
<body>
<p>Demonstrating an attribute with a string value</p>
<h1>
<advjhtp1:welcome2 firstName = "Paul" />
</h1>
<p>Demonstrating an attribute with an expression value</p>
<h1>
<%-- scriptlet to obtain "name" request parameter --%>
<%
String name = request.getParameter( "name" );
%>
<advjhtp1:welcome2 firstName = "<%= name %>" />
</h1>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
106
Esempio 11: Welcome2TagHandler.java
// Fig. 10.34: Welcome2TagHandler.java
// Custom tag handler that handles a simple tag.
package com.deitel.advjhtp1.jsp.taglibrary;
// Java core packages
import java.io.*;
// Java extension packages
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class Welcome2TagHandler extends TagSupport {
private String firstName = "";
// Method called to begin tag processing
public int doStartTag() throws JspException
{
// attempt tag processing
try {
// obtain JspWriter to output content
6 Dicembre 2005
Stefano Clemente
107
Esempio 11: Welcome2TagHandler.java
JspWriter out = pageContext.getOut();
}
// output content
out.print( "Hello " + firstName +
", <br />Welcome to JSP Tag Libraries!" );
// rethrow IOException to JSP container as JspException
catch( IOException ioException ) {
throw new JspException( ioException.getMessage() );
}
}
}
return SKIP_BODY;
// ignore the tag's body
// set firstName attribute to the users first name
public void setFirstName( String username )
{
firstName = username;
}
6 Dicembre 2005
Stefano Clemente
108
Esempio 11: advjhtp1-taglib.tld
………………
<!-- A tag with an attribute -->
<tag>
<name>welcome2</name>
<tagclass>
com.deitel.advjhtp1.jsp.taglibrary.Welcome2TagHandler
</tagclass>
<bodycontent>empty</bodycontent>
<info>
Inserts content welcoming user to tag libraries. Uses
attribute "name" to insert the user's name.
</info>
<attribute>
<name>firstName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
………………
6 Dicembre 2005
Stefano Clemente
109
Esempio 11: advjhtp1-taglib.tld
• L’elemento attribute specifica le
caratteristiche degli attributi del tag
− name indica il nome dell’attributo
− required indica se l’attributo è richiesto (true) o
opzionale (false)
− rtexprvalue indica se il valore può provenire da
un’espressione JSP valutata a run-time (true) o se
deve essere passato come valore letterale (false)
6 Dicembre 2005
Stefano Clemente
110
Esempio 11: i file .jsp e .tld
6 Dicembre 2005
Stefano Clemente
111
Esempio 11: la classe
6 Dicembre 2005
Stefano Clemente
112
Esempio 12: interazione con il body
6 Dicembre 2005
Stefano Clemente
113
Esempio 12: customTagBody.jsp
<?xml version = "1.0"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- customTagBody.jsp -->
<%-- taglib directive --%>
<%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Guest List</title>
<style type = "text/css">
body {
font-family: tahoma, helvetica, arial, sans-serif
}
table, tr, td, th {
text-align: center;
font-size: .9em;
border: 3px groove;
padding: 5px;
background-color: #dddddd
}
</style>
</head>
6 Dicembre 2005
Stefano Clemente
114
Esempio 12: customTagBody.jsp
<body>
<p style = "font-size: 2em">Guest List</p>
<table>
<thead>
<th style = "width: 100px">Last name</th>
<th style = "width: 100px">First name</th>
<th style = "width: 200px">Email</th>
</thead>
<%-- guestlist custom tag --%>
<advjhtp1:guestlist>
<tr>
<td><%= lastName %></td>
<td><%= firstName %></td>
<td>
<a href = "mailto:<%= email %>">
<%= email %></a>
</td>
</tr>
</advjhtp1:guestlist>
</table>
</body>
</html>
6 Dicembre 2005
Stefano Clemente
115
Esempio 12: customTagBody.jsp
• Si osservi che
− le espressioni JSP dell’elemento guestlist usano
variabili non definite nella JSP
• queste variabili sono definite dal gestore del tag quando il
tag è utilizzato
• le variabili sono definite nel PageContext cosicché
possano essere usate nella pagina
− sebbene non ci siano ripetizioni definite nella JSP, la
tabella contiene tutte le righe del DB come se
queste fossero frutto di una ripetizione
• infatti, il gestore del tag è definito in modo da iterare su
tutte le righe del DB
6 Dicembre 2005
Stefano Clemente
116
Esempio 12:
GuestBookTag.java
• Il gestore del tag istanzia GuestDataBean per
l’accesso al DB
• GuestBookTag estende la classe
BodyTagSupport che contiene i metodi
dell’interfaccia BodyTag
− doInitBody
• richiamato una sola volta dopo doStartTag e prima di
doAfterBody
• se doStartTag restituisce Tag.SKIP_BODY, non viene
richiamato
− doAfterBody
• richiamato tutte le volte che occorrono per elaborare il
corpo del tag, ogni volta che viene restituito un
Tag.EVAL_BODY_TAG
• dopo un Tag.SKIP_BODY non viene più richiamato
6 Dicembre 2005
Stefano Clemente
117
Esempio 12: GuestBookTag.java
// Fig. 10.37: GuestBookTag.java
// Custom tag handler that reads information from the guestbook
// database and makes that data available in a JSP.
package com.deitel.advjhtp1.jsp.taglibrary;
// Java core packages
import java.io.*;
import java.util.*;
// Java extension packages
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
// Deitel packages
import com.deitel.advjhtp1.jsp.beans.*;
public class GuestBookTag extends BodyTagSupport {
private String firstName;
private String lastName;
private String email;
private GuestDataBean guestData;
private GuestBean guest;
6 Dicembre 2005
Stefano Clemente
118
Esempio 12: GuestBookTag.java
private Iterator iterator;
// Method called to begin tag processing
public int doStartTag() throws JspException
{
// attempt tag processing
try {
guestData = new GuestDataBean();
List list = guestData.getGuestList();
iterator = list.iterator();
if ( iterator.hasNext() ) {
processNextGuest();
return EVAL_BODY_TAG;
}
}
else
return SKIP_BODY;
// continue body processing
// terminate body processing
// if any exceptions occur, do not continue processing
// tag's body
catch ( Exception exception ) {
6 Dicembre 2005
Stefano Clemente
119
Esempio 12: GuestBookTag.java
}
}
exception.printStackTrace();
return SKIP_BODY;
// ignore the tag's body
// process body and determine if body processing
// should continue
public int doAfterBody()
{
// attempt to output body data
try {
bodyContent.writeOut( getPreviousOut() );
}
// if exception occurs, terminate body processing
catch ( IOException ioException ) {
ioException.printStackTrace();
return SKIP_BODY; // terminate body processing
}
bodyContent.clearBody();
if ( iterator.hasNext() ) {
6 Dicembre 2005
Stefano Clemente
120
Esempio 12: GuestBookTag.java
processNextGuest();
return EVAL_BODY_TAG;
}
}
else
return SKIP_BODY;
// continue body processing
// terminate body processing
// obtains the next GuestBean and extracts its data
private void processNextGuest()
{
// get next guest
guest = ( GuestBean ) iterator.next();
pageContext.setAttribute(
"firstName", guest.getFirstName() );
pageContext.setAttribute(
"lastName", guest.getLastName() );
}
}
pageContext.setAttribute(
"email", guest.getEmail() );
6 Dicembre 2005
Stefano Clemente
121
Esempio 12:
GuestBookTagExtraInfo.java
• processNextGuest usa
PagesContext.setAttribute per specificare il
nome e il valore di ogni attributo
• Il JSP container si fa carico di creare le
variabili utilizzate nella JSP
− non può creare le variabili nel PageContext a
meno che non conosca il nome e il tipo delle
variabili
• Per specificare queste informazioni occorre
definire una classe con lo stesso nome del
gestore del tag e con ExtraInfo alla fine
− GuestBookTagExtraInfo.class
6 Dicembre 2005
Stefano Clemente
122
Esempio 12:
GuestBookTagExtraInfo.java
• ExtraInfo estende la classe TagExtraInfo
del package javax.servlet.jsp.tagext
• Il container usa le informazioni specificate da
una sottoclasse di TagExtraInfo per
determinare le variabili da creare
• Per specificare le variabili bisogna definire il
metodo getVariableInfo in override al
metodo ereditato dalla classe
− questo metodo restituisce un array di oggetti
VariableInfo che il container utilizzerà per creare
le nuove variabili nel PageContext o per
autorizzare il custom tag a utilizzarne di esistenti
6 Dicembre 2005
Stefano Clemente
123
Esempio 12:
GuestBookTagExtraInfo.java
• Il costruttore VariableInfo accetta quattro
argomenti
− il nome della variabile – String
− il nome della classe alla quale appartiene la
variabile (tipo di dati) – String
− boolean
• true – il container dovrà creare la variabile
• false – altrimenti
− portata della variabile nella JSP – intero static
• NESTED – la variabile può essere usata solo nel corpo del
custom tag
• AT_BEGIN – la variabile può essere usata ovunque nella
JSP dopo a partire dal tag di apertura del custom tag
• AT_END – la variabile può essere usata ovunque nella JSP
dopo a partire dal tag di chiusura del custom tag
6 Dicembre 2005
Stefano Clemente
124
Esempio 12:
GuestBookTagExtraInfo.java
// Fig.10.38: GuestBookTagExtraInfo.java
// Class that defines the variable names and types created by
// custom tag handler GuestBookTag.
package com.deitel.advjhtp1.jsp.taglibrary;
// Java core packages
import javax.servlet.jsp.tagext.*;
public class GuestBookTagExtraInfo extends TagExtraInfo {
// method that returns information about the variables
// GuestBookTag creates for use in a JSP
public VariableInfo [] getVariableInfo( TagData tagData )
{
VariableInfo firstName = new VariableInfo( "firstName",
"String", true, VariableInfo.NESTED );
VariableInfo lastName = new VariableInfo( "lastName",
"String", true, VariableInfo.NESTED );
VariableInfo email = new VariableInfo( "email",
"String", true, VariableInfo.NESTED );
VariableInfo varableInfo [] =
{ firstName, lastName, email };
}
}
return varableInfo;
6 Dicembre 2005
Stefano Clemente
125
Esempio 12: advjhtp1-taglib.tld
………………
<!-- A tag that iterates over an ArrayList of GuestBean -->
<!-- objects, so they can be output in a JSP
-->
<tag>
<name>guestlist</name>
<tagclass>
com.deitel.advjhtp1.jsp.taglibrary.GuestBookTag
</tagclass>
<teiclass>
com.deitel.advjhtp1.jsp.taglibrary.GuestBookTagExtraInfo
</teiclass>
<bodycontent>JSP</bodycontent>
<info>
Iterates over a list of GuestBean objects
</info>
</tag>
………………
6 Dicembre 2005
Stefano Clemente
126
Esempio 12: i file .jsp e .tld
6 Dicembre 2005
Stefano Clemente
127
Esempio 11: la classe
6 Dicembre 2005
Stefano Clemente
128
Esempio 12: i JavaBeans
6 Dicembre 2005
Stefano Clemente
129