MokaByte 92 - Gennaio 2005
La Java Server Pages Standard Tag Library
II parte - La libreria core
di
Alfredo Larotonda
La libreria core della JSTL è quella che comprende le funzionalità di più comune utilizzo. Esaminiamo i vari tag che la compongono

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.

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it