CERCA SITEMAP FEED RSS 1280
Ultimo aggiornamento: 30 Agosto 2009

Java Server Pages

Le Java Server Pages semplificano il processo di costruzione di siti web permettendo l’inclusione di contenuti dinamici e l’interazione con le classi Java che incapsulano la logica di business che sta alla base di una web application.
Le JSP sono costituite da una combinazione di testo e tag: il testo rappresenta il contenuto informativo di una pagina web i tag jsp invece partecipano alla costruzione delle pagine dinamiche decidendone ad esempio la formattazione, effettuando eventuali controlli su condizioni ...
Compilazione ed esecuzione
Quando una Java Server Page viene richiesta il container jsp provvede a convertirla in una servlet e quindi autorizza la servlet ad elaborare la richiesta http.

La conversione avviene soltanto nei casi in cui il sorgente della pagina ha subito modifiche rispetto all’ultima conversione effettuata dal container.

In tal modo si riducono i tempi di elaborazione delle richieste e si ottiene un incremento generale delle prestazioni.
Le Java Server Pages identificano quattro tipi di tag:
  • direttive: servono a comunicare al container jsp le informazioni globali sulla pagina che determinano il processo di compilazione in servlet.
  • scripting: includono delle istruzione nel linguaggio di scripting associato alla pagina (tipicamente java).
  • commenti: sono usati per includere una documentazione alle pagine JSP
  • action: supportano diversi comportamenti e possono trasferire il controllo ai vari componenti della web application servlet, javabeans o altre java server pages.

    Tipicamente si dividono in:
    • standard: sono definiti dallo standard jsp, associati al namespace jsp e compaiono all’interno della pagina col prefisso "jsp:"
    • custom: manifestano dei comportamenti che vengono aggiunti all’ambiente mediante le API fornite dagli standard JSP e sono generalmente raggruppati in tag libraries (importate nella pagina mediante la direttiva <%@ taglib %>

Le direttive

Esistono tre tipi di direttive: page, include e taglib.

La direttiva page supporta differenti tipi di attributi e viene generalmente indicata utilizzando la seguente sintassi:
  <%@ page attribute1="value1" attribute2="value2" ... %>
i cui attributi possono assumere i seguenti valori:
  • info permette all’autore di includere una stringa di documentazione alla pagina per indicarne quelle che sono le funzionalità principali.

    Tipicamente tale attributo viene utilizzato per memorizzare anche informazioni relative all’autore, alla versione, al copyright...
      <%@ page info="autore: ...; versione: ..." %>
    
  • language permette di specificare il linguaggio di scripting utilizzato all’interno della pagina: sebbene il linguaggio Java sia quello più utilizzato è possibile specificare qualsiasi linguaggio di scripting in grado di:
    • manipolare oggetti Java (creare, modificare ed accedere a JavaBeans)
    • invocare i metodi di un oggetto Java
    • gestire le eccezioni Java
      <%@ page language="java" ... %>
    
  • contentType indica il mime type della risposta generata dalla pagina jsp (text/html, text/plain ...)
      <%@ page contentType="text/html" ... %>
    
    è possibile specificare contestualmente anche la codifica di caratteri utilizzata nel seguente modo:
      <%@ page contentType="text/html; charset = ISO-8859-1" ... %>
    
  • pageEncoding fornisce una maniera alternativa per indicare la codifica di caratteri utilizzata
      <%@ page pageEncoding="ISO-8859-1" ... %>
    
  • extends identifica la superclasse utilizzata dal container jsp per convertire la pagina in una servlet.

    Generalmente se la pagina deve essere compatibile col protocollo http la superclasse deve implementare l’interfaccia javax.servlet.jsp.HttpJspPage viceversa deve implementare l’interfaccia javax.servlet.jsp.JspPage
      <%@ page extends="miopackage.miaClasseJSP" ... %>
    
  • import permette di importare una classe o un intero package all’interno della pagina
      <%@ page import="miopackage.miaClasse, miosecondopackage.*" ...  %>
    
  • session viene usato per indicare se la pagina partecipa o meno alla gestione delle sessioni utente (aggiunge, rimuove o recupera attributi dalla sessione)
      <%@ page session="true" ...  %>
    
  • buffer permette di controllare il buffer di output della pagina jsp: se si vuole inviare direttamente il risultato della pagina jsp alla risposta http va settato a "none"
      <%@ page buffer="none" ... %>
    
    viceversa occorre indicare la dimensione del buffer in kilobytes
      <%@ page buffer="12kb" ... %>
    
  • autoFlush permette di controllare il comportamento del container jsp quando il buffer di output diventa pieno.

    Se il valore è settato a true il buffer viene automaticamente svuotato ed il contenuto inviato come risposta http viceversa se è settato a false ed il buffer è pieno viene generata un’eccezione.
      <%@ page autoFlush="true" ...  %>
    
  • isThreadSafe è usato per indicare se una volta convertita in una servlet la pagina jsp è in grado di supportare più richieste contemporaneamente: se settato a false il container jsp accoderà le richieste e le elaborerà singolarmente.
      <%@ page isThreadSafe="true" ...  %>
    
  • errorPage serve ad indicare la pagina di errore che il container jsp deve invocare qualora si verifichi un errore durante il processing della pagina jsp corrente.
      <%@ page errorPage="/error/miaPagina.jsp" ...  %>
    
  • isErrorPage viene utilizzato per indicare se la pagina viene utilizzata da una o più pagine jsp per la gestione degli errori.
      <%@ page isErrorPage="true" ...   %>
    
La direttiva include permette di includere il contenuto di un file all’interno della java server page secondo la seguente sintassi:
  <%@ include file="url" %>
La direttiva taglib viene utilizzata per includere all’interno della pagina jsp una o più tag library in grado di estenderne le funzionalità mediante i custom tags.
  <%@ taglib uri="TagLibraryURI" prefix="prefisso" %>
L’attributo uri indica la locazione del Tag Library Descriptor ed il prefix specifica il namespace con il quale saranno identificati i custom tag appartenenti a quella libreria all’interno della pagina.

Scripting e commenti

Gli elementi di scripting permettono di inserire direttamente codice Java all’interno della pagina jsp e si dividono in:
  • dichiarazioni: sono usate per definire variabili e metodi appartenenti alla pagina
    <%! int contatore=0; %>
    <%!
       public int raddoppia(int i)
       {
          return i*i*;
       }
    
    %>
    
    Le variabili definite all’interno di una dichiarazione diventano variabili istanziate all’interno della servlet quando la pagina viene compilata dal container jsp: se tali variabili vengono modificate i successivi riferimenti a queste utilizzeranno i nuovi valori.
    E’ possibile quindi in tal modo condividere una variabile fra le diverse istanze di una pagina jsp: se un thread (un’istanza della pagina) ne modifica il valore tutte le altre istanze recupereranno il nuovo valore della variabile.
  • espressioni: sono utilizzate per generare output secondo la seguente sintassi:
    <%= espressione di output%>
    
    Possono essere usate per inviare in output il valore di una variabile o il risultato di un’operazione o di un metodo.
  • scriptlet: possono contenere porzioni arbitrarie di codice Java fra i tag <% e %> che vengono eseguite ad ogni richiesta da parte di un client.
    Le variabili dichiarate all’interno di una scriptlet non vengono condivise fra le diverse istanze di una stessa pagina (ovvero fra tutti i client che ne fanno richiesta) ma di volta in volta ne vengono istanziate di nuove.
    <% ... codice java %>
    
Per aggiungere commenti alle pagine jsp è possibile utilizzare la seguente sintassi:
<%-- commenti --%>
il contenuto dei commenti verrà naturalmente tralasciato dal container jsp nel corso della compilazione della pagina in una servlet.
All’interno delle scriptlet è possibile utilizzare i commenti come nella sintassi nativa di java ovvero racchiudendoli fra i caratteri /* e */ quando occupano più di una riga o inserendoli dopo i caratteri // quando ne occupano una sola.

Action tag

Gli action tag standard, quelli cioè definiti dallo standard JSP, sono quattro:
  • forward: è utilizzato per trasferire il controllo dalla pagina jsp ad un altro web component secondo la seguente sintassi:
    <jsp:forward page="url" />
    
    E’ possibile specificare anche dei parametri che possono essere inviati insieme al forward specificando per ognuno il nome ed il valore
    <jsp:forward page="url" >
       <jsp:param name="parametro1" value="value1" />
       ...
    </jsp:forward>
    
  • include permette di includere nella pagina l’output generato da altri documenti
    <jsp:include page="url" flush="flag" />
    
    Anche in questo caso è possibile specificare dei parametri da inviare alla risorsa da includere.
    <jsp:include page="url" flush="flag" >
       <jsp:param name="parametro1" value="value1" />
       ...
    </jsp:include>
    
  • plug-in è utilizzato per generare il codice HTML necessario per includere Applet Java nella pagina.
  • use-beans permette alla pagina jsp di includere e manipolare oggetti JavaBean settando e recuperando proprietà.
    <jsp:use-bean id="identificatore" class="miopackage.mioBean" scope="session" />
    
    Il tag <jsp:use-bean> viene utilizzato per creare un bean o recuperarne uno già esistente: gli attributi class e id identificano la classe di appartenenza del bean che si vuole creare e l’ identificativo univoco del bean così da poterlo recuperare in un secondo momento.
    E’ possibile specificare un attributo type che identifica la classe con la quale si farà riferimento al bean (se ad esempio un bean implementa una determinata interfaccia è possibile fare riferimento a quel bean attraverso l’interfaccia che implementa) ed un attributo scope che imposta la visibilità del bean e può assumere i seguenti valori:
    • page: il bean è accessibile soltanto all’interno della pagina
    • request: il bean è accessibile finchè la richiesta non viene completamente elaborata e la risposta inviata al client
    • session: il bean è accessibile per tutta la durata della sessione
    • application: il bean "vive" finchè la web application non viene interrotta
Per recuperare le proprietà di un bean si utilizza il tag <jsp:getProperty> indicando come attributi il nome del bean al quale si vuole accedere ed il nome dell’attributo da recuperare come nel seguente esempio:
<jsp:getProperty name="identificatore" property="proprietà" />
Per settare le proprietà di un bean occorre invece utilizzare il tag <jsp:setProperty> indicando il nome del bean del quale si vuole settare la proprietà, il nome della proprietà e il valore.
<jsp:setProperty name="identificatore" property="proprietà" value="valore"  />
Il tag <jsp:setProperty> può essere utilizzato entro il corpo del tag <use-bean> per specificare dei parametri di inizializzazione del bean stesso:
<jsp:use-bean id="identificatore" class="miopackage.mioBean" scope="session" >
   <jsp:setProperty name="identificatore" property="proprietà1" value="valore1" />
   <jsp:setProperty name="identificatore" property="proprietà2" value="valore2" />
</jsp:use-bean>

JavaBeans

Un bean è una classe java che rispetta particolari convenzioni di design e di progettazione:
  • il costruttore del bean non riceve parametri (viene invocato dal tag <jsp:usebean> per creare il bean)
  • le proprietà del bean devono essere recuperate e impostate mediante metodi pubblici il cui nome deve essere costituito dal prefisso get o set seguito dal nome della proprietà.
Una proprietà "anno" ad esempio dovrà essere accessibile tramite i metodi:
  • public int getAnno()
  • public void setAnno(int anno)
Ecco un esempio di javabean:
public class mioBean
{
   private int anno;

   mioBean()
   {
   }

   public int getAnno()
   {
      return anno;
   }

   public void setAnno(int anno1)
   {
      anno=anno1;
   }
}
Ed il suo utilizzo all’interno della pagina JSP:
...

<jsp:use-bean id="bean1" class="mioBean" scope="session" >
   <jsp:setProperty name="bean1" property="anno" value="2007" />
</jsp:use-bean>

...

<jsp:getProperty name="bean1" property="anno" />

...

Gli oggetti impliciti

All’interno della pagina jsp è possibile accedere a degli oggetti implicitamente definiti mediante le seguenti variabili:
  • page: istanza della classe javax.servlet.jsp.HttpJspPage rappresenta la pagina jsp o meglio un’istanza della servlet nella quale la pagina è stata convertita dal container jsp.
  • config: istanza della classe javax.servlet.ServletConfig rappresenta la configurazione della servlet nella quale la pagina jsp è stata convertita
  • request: istanza della classe javax.servlet.http.HttpServletRequest rappresenta e mantiene le informazioni relative alla richiesta http che viene rivolta alla pagina jsp
  • response: istanza della classe javax.servlet.http.HttpServletResponse rappresenta la risposta http che la servlet nella quale la pagina jsp è stata convertita produce in uscita
  • out: rappresenta lo stream dati della risposta che la pagina jsp produce ed è istanza della classe javax.servlet.jsp.JspWriter.
  • session: rappresenta la sessione utente corrente ed è istanza della classe javax.servlet.http.HttpSession
  • application: rappresenta la web application del quale la pagina jsp fa parte ed è istanza della classe javax.servlet.ServletContext
  • exception: è rappresentativa di un’eccezione verificatasi e disponibile soltanto se la pagina dalla quale si accede è una error-page.
Se all’interno di una pagina jsp si vuole recuperare ad esempio un attributo di sessione è possibile scrivere:
...

<%

...

String attributo = session.getAttribute("nomeattributo");

...

%>

...
se si vuole recuperare un parametro associato alla richiesta http pervenuta si può usare il seguente codice:
...

<%

...

String parametro = request.getParameter("nomeattributo");
...

%>

...
Naturalmente è possibile invocare tutti i metodi delle classi di cui gli oggetti impliciti costituiscono un’istanza.

Java Server Pages Document

Un Java Server Page Document è una Java Server Page scritta in linguaggio xml e che di conseguenza rispetta determinate regole: ogni tag aperto deve avere un suo corrispondente tag chiuso, un unico elemento radice deve contenere tutti gli altri ...
La maggior parte dello standard JSP è già compatibile con xml, per gli elementi non compatibili viene fornita una rappresentazione alternativa xml-based.
La direttiva taglib ad esempio utilizza la seguente sintassi standard:
<%@ taglib uri="TagLibraryURI" prefix="prefisso" %>
Tale forma non è consentita in un documento xml perché non rispetta le regole definite dal linguaggio xml; la rappresentazione alternativa utilizza l’attributo xmlns che può assumere tre distinti valori:
  • un URI ovvero un identificatore univoco per la tag library
  • un URN nella forma urn:jsptld:path che punta ad una taglib inclusa nell’applicazione
  • un URN nella forma urn:jsptagdir:path che deve iniziare con WEB-INF/tags ed identifica le tag library installate nella directory indicata
L’attributo xmlns può essere inserito all’interno di qualsiasi elemento che costituisce il documento JSP e consente l’utilizzo della tag library indicata all’interno dell’elemento e di tutti i suoi figli.
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:u="urn:jsptld:/WEB-INF/tlds/mialibrary.tld"
xmlns:u="urn:jsptagdir:/WEB-INF/tags/miatagsdir"
Anche le direttive page ed include presentano una rappresentazione alternativa a quella standard e devono entrambe elementi figlio della root del documento JSP:
<jsp:directive.page ...attributi... />
<jsp:directive.include ...attributi... />
Per includere del testo statico o dinamico all’interno della pagina in maniera tale da preservarne gli spazi occorre includerlo fra i tag <jsp:text> e </jsp:text> mentre per includere dichiarazioni, espressioni o scriptlet occorre utilizzare le seguenti sintassi:
<jsp:declaration> dichiarazioni </jsp:declaration>
<jsp:expression> espressioni </jsp:expression>
<jsp:scriptlet> scriptlet </jsp:scriptlet>
L’elemento <jsp:root> rappresenta la radice del documento JSP (non è necessario in quanto è possibile indicare altri elementi come radice del documento jsp) e contiene pertanto tutti gli altri elementi costitutivi del documento: l’unico attributo richiesto è version che identifica appunto la versione delle specifiche JSP che il documento sta utilizzando ma è possibile anche utilizzare l’attributo xmlns per includere taglib utilizzabili da tutti gli elementi del documento stesso.
<jsp:root xmlns:c=http://java.sun.com/jsp/jstl/core version="2.0">
...
</jsp:root>
L’elemento <jsp:output> infine permette di dichiarare quello che è il Document Type Definition STS del documento xml e l’elemento radice del documento
<jsp:output doctype-root-element="books" doctype-system="books.dtd" />