Gli script
Gli script in JSP sono vere e proprie porzioni di codiceinserite all' interno di pagine HTML che possonorappresentare dichiarazioni o espressioni. Il codice del fileJava deve essere inserito all'interno dei tag <%%>,mentre per le dichiarazioni la sintassi cambialeggermente.
Dichiarazioni
la sintassi per le dichiarazioni è la seguente:
<%! dichiarazione %>
sia per la dichiarazioni di variabili, sia per ladichiarazione di metodi. Esempi:
<%// dichiarazione di una stringa %><% ! String stringa=new string("ciao a tutti") %><% // dichiarazione di una funzione che dati due numeri in ingresso// restituisce la loro somma %><% ! public int somma (int primo, int secondo){return (primo + secondo);}//somma %>
NOTA: Java mette a disposizione degli sviluppatori una classe(inclusa nel package java.lang) chiamata string, chepermette, appunto, la gestione delle stringhe (da notare cheda questa classe non è possibile derivare altresottoclassi). Gli oggetti di tipo string possonoessere inizializzati in più modi, ma normalmente icostruttori più utilizzati sono due:
- public String (): che costruisce una stringa vuota (perché sia allocata è necessario utilizzare l'istruzione nomeStringa=new String [ ] );
- public String (string value): che costruisce una stringa contenente la stringa value. I metodi implementati da questa classe più utilizzati sono:
- string.length (): restituisce il numero di caratteriche compongono la stringa escluso il terminatore;
- string.charAt (int i): restituisce il carattere dellastringa in posizione i;
- string.concat (string str): restituisce una nuovastringa ottenuta dalla concatenazione delle stringastring con la stringa str;
- string.equals (string str): confronta la stringastring con la stringa str, restituendotrue se risultano uguali;
- string.equals.IgnoreCase (string str): confronta lastringa string con la stringa str tenendoconto delle lettere minuscole e maiuscole;
- string.compareTo (string str): confronta la stringastring con la stringa str, restituendo 0se risultano uguali, un numero positivo se strprecede in ordine alfabetico string e un numeronegativo se str anticipa segue in ordinealfabetico string.
Espressioni
Sono utilizzate per inserire direttamente sull'output deivalori. La sintassi è la seguente:
<% espressione %>
L'espressione viene calcolata, convertita in una stringae inserita nella pagina. Questo calcolo viene effettuato inrun time, ossia quando la pagina viene richiesta, eperciò si suppone abbia completo accessoall'oggetto di interesse della richiesta.
Esempio:
<%= somma (2,3)%>
Questa istruzione se inserita all'interno dei tag
e stamperà a video l'output della funzione somma(in questo caso il numero 5, ottenuto dalla somma dei duevalori in ingresso 2 e 3).
Per semplificare queste espressioni è possibileutilizzare una serie di variabili predefinite (talvoltachiamate oggetti impliciti), le cui più importantisono:
-
RESPONSE : fornisce tutti i parametri per inviare il risultato dell'esecuzione della pagina JSP: quando un Web Server risponde ad una richiesta di un browser, tipicamente invia prima del documento vero e proprio una status line, nella quale è riportata la versione del protocollo HTTP, il codice di stato (che è un valore intero), e alcuni brevi messaggi relativi al codice di stato (ad es. "OK"). Questa operazione è effettuata tramite il metodo GetStatus dell'oggetto response. In particolare, i valori assumibili dal codice di stato sono i seguenti:
100-199: sono valori di informazione, a cui il client deve rispondere con qualche altra azione;
200-299: indicano che la request è stata effettuata con successo;
300-399: tipicamente usati per file che sono stati spostati, contengono un'intestazione di location relativa al nuovo indirizzo;
400-499: indicano un errore del client;
500-599:indicano un errore del server
Di solito ci si riferisce a queste costanti tramite il lorosignificato, per evitare errori tipografici: per esempio, perindicare al browser di continuare a visualizzare ilprecedente contenuto di una pagina in quanto non ne esistonoaltri disponibili si userà il codiceResponse.SetStatus(Response.SC_NO_CONTENT) piuttostoche Response.SetStatus(204). Uno dei valori che sipossono trovare più frequentemente è 404(SC_NOT_FOUND), il quale comunica al client che la risorsarichiesta non è reperibile a quel dato indirizzo.
- REQUEST: dà accesso ai parametri di richiesta, al tipo di richiesta (GET o POST), e all'intestazione HTTP (ad es. i cookies); permette quindi di accedere alle informazioni di intestazione specifiche del protocollo HTTP. Al momento della richiesta questo metodo incapsula le informazioni sulla richiesta del client e le rende disponibili attraverso alcuni suoi metodi. L'uso più comune è quello di accedere ai parametri inviati (i dati provenienti da un form per esempio) con il metodo getParameter("nomeParametro"), che restituisce una stringa con il valore del parametro specificato. Alto metodo molto importante è getCookies(), che restituisce un array di cookies. Gli altri metodi, i più importanti, sono:
getAttributeNames()
restituisce una variabile di tipo Enumeration contenente i nomi di tutti gli attributi coinvolti nella richiesta.getContentLength()
restituisce un intero che corrisponde alla lunghezza in byte dei dati richiesti.getContentType()
restituisce il tipo MINE della richiesta, cioè il tipo di codifica dei dati.getInputStream()
restituisce un flusso di byte che corrisponde ai dati binari della richiesta. Particolarmente utile per funzioni di upload di file da client a server.getParameter(String)
restituisce una stringa con il valore del parametro richiesto.getParameterNames()
restituisce una variabile di tipo Enumeration contente i nomi dei parametri della richiesta.getParameterValues(String)
restituisce un array contenente tutti i valori del parametro specificato (nel caso ci siano più parametri con lo stesso nome).getProtocol()
Rappresenta il protocollo e la versione della richiesta.getRemoteHost()
restituisce l'intero nome del dominio (ad es. whitehouse.gov) a cui appartiene il client richiedente.getServerName()
restituisce l'indirizzo IP del servergetServerPort()
Indica la porta alla quale il server è in ascolto, tipicamente sotto forma di numero intero.getRemoteAddr()
Restituisce in pratica l'indirizzo IP del visitatore sotto forma di una stringa (ad es. "198.137.240.15").getRemoteUser()
restituisce lo username della macchina richiedente, ed è utilizzato nei siti che richiedono una protezione.getPathInfo()
restituisce informazioni extra sul path,che vengono inserite nell'URL dopo l'indirizzo del servlet.getQueryString()
restituisce una stringa contenete l'intera querySting (tutti i caratteri dopo il punto di domanda).request.getServletPath()
restituisce il percorso relativo della pagina jsp - SESSION : Una delle funzionalità più richieste per un'applicazione Web è mantenere le informazioni di un utente lungo tutto il tempo della sua visita al sito. Questo problema è risolto dall'oggetto implicito Session che gestisce appunto le informazioni a livello di sessione, relative ad un singolo utente a partire dal suo ingresso alla sua uscita con la chiusura della finestra del browser. È possibile quindi creare applicazioni che riconoscono l'utente nelle varie pagine del sito, che tengono traccia delle sue scelte e dei suoi dati. È importante sapere che le sessioni vengono memorizzate sul server e non con dei cookies che devono però essere abilitati per poter memorizzare il così detto SessionID che consente di riconoscere il browser e quindi l'utente nelle fasi successive. I dati di sessione sono quindi riferiti e riservati ad un utente a cui viene creata un'istanza dell'oggetto Session e non possono essere utilizzati da sessioni di altri utenti. Per memorizzare i dati all'interno dell'oggetto session è sufficiente utilizzare il metodo setAttribute specificando il nome dell'oggetto da memorizzare e una sua istanza. Per esempio, per memorizzare il nome dell'utente al suo ingresso alla pagina ed averlo a disposizione i seguito e sufficiente fare session.setAttribute("nomeUtente" , nome) a patto che nome sia un oggetto di tipo stringa che contenga il nome dell'utente. La lettura di una variabile di sessione precedentemente memorizzata è possibile grazie al metodo getAttribute che ha come unico ingresso il nome della variabile di sessione con cui avevamo memorizzato il dato che ci interessa reperire. Session.getAttribute("nomeUtente") restituisce il nome dell'utente memorizzato come visto in precedenza; se non vengono trovate corrispondenza con il nome dato in ingresso, restituisce null. Queste 2 sono le operazioni fondamentali relative all'oggetto session, mentre altri metodi utili sono : getAttributeNames() (restituisce un oggetto di tipo enumerativo di stringhe contenente i nomi di tutti gli oggetti memorizzati nella sessione corrente), getCreationTime() (restituisce il tempo di quando è stata creata la sessione), getId()(restituisce una stringa contenente il sessionID che come detto permette di identificare univocamente una sessione),getLastAccesedTime() (restituisce il tempo dall'ultima richiesta associata alla sessione corrente) ,getMaxInactiveInterval() (restituisce un valore intero che corrisponde all'intervallo massimo di tempo tra una richiesta dell'utente ad un'altra della stessa sessione),removeAttribute(nome_attributo) rimuove l'oggetto dal nome specificato dalla sessione corrente.
- OUT : Questo oggetto ha principalmente funzionalità di stampa di contenuti. Con il metodo print(oggetto/variabile) è possibile stampare qualsiasi tipo di dato, come anche per println() che a differenza del precedente termina la riga andando a capo. Si capisce comunque che l'andare o meno a capo nella stampa dei contenuti serve solo a migliorare la leggibilità del codice HTML. Si noti che Out è utilizzata quasi esclusivamente negli scriptlets, mentre le espressioni sono messe direttamente nello stream di output e quindi necessitano raramente di fare riferimento a out esplicitamente;
- SETBUFFERSIZE(int): imposta la dimensione in byte del buffer per il corpo della risposta, escluse quindi le intestazioni;
- FLUSHBUFFER(): forza l'invio dei dati contenuti nel buffer al client;
- CONFIG: permette di gestire tramite i suoi metodi lo startup del servlet associato alla pagina JSP, di accedere quindi a parametri di inizializzazione e di ottenere riferimenti e informazioni sul contesto di esecuzione del servlet stesso;
- EXCEPTION: questo oggetto è accessibile solo dalle pagine di errore (dove la direttiva isErrorPage è impostata a true). Contiene le informazioni relative all'eccezione sollevata in una pagina in cui il file è stato specificato come pagina di errore. Il metodo principale è getMessage() che restituisce una stringa con la descrizione dell'errore;
- APPLICATION : consente di accedere alle costanti dell'applicazione e di memorizzare oggetti a livello di applicazione e quindi accessibili da qualsiasi utente per un tempo che va dall'avvio del motore JSP alla sua chiusura, in pratica fino allo spegnimento del server. Gli oggetti memorizzati nell'oggetto application come appena detto sono visibili da ogni utente e ogni pagina può modificarli. Per memorizzare i dati all'interno dell'oggetto application è sufficiente utilizzare il metodo setAttribute specificando il nome dell'oggetto da memorizzare e una sua istanza. Per esempio, per memorizzare il numero di visite alla pagina è sufficiente fare application.setAttribute("visite" , "0"). La lettura di un oggetto application precedentemente memorizzato è possibile grazie al metodo getAttribute che ha come unico ingresso il nome dell'oggetto application con cui avevamo memorizzato il dato che ci interessa reperire. application.getAttribute("visite") restituisce l'oggetto corrispondente, in questo caso semplicemente il valore 0. Se non vengono trovate corrispondenze con il nome viene restituito il valore null. Anche l'oggetto application come session possiede il metodo getAttributeNames() che restituisce un oggetto di tipo enumerativo di stringhe contenente i nomi di tutti gli oggetti memorizzati nell'applicazione in esecuzione. Per rimuovere un oggetto si utilizza il metodo removeAttribute("nomeoggetto"). Infine per accedere alle costanti di applicazioni, segnaliamo due metodi: il primo molto utile è getRealPath("") che restituisce (con quella stringa in ingresso) il percorso completo su cui è memorizzato il file. Il secondo metodo restituisce delle informazioni, solitamente riguardanti la versione, del motore jsp che si sta utilizzando per l'esecuzione della pagina: application.getServerInfo().
Scriptlets
Consentono di inserire nel corpo del codice qualcosa dipiù complesso di una semplice espressione, ossiaconsentono di inserire un codice arbitrario tramite lasintassi:
<% codice %>.
Essi hanno accesso alle medesime variabili automaticamentedefinite delle espressioni (request, response, session,out, ecc..), e consentono di eseguire alcuni task che nonè permesso dalle espressioni: permettono infatti disettare il codice di stato, l'intestazione di risposta,aggiornamento di database, esecuzione di porzioni di codicecontenenti loop, e altri costrutti complessi. Vediamo unesempio: se si desidera che l'output diun'elaborazione compaia nella pagina risultante,ciò è reso possibile dalla variabile out con laseguente sintassi:
<%String queryData = request.getQueryString();out.println(" Attached GET data: " + queryData);%>
In questo caso particolare avrei ottenuto lo stesso risultatocon questa espressione JSP:
Attached GET data: <%=request.getQueryString() %>