Introduzione
Nel precedente articolo abbiamo presentato la
JSTL ed abbiamo evidenziato i benefici che si
possono ottenere dalla scrittura di pagine JSP
scriptless. Con l'introduzione nella J2EE della
JSTL è oggi possibile scrivere praticamente
tutto in una pagina JSP senza la necessità
di ricorrere a codice Java. La libreria core della
JSTL comprende alcuni dei tag maggiormente utilizzati
che si possono suddividere nelle seguenti tipologie:
- Generali
- Controllo
di flusso
- Iterazione
- Import
e url
Nei
seguenti paragrafi analizzeremo i diversi tag
appartenenti alle categorie citate.
Ai tag della libreria core faremo sempre riferimento
utilizzando il prefisso c che è quello
più usato e che per coerenza useremo nel
seguito.
Tag
di utilizzo generale
In questa categoria rientrano tag per scrivere
output nella pagina, per settare o rimuovere variabili
e per gestire le eccezioni.
Il tag <c:out>
Il tag <c:out> consente di scrivere in output
il contenuto di variabili di diverso scope o il
risultato di espressioni valutate con il linguaggio
EL. E' molto più duttile del <jsp:getProperty>
che consente esclusivamente di scrivere il valore
di un attributo di un bean. Con il <c:out>,
così come con tutti gli altri tag della
JSTL, è possibile utilizzare la notazione
tipica del JSTL che consente di navigare tra gli
attributi di oggetti mediante il punto. Supponendo
di aver memorizzato in uno scope un oggetto con
il nome utente che ha come attributo un oggetto
di nome indirizzo che a sua volta ha un attributo
di tipo String di nome via, con la seguente notazione:
<c:out
value="${utente.indirizzo.via}" />
potremo
scrivere in output il valore dell'attributo via
in questione. Per stampare un valore costante
si può semplicemente scrivere
<c:out
value="Ciao" />
Molto
più utile è utilizzare espressioni
come ad esempio
<c:out
value="${a + b}" />
In
questo caso in output sarà scritto il risultato
ottenuto dalla valutazione dell'espressione contenuta
tra ${}. Il tag out oltre all'attributo value
contenente il valore da scrivere in output, accetta
un attributo default che consente di scrivere
in output un valor prefissato qualora per qualche
motivo la valutazione dell'espressione non vada
a buon fine.
E' molto importante sottolineare che il <c:out>
effettua in automatico l'escape dei caratteri
che possono avere un qualche significato in HTML
o XML , e questa è una caratteristica che
lo rende molto utile e consigliabile.
Il
tag <c:set>
Con il tag <c:set> è possibile assegnare
valori a variabili a seguito della valutazione
di una espressione. L'espressione è indicata
come argomento dell'attributo value. Il risultato
è assegnato alla variabile specificata
in var. Lo scope della variabile è specificato
dall'attributo scope.
Ad esempio:
<c:set
var="risultato" value="${7 + 1}"
scope="page" />
assegna
alla variabile risultato il valore 8 e la memorizza
nello scope page. Il risultato dell'espressione
può essere di qualsiasi tipo.
Il
tag <c:remove>
Il tag remove consente di eliminare da uno scope
una variabile. Il suo utilizzo è piuttosto
ovvio ed immediato.
<c:remove
var="risultato" scope="page"
/>
In
questo modo si rimuove la variabile risultato
dallo scope page.
Il
tag <c:catch>
Il tag catch consente di intercettare eccezioni
verificatesi all'interno della pagina. In realtà
il funzionamento de <c:catch> è più
simile , facendo un paragone con Java, al ciò
che accade in un blocco try. Il codice del quale
si vogliono intercettare le eccezioni va posto
all'interno del blocco <c:catch> </c:catch>.
Se non si specifica altro, in caso di eccezione
questa viene intercettata e l'elaborazione continua
dalla riga seguente alla chiusura del blocco <c:catch>.
E' possibile però specificare l'attributo
var che consente di assegnare ad una variabile
l'eccezione eventualmente verificatasi. In questo
caso è possibile all'uscita dal blocco
<c:catch> acquisire informazioni sull'eccezione
e fare test in base al verificarsi o meno dell'eccezione
stessa.
Tag
per il controllo di flusso
Tutti coloro che hanno scritto in passato pagine
JSP sanno come queste possano diventare di difficile
lettura e manutenzione quando le si riempiano
di blocchi if/else codificati con scriptlet Java.
Fortunatamente la JSTL ci fornisce i tag per ovviare
completamente a questo inconveniente.
Il
tag <c:if>
L'utilizzo del tag if è estremamente semplice.
Come argomento dell'attributo test si inserisce
l'espressione da valutare. Il risultato sotto
forma di variabile booleana è assegnato
alla variabile indicata nell'attributo var memorizzata
nello scope indicato dall'attributo scope. Qualora
l'espressione contenuta in test venga valutata
a true , il codice inserito all'interno dei tag
<c:if>..</c:if> viene eseguito, come
nell'esempio seguente:
<c:if
test="${utente.nome == 'mario'}">
<c:out value="="${utente.nome} />
</c:if>
L'utilizzo
del tag if è abbastanza ovvio, ma la cosa
importante è che il suo utilizzo consente
di scrivere in una forma più compatta e
pulita i test condizionali all'interno di un apagina
JSP e cosa importante in modo più comprensibile
a chi non ha dimestichezza con il linguaggio Java
come uno sviluppatore di pagine web.
Il
tag <c:when> <c:otherwise>
Un difetto del tag if è che non prevede
una struttura simile all'istruzione else di Java.
Ovvero in caso di test tra più valori bisognerebbe
inserire tanti blocchi if ed inoltre non è
possibile prevedere un valore che comprenda tutti
quelli non testati come si fa comunemente con
l'else. A tale scopo però la JSTL fornisce
la struttura <c:when> <c:otherwise>.
Il when - otherwise è simile ad una struttura
switch-case anche se a differenza di questa ultima
è più flessibile in quanto consente
di testare valori che non siano solo interi.
Un tipico esempio è il seguente:
<c:choose>
<c:when test="${ utente.nome == 'mario'}">
<li>Mario</li>
</c:when>
<c:when test="${ utente.nome == 'antonio'}">
<li>Antonio</li>
</c:when>
<c:when test="${ utente.nome == 'giuseppe'}">
<li>Giuseppe</li>
</c:when>
<c:otherwise>
<li>Altro utente</li>
</c:otherwise>
</c:choose>
In
questo caso vengono valutati diversi possibili
valori dell'espressione oggetto del test. In ogni
blocco when viene effettuata una elaborazione
corrispondente ad uno dei valori. Nel blocco otherwise
viene effettuata l'elaborazione prevista per tutti
gli altri casi. E' evidente che scrivere una struttura
del genere utilizzando codice Java o anche solo
il tag <c:if> sarebbe molto più oneroso
e di difficile lettura.
Tag
di iterazione
Un'altra delle operazioni più frequenti
nelle pagine JSP è l'esecuzione di un loop.
Il caso più comune è la costruzione
delle righe di una tabella HTML in modo dinamico.
La JSTL risolve anche questa casistica mediante
il tag forse in assoluto più utilizzato
il <c:forEach>
Il
tag <c:forEach>
Il forEach consente di eseguire dei loop su collection
o array in modo estremamente semplice. L'espressione
associata all'attributo items deve essere una
collection o un array contenuto in un qualche
scope. L'elemento della collection o dell'array
relativo alla singola iterazione è assegnato
alla variabile indicata nell'attributo var. Se
ad esempio vogliamo stampare in una tabella HTML
il contenuto di una collection di nome utenti
contenenti oggetti di un tipo Utente ciascuno
dei quali ha un attributo userid potremmo fare
così:
<table>
<c:forEach items="${utenti}" var="utente"
>
<tr><td><c:out value="${utente.userid}"
/></td></tr>
</c:forEach>
</table>
Si
comprende immediatamente quanto sia più
pulito ed elegante scrivere un loop senza ricorrere
a codice Java e quanto sia più leggibile
il risultato. Il tag forEach ha poi altri attributi
quali begin,end e step che consentono di iterare
su parti della collection con salti prefissati
di indice, e l'attributo varStatus che consente
di esporre una variabile contenente attributi
sullo stato del ciclo quali ad esempio l'indice
corrente contenuto nell'attributo index.
Tag
di import e gestione url
In questa ultima categoria rientrano qui tag che
consentono di includere del contenuto esterno
in uan pagina JSP , di formattare e scrivere url
e di effettuare delle redirect ad un altro url.
Il
tag <c:import>
Il tag import introduce un ulteriore meccanismo
per l'inclusione in una pagina JSP di contenuto
esterno, oltre alla direttiva include per l'inclusione
statica di contenuto ed alla standard action <jsp:include>
per l'inclusione dinamica di contenuto. La diferenza
tra il tag <c:url> e i suoi predecessori
e che rende possibile includere contenuto anche
riferendosi a risorse presenti al di fuori della
web application corrente, mediante URL assoluti
o facendo riferimento a contesti diversi da quello
corrente. L'URL viene indicato come valore dell'attributo
url e il suo contenuto può essere assegnato
come stringa alla variabile indicata nell'attributo
var memorizzata nello scope indicato da scope.
Esiste anche un attributo opzionale context che
consente di specificare un contesto diverso da
quello corrente.
Esempi di utilizzo di un URL assoluto e di un
URL frutto della valutazione di una espressione
sono riportati di seguito:
<c:import
url="http://www.mokabyte.it"/>
<c:import
url="${requestScope.indirizzo}"/>
Il
tag <c:url>
Il tag url consente di formattare url utilizzati
come hyperlink all'interno della pagine. E' molto
utile in quanto esegue in automatico sia l'url
rewriting per il mantenimento della sessione sia
l'encoding dei parametri eventualmente accodati
all'url stesso. I parametri possono essere inseriti
in coda all'url in modo molto semplice con l'utilizzo
del tag <c:param>. L'URL formattato può
essere assegnato ad un avariabile indicata nell'attributo
var.
Di seguito è riportato un semplice utilizzo
del tag nel caso in cui si voglia invocare una
risorsa passando ad essa dei parametri:
<c:url
value="/login.do" var="myUrl">
<c:param name="param1" value="1"/>
<c:param name="param2" value="2"/>
</c:url>
<a href="<c:out value="${myUrl}"
/>" />
Il
tag <c:redirect>
Come dice il suo nome il tag redirect consente
di effettuare una redirect ad un url prefissato.
Il suo utilizzo è piuttosto ovvio:
<c:redirect
url="newPage.jsp"/>
C'è
da osservare che anche con il tag redirect è
possibile specificare un context con l'attributo
context.
Conclusioni
In questo articolo abbiamo fatto una panomarica
sui tag che costituiscono la libreria core della
JSTL. Lo scopo era quello di illustrare le varie
funzionalità offerte e non di fornire un
reference completo della libreria per il quale
si rimanda alla bibliografia. E' molto importante
però sapere che tutte le operazioni che
prima bisognava compiere utilizzando del codice
Java all'interno delle pagine JSP possono oggi
essere assolte dai tag della JSTL, che conferiscono
alle pagine stesse leggibilità, stile e
facilità di manutenzione.
Bibliografia
[1] Bryan Basham, Kathy Sierra, Bert Bates - "Head
First - Servlet & Jsp", O'Reilly, 2004
[2] Autori Vari - "The J2EE 1.4 Tutorial
", Sun Microsystems, 2003
Alfredo
Larotonda, laureato in Ingegneria Elettronica,
lavora da diversi anni nel settore IT. Dal 1999
si occupa di Java ed in particolare dello sviluppo
di applicazioni web J2EE. Dopo diverse esperienze
di disegno e sviluppo ora si occupa in particolare
di aspetti architetturali per progetti rivolti
al mercato finanziario ed industriale. Ha conseguito
le certificazioni SCJP, SCWCD 1.3, SCWCD 1.4,
SCBCD.
|