MokaByte 59 - Gennaio 2002 
JSP Custom Tag
Creazione di componenti di visualizzazione
riutilizzabili con i Tag JSP
di
Michele
Barbagli
Come succede per l'HTML, anche nel caso delle pagine JSP, la costruzione avviene tramite l'utilizzo di tag ( .. e di scriptlet racchiuse tra <% … %>). A disposizione degli sviluppatori JSP esistono moltissime librerie di tag, che permettono di svolgere funzionalità quali l'utilizzo di componenti BEAN, azioni di redirect verso altre pagine (<jsp:forward …), etc…
Sebbene queste librerie costituiscano tutto quanto è necessario alla costruzione di applicazioni web dinamiche, dopo un po', ci si accorge di duplicare comunque più volte lo stesso codice e le stesse funzionalità. Le librerie di Tag sono la risposta a questa esigenza di riutilizzo.

Cosa sono le "Tag Libraries" ?
Le librerie di tag sono uno strumento messo a disposizione dalle specifiche JSP 1.1 che permette di costruire contenitori di tag JSP, e cioè contenitori di componenti con funzionalità riutilizzabili. Ma, a questo punto, è lecito chiedersi: Non è per questo che sono stati introdotti i JavaBeans ? Chiaramente, la risposta è che JavaBeans e Tag JSP hanno funzionalità e contesti di utilizzo in generale diversi.
Entrambi, sono componenti Java che permettono di incapsulare codice riutilizzabile; vediamo però quando è più opportuno utilizzare gli uni oppure gli altri.
I JavaBeans server-side, sono componenti non visuali, e generalmente, vengono destinati al mantenimento di informazioni di sessione ( Es. lo stato dell'utente all'interno di un' oggetto User, oppure un carrello degli acquisti nel caso di applicazioni di e-commerce).
I Tag JSP possono interagire con la pagina e si tende ad utilizzarli per incapsulare funzionalità di generazione dinamica di HTML (p.es. la tabella HTML di visualizzazione del carrello degli acquisti) oppure di controllo del percorso di navigazione in base alle informazioni di sessione (p.es. il controllo del login da inserire in cima alle pagine personali del sito).
Una delle differenze chiave tra Tag JSP e JavaBeans consiste nella maggiore interazione che i Tag hanno con il contesto (la pagina, ma anche l'application server (tramite l'oggetto ServletContext)) all'interno del quale vengono utilizzati. Possono utilizzare questa interazione per accedere ad informazioni di sessione, per fare uso di JavaBeans contenenti informazioni sullo stato attuale dell'utente e/o dell'applicazione e per accedere a risorse esterne come i file.
In sostanza, i Tag JSP possono:

  • Essere customizzati tramite attributi passati dalla pagina chiamante* sia staticamente che con valori calcolati dinamicamente;
  • Ottenere l'accesso a tutti gli oggetti disponibili nelle pagine JSP come request, response ed out;
  • Modificare la risposta generata dalla pagina chiamante*;
  • Comunicare con altri Tag, creare ed inizializzare componenti JavaBean, modificare un bean in un tag e poi riutilizzarlo in un altro tag;
  • Essere nidificati l'uno con l'altro
  • Incapsulare caratteristiche sia semplici che complicate attraverso una sintassi facile da usare e che semplifica enormemente la leggibilità di una pagina JSP

(*)N.B. Per pagina chiamante, intendiamo la pagina JSP all'interno della quale vengono inseriti


La composizione di un libreria di Tag (Tag Library)
Una Tag Library, è costituita da due componenti: un Tag Library descriptor (TLD File) ed il Tag Handler (la classe Java che ne implementa le funzionalità)
Il file TLD
Un file TLD è un documento XML che descrive la libreria. Contiene informazioni riguardanti sia la libreria nel suo complesso che il singolo tag. Viene utilizzato dal JSP container per effettuare la validazione dei tag. Tipicamente, troveremo un'intestazione seguita da elementi di definizione globale della libreria; tali elementi sono:

  • <taglib> La libreria
  • <tlibversion> La versione della libreria
  • <jspversion> Le specifiche JSP sulla quale la libreria si basa
  • <shortname> Un nome di default semplice e mnemonico. Lo shortname può essere usato per esempio come prefisso per i tag contenuti
  • <uri> Una URI opzionale che identifichi univocamente la libreria
  • <info> Informazioni descrittive sulla libreria

Successivamente, viene descritto ogni tag contenuto nella libreria. Una libreria, può contenerne uno o più; l'unico elemento richiesto obbligatoriamente per ogni tag ( mi sembra abbastanza ovvio) è la classe che lo implementa (Handler) inclusa nell'elemento <tagclass>
Chiaramente, ci sono vari altri elementi utilizzati per la descrizione di un tag. Se ci sono degli attributi associati, per ogni attributo, avremo, all' interno dell'elemento <tag> un elemento del tipo:

<attribute>
<name>tagname</name>
<required>true/false</required>
<rtexpvalue> true/false </rtexpvalue>
</attribute>

Nella classe "handler", vanno definiti metodi get/set relativi ad ogni attributo specificato con le stesse convenzioni usate nei JavaBeans.

 

 

Un esempio concreto
Passiamo adesso ad analizzare un esempio concreto dell'utilizzo di questa tecnologia; Prenderemo in esame semplice tag che implementa il classico esempio "Hello World" rivisitato con custom tag.; successivamente mostreremo come effettuare il deployment all'interno dell'application server e come utilizzarlo all'interno delle pagine.
L'Application Server utilizzato per l'esempio è l'implementazione di riferimento delle specifiche Servlet/JSP, Tomcat dell'Apache Group ( http://jakarta.apache.org ) ; l'esempio seguente è stato testato sulla versione 4.0. Per evitare di creare una nuova applicazione, installeremo ed utilizzeremo il nostro componente all'interno dell'applicazione di esempio situata nella directory webapps/examples all'interno del percorso di installazione di Tomcat (TOMCAT_HOME). Partiamo dal file TLD per che chiameremo mokalib.tld; il file deve essere salvato nella directory
%TOMCAT_HOME%/webapp/examples/WEB-INF:


<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>mokalib</shortname>
<uri>http://www.mokabyte.it/taglib</uri>
<info>Mokabyte: Esempio di Tag Library</info>
<!--Un semplice Tag -->
<tag>
<name>wellcome</name>
<tagclass>mokabyte.examples.Wellcome </tagclass>
<!--Body content può avere I seguenti valori:
empty: no body
JSP: Il contenuto di body è valutato dal container e processato dal Tag Handler
tagdependent: : Il contenuto di body viene processato solo dal Tag Handler; il codice JSP contenuto in body non viene valutato dal container .
-->
<bodycontent>empty</bodycontent>
<info>

    Il classico esempio "Hello World" rivisitato con I Tag.
</info>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

 

 

Il TAG HANDLER
Il tag viene definito in una classe denominata Handler che estende la classe base astratta TagSupport. Sarà chiaramente necessario implementare i metodi non implementati nella classe astratta e fornire i metodi get/set relativi alle proprietà che vogliamo attribuire al nostro oggetto Tag. In sostanza:

Nel nostro caso, avremo una sola proprietà name e quindi dovremo implementare i 4 metodi doStartTag, doEndTag, setName(String value), getName(). Passiamo adesso ad analizzare il codice Java corrispondente:
Chiamiamo il file Wellcome.java.
Una volta compilato, verrà generato il file

%OUTDIR%/mokabyte/examples/Wellcome.class.

Sarà necessario copiare l'intera struttura in

%TOMCAT_HOME%/webapp/examples/WEB-INF/classes

affinchè sia disponibile nel classpath della applicazione examples di TOMCAT.

package mokabyte.examples
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

// Un semplice esempio di Tag JSP per comprendere cosa viene
//
inserito nello output streamquando il Tag viene inserito
// in una pagina JSP.
public class Wellcome extends TagSupport {
   private String name=null;

   // Metodi get/set per l'attributo name come definito nel
   // file .tld per questo TAG
   public void setName(String value){
      name = value;
   }

   public String getName(){
      return(name);
   }


   // doStartTag viene chiamato dal JSP container quando
   // il TAG viene trovato.
   public int doStartTag() {
      try {
         JspWriter out = pageContext.getOut();
         out.println("<table border=\"1\">");
         if (name != null)
            out.println("<tr><td> Benvenuto/a " + name
                         + "</td></tr>");
         else
            out.println("<tr><td> Benvenuto a chi? </td></tr>");
      }
     
catch (Exception ex) {
         throw new Error("Qualcosa è andato storto.");
      }
      // Dovrò ritornare SKIP_BODY perché comunque il body è vuoto
      // come è stato specificato nel file TLD.
      return SKIP_BODY;
   }

   // doEndTag() viene chiamato dal JSP container quando viene
   // trovato il segno di chiusura del tag

   public int doEndTag(){
      try {
         JspWriter out = pageContext.getOut();
         out.println("</table>");
      }
      
catch (Exception ex){
         throw new Error("Qualcosa è andato storto.");
      }
   }
}


Registrazione della libreria
L'operazione di registrazione della libreria, permette di comunicare all' Application Server la uri (in realtà è sufficiente una URI qualsiasi purché univoca) e la locazione del file TLD associati con la libreria.
Nel file web.xml, inseriamo il testo seguente alla sezione <taglib>:

<taglib>
   <taglib-uri>
      http://www.mokabyte.it/taglib
   </taglib-uri>
   <taglib-location>
      /WEB-INF/mokalib.tld
   </taglib-location>
</taglib>

Scriviamo la pagina wellcome.jsp

<%@ taglib uri="http://www.mokabyte.it/taglib" prefix="moka" %>
<html>
<head>
<title>Il mio primo Tag JSP</title>
</head>
<body bgcolor="#ffffff">
<hr />
<moka:wellcome name="Michele"/>
<hr />
</body>
</html>

Salviamo la pagina Wellcome.jsp in

%TOMCAT_HOME%/webapp/examples/.

e proceidamo a far partire l'application Server Tomcat.
Se tutto è andato bene, potrete vedere l'output alla url

http://localhost:8080/examples/wellcome.jsp .

Facendo click destro sul browser ed andando a visualizzare il sorgente HTML, il risultato dovrebbe essere il seguente

<html>
<head>
<title> Il mio primo Tag JSP </title>
</head>
<body bgcolor="#ffffff">
<hr />
<table border="1">
<tr><td> Benvenuto Michele.</td></tr>
</table>
<hr />
</body>
</html>

 

 

Conclusioni
In questo primo articolo , abbiamo introdotto le librerie di TAG JSP, andando ad analizzare un primo esempio dell'utilizzo di questa tecnologia. Questo ci ha permesso di individuare i passi base da compiere per sviluppare ed utilizzare questi componenti.
Il passo successivo, sarà quello di integrare le nuove funzionalità nelle nostre applicazioni; l'obiettivo deve essere quello di incapsulare all'interno dei tag JSP delle funzionalità di visualizzazione e rappresentazione dei dati. Quante volte abbiamo fatto un ciclo per visualizzare una tabella di un database in una pagina HTML? Perché non farlo una volta per tutte? Per chi conosce altri linguaggi, vedremo come sia possibile realizzare per esempio un componente di visualizzazione di query SQL o di archivi in formato XML, che magari gestisca anche la paginazione e l'ordinamento

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