Sei sulla pagina 1di 15

Le JavaServer Pages - Lezione 4

Gli oggetti impliciti


A cura di Giuseppe De Pietro (depietro_giuseppe@yahoo.it)
Contenuti
In questa lezione vedremo le dierenze tra declaration e scriptlet (accennate nella lezione
precedente). Parleremo poi degli oggetti impliciti ovvero tutti gli oggetti messi a disposizione dal
contesto di esecuzione (richieste client! risposte del server! inormazioni sul "e# $erver e altro
ancora).
Per capire meglio cosa sono questi oggetti partiamo dalla $ervlet generata dal documento %$P.
&uesta servlet estende una classe che implementa l'interaccia javax.servlet.jsp.HttpJspPage (vedi
(ezione ))! questo signiica poter utilizzare nella pagina! tutte le propriet* della classe estesa.
&ueste propriet* messe a disposizione! si chiamano oggetti impliciti.
Alcuni li a##iamo gi* visti nelle lezioni precedenti ma ora esaminiamoli nel dettaglio.
Declaration o scriptlet?
$ono due concetti apparentemente simili! ma molto diversi nel modo di unzionare e tutti e due
hanno contesti di applicazione diversi.
A##iamo visto nella (ezione + la deinizione e la sintassi di #ase delle dichiarazioni e degli
scriptlet! ora vediamo le reali dierenze in esempi concreti.
,saminiamo l'esempio -.) che utilizza solo scriptlet.
(a pagina genera un numero intero casuale da / a 00! se provate ad aggiornare la pagina noterete
che ogni volta verr* generato un nuovo numero. &uesto succede perch1 ogni volta che viene
aggiornata la pagina! il %$P container richiamer* ogni volta il metodo _jspService() della servlet!
dato che l'istruzione
int numero=(int)Math.floor(Math.random() * 100);
viene inserita in tale metodo (perch1 2 uno scriptlet)! verr* eseguita ad ogni aggiornamento.
%$P 3 (ezione - 3 Gli oggetti impliciti )
<%@ page language="java" session="false" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>&sem31o d1 s:r13tlet<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o d1 s:r13tlet<,h1><?r,>
<3>)a 3a61na 6enera un numero 1ntero :asuale da 0 a 99<,3>
<%
int numero=(int)Math.floor(Math.random() * 100);
out.5r1te("2umero 6enerato4" A numero);
%>
<,?od<>
<,html>
4onsideriamo l'esempio -.5
6on 2 cam#iato quasi nulla a parte l'inserimento dell'istruzione di generazione del numero casuale
in una declaration. Provate ora ad aggiornare la pagina.
Il numero non cam#ia! questo perch1 il codice all'interno della dichiarazione 2 stato inserito al di
uori del metodo! anzi se provate ad aprire altre istanze del #ro7ser e richiamare la stessa pagina
noterete che il numero 2 sempre lo stesso. In questo caso il valore resta in memoria inch1 vi resta la
servlet! ovvero ino al #locco del server o a seguito di una modiica della pagina.
(e dichiarazioni inoltre sono ondamentali per deinire dei metodi da utilizzare nella pagina.
6ell'esempio -.+! si utilizza un metodo di ormattazione date usando la classe Date8ormat.

%$P 3 (ezione - 3 Gli oggetti impliciti 5
<%@ page language="java" session="false" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>&sem31o d1 s:r13tlet<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o d1 s:r13tlet<,h1><?r,>
<3>)a 3a61na 6enera un numero 1ntero :asuale da 0 a 99<,3>
<%!
int numero=(int)Math.floor(Math.random() * 100);
out.5r1te("2umero 6enerato4" A numero);
%>
<,?od<>
<,html>
<%@ page language="java" session="false" %>
<%@ page import="java.ut1l.*B java.te8t.*" %>
<%!
,, d1:h1araC1one :ostant1 3er 1l formato data
private static final int D#DE)!2F=0;
private static final int D#DEG0!7#=1;
private static final int !7DE)!2F=H;
public Gtr1n6 formatoata(ate dataB int formato)
I
ateJormat dJormat=null;
switch (formato)I
case 04
dJormat=new G1m3leateJormat("&&&& d MMMM <<<<");
break;
case 14
dJormat=new G1m3leateJormat("d,MM,<<<<");
break;
case H4
dJormat=new G1m3leateJormat("004mm4ss");
break;
K
return dJormat.format(data);
K
%>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>&sem31o d1 d1:h1araC1one<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
Gli oggetti impliciti
Passiamo ora agli oggetti impliciti! indispensa#ili per la gestione dello scam#io dati tra client e
server.
Per chi conosce gi* altre tecnologie lato server trover* molte somiglianze con gli oggetti messi a
disposizione nelle pagine %$P. 9ediamo quali sono.
Loggetto request
: l'oggetto che contiene le inormazioni della richiesta. : il rierimento ad un oggetto di tipo
javax.servlet.ServletRequest.
In pratica serve per recuperare i dati della richiesta del #ro7ser! tra cui le intestazioni ;<<P! i
parametri! i coo=ie e cos> via.
9ediamo l'esempio -.- in cui si visualizzano tutti i dati relativi alle intestazioni della richiesta.
%$P 3 (ezione - 3 Gli oggetti impliciti +
<?od<>
<h1 al16n=@:enter@>&sem31o L.. + d1:h1araC1one<,h1><?r,>
<3>)a 3a61na d1:h1ara un metodo d1 formattaC1one data<,3>
<3><?>ata normale 4 <,?><,3>
<%
ate data=new ate();
out.5r1te(formatoata(dataBD#DEG0!7#));
%>
<?r,>
<3><?>ata estesa 4 <,?><,3>
<%
ate data1=new ate();
out.5r1te(formatoata(data1BD#DE)!2F));
%>
<?r,>
<3><?>!ra estesa 4 <,?><,3>
<%
ate dataH=new ate();
out.5r1te(formatoata(dataHB!7DE)!2F));
%>
<,?od<>
<,html>
<%@ page language="java" session="false" import="java.ut1l.*" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto re;uest + *ntestaC1on1<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.L + !66etto re;uest<,h1><?r,>
<3>*ntestaC1on1 della r1:h1esta<,3>
<%
&numerat1on 1ntestaC1on1=request.6et0eader2ames();
while(1ntestaC1on1.hasMore&lements())I
Gtr1n6 nome=1ntestaC1on1.ne8t&lement().toGtr1n6();
Gtr1n6 valore=request.6et0eader(nome); %>
<dl><dt><?><%=nome%><,?><,dt>
<dd><%=valore%><,dd><,dl>
&ueste inormazioni possono essere utili per esempio per sapere la lingua del #ro7ser (accept-
language) e dare all'utente la pagina nella lingua desiderata! o vedere i tipi ?I?, supportati dal
#ro7ser (accept) e quindi a seconda dei plug@in installati personalizzare la pagina (per esempio se il
#ro7ser non avesse installato lash player si potre##ero evitare automaticamente le animazioni
lash).
4omunque 2 nel recupero dei parametri inviati dal client che l'oggetto request svolge un ruolo
ondamentale.
9ediamo l'esempio -.A composto da due ile! uno ;<?( con i vari controlli lato client disponi#ili e
uno %$P per intercettare i valori inviati e visualizzarli. Il ile ;<?( conterr* due orm per l'invio
dei dati sia in modalit* G,< che PB$<. (e %ava "e# Application a dierenza delle altre tecnologie
non anno dierenza sul recupero dei parametri nelle due dierenti modalit*.
<ra i due metodi comunque ci sono delle dierenze! di deault le richieste vengono inviate in
modalit* G,< ed eventuali parametri passati al server vengono accodati all'url separati da un punto
interrogativo e compaiono nella #arra degli indirizzi del #ro7ser. Per esempio una richiesta G,<
potre##e avere il seguente ormato.
http://www.iosito.it/noepagina.jsp?nomeParametro=valore&nomeParametro1=valore1
&uesta modalit* 2 limitata in lunghezza e inoltre diventa insicura per l'invio di dati particolari come
le pass7ord che ovviamente sare##ero mostrate in chiaro nell'invio della richiesta.
(a modalit* G,< 2 molto utile quando si vogliono inviare dei valori come semplici lin= senza
l'utilizzo dei orm ;<?(.
(a modalit* PB$< invece non ha limiti di lunghezza e i parametri vengono inviati in maniera
trasparente come corpo della richiesta! quindi nascosti all'utente
)
. ,cco il ile !sepio"_#.htl
)
$i ricorda che l'invio dei dati 2 sempre atto utilizzando il protocollo ;<<P! i dati anche se nascosti a video sono
comunque trasmessi in ormato testo e quindi acilmente intercetta#ili da eventuali snier (programmi in grado di
prelevare i pacchetti in rete)! l'unica modalit* sicura 2 l'utilizzo di connessioni criptate ($$().
%$P 3 (ezione - 3 Gli oggetti impliciti -
%>
<3>Dltre *nformaC1on1<,3>
<%
K
out.5r1te("%ath relat1vo4 " A request.6et"onte8t%ath()A"<?r>");
out.5r1te("Metodo su?m1t4 " A request.6etMethod()A"<?r>");
%>
<,?od<>
<,html>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>)eC1one L + 7e:u3ero de1 3arametr1<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=":enter">!66etto 7e;uest<,h1>
<form method="3ost" a:t1on="esem31oLE>.js3" name="nomeform">
<f1eldset>
<le6end>at1 da 1nv1are 1n modal1tMa6rave; %!G#<,le6end>
<la?el for="user1d">'ser * 4 <,la?el>
<1n3ut t<3e="te8t" 2DM&="user1d"><?r>
<la?el for="35d">%ass5ord4<,la?el>
<1n3ut t<3e="3ass5ord" 2DM&="35d"><?r>
<?r>
<la?el for="sel">GeleC1one mult13la4<,la?el>
<sele:t mult13le 2DM&="sel">
<o3t1on value="vo:e1">No:e 1<,o3t1on>
?entre il ile esepio"_#.jsp sar* cos> composto.
%$P 3 (ezione - 3 Gli oggetti impliciti A
<o3t1on value="vo:eH">No:e H<,o3t1on>
<o3t1on value="vo:e.">No:e .<,o3t1on>
<o3t1on value="vo:eL">No:e L<,o3t1on>
<,sele:t>
<?r,>
!3C1one 14<1n3ut t<3e="rad1o" name=":he:O" value="1"
:he:Oed><?r,>
!3C1one H4<1n3ut t<3e="rad1o" name=":he:O"
value="H"><?r,>
!3C1one .4<1n3ut t<3e="rad1o" name=":he:O"
value="."><?r,>
<?r><?r>
<1n3ut t<3e="su?m1t" value="*nv1a dat1">
<,f1eldset><?r>
<,form>
<form method="6et" a:t1on="esem31oLE>.js3" name="JormFet">
<f1eldset>
<le6end>at1 da 1nv1are 1n modal1tMa6rave; F&#<,le6end>
<la?el for="user1d">'ser * 4 <,la?el>
<1n3ut t<3e="te8t" 2DM&="user1d"><?r,>
<la?el for="35d">%ass5ord4<,la?el>
<1n3ut t<3e="3ass5ord" 2DM&="35d"><?r,>
<?r>
<la?el for="sel">GeleC1one mult13la4<,la?el>
<sele:t mult13le 2DM&="sel">
<o3t1on value="vo:e1">No:e 1<,o3t1on>
<o3t1on value="vo:eH">No:e H<,o3t1on>
<o3t1on value="vo:e.">No:e .<,o3t1on>
<o3t1on value="vo:eL">No:e L<,o3t1on>
<,sele:t>
<?r>
!3C1one 14<1n3ut t<3e="rad1o" name=":he:O" value="1"
:he:Oed><?r,>
!3C1one H4<1n3ut t<3e="rad1o" name=":he:O"
value="H"><?r,>
!3C1one .4<1n3ut t<3e="rad1o" name=":he:O"
value="."><?r,>
<?r><?r>
<1n3ut t<3e="su?m1t" value="*nv1a dat1" >
<,f1eldset><?r,>
<,form>
<,?od<>
<,html>
<%@ page language="java" session="false" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto re;uest + 7e:u3ero de1 3arametr1<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.> + !66etto re;uest<,h1><?r,>
<3>7e:u3ero de1 3arametr1<,3>
<%
out.5r1te("*nv1o de1 dat1 1n modal1tP " A request.6etMethod());
Gtr1n6 user*=request.6et%arameter("user1d");

Da ar notare che il codice %$P si astrae completamente dalla modalit* di invio dei dati (get e post).
Il recupero dei parametri avviene con il metodo getParaeter($noeParaetro%). In caso di piC
valori associati allo stesso parametro si utilizza il metodo getParaeter&alues($noeParaetro%)
che ritorna un array di stringhe. Grazie alla propriet* length 2 possi#ile recuperare il numero dei
valori e si utilizza un ciclo 'or per la loro visualizzazione. Dnica particolarit* 2 il controllo
sull'array! se 2 nullo (caso in cui l'utente non eettua alcuna selezione) non esegue il ciclo
altrimenti verre##e generata una eccezione di tipo nullPointer!xception.
9olendo 2 possi#ile anche recuperare tutti i valori inviati senza #isogno di conoscere i nomi dei
controlli! usando il metodo getParaeter(aes() che restituisce un oggetto !nueration con tutti i
nomi dei parametri ricevuti. ('esempio -.E mostra una pagina %$P che 2 in grado di leggere i
parametri inviati da qualsiasi orm! senza conoscerne il numero! n1 il nome.
%$P 3 (ezione - 3 Gli oggetti impliciti E
Gtr1n6 3ass5ord=request.6et%arameter("35d");
Gtr1n6QR seleC1on1=request.6et%arameterNalues("sel");
Gtr1n6 :he:O=request.6et%arameter(":he:O");
%>
<ul>
<l1><?>2ome 'tente 4 <,?><%=user*%><,l1>
<l1><?>%ass5ord 4 <,?><%=3ass5ord%><,l1>
<l1><?>Nalor1 seleC1onat1 4 <,?><%
if (seleC1on1!=null)I
for(int 1=0;1<seleC1on1.len6th;1AA)I
out.5r1te(seleC1on1Q1RA"<?r>");
K
K
%><,l1>
<l1><?>"he:O 4 <,?><%=:he:O%><,l1>
<,ul>
<,?od<>
<,html>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto re;uest + 7e:u3ero de1 3arametr1<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.S + !66etto re;uest<,h1><?r,>
<3>7e:u3ero de1 3arametr1 1nv1at1 da un ;uals1as1 form<,3>
<% Gtr1n6 nome%aram;
out.5r1te("*nv1o de1 dat1 1n modal1tP " A request.6etMethod());
&numerat1on 3arametr1=request.6et%arameter2ames();
out.5r1te("<ul>");
while (3arametr1.hasMore&lements())I
nome%aram=3arametr1.ne8t&lement().toGtr1n6();
out.5r1te("<l1><?>"Anome%aramA" 4 <,?>");
Gtr1n6QR valor1=request.6et%arameterNalues(nome%aram);
if (valor1!=null)I
for(int 1=0;1<valor1.len6th;1AA)I
out.5r1te(valor1Q1RA"<?r,>");
K
K
out.5r1te("<,l1>");
K%>
<,ul>
<,?od<>
<,html>
('oggetto request puF essere utilizzato anche per ricavare inormazioni aggiuntive sul computer
remoto che ha eettuato la richiesta! come l'indirizzo IP e il nome identiicativo. ('esempio -.G
mostra come visualizzare tali inormazioni.
Gli oggetti response e out
$ono due oggetti che si occupano di inviare dati dal $erver al client. In un certo senso l'oggetto out
appartiene all'oggetto response! inatti nelle $ervlet c'2 il tipo javax.servlet.ServletResponse il cui
metodo get)riter() permette di ottenere un oggetto di tipo Print"riter che rappresenta il rierimento
allo stream di uscita delle servlet (la modalit* per inviare al client il codice ;<?(). 6elle pagine
%$P! response e out sono separati! ma guardando la natura dell'oggetto out scopriamo che 2 di tipo
Jsp)riter ovvero una classe che estende l'interaccia java.io.)riter! proprio come il Print)riter
delle servlet. &uindi l'oggetto out in %$P! sempliica la scrittura dei dati sul client. ,viteremo degli
esempi su questo oggetto perch1 a##iamo gi* visto il suo utilizzo sin dalle prime pagine %$P (ci
sare##ero i metodi di gestione del #uer 'lush()! clear*u''er()! get*u''erSi+e() ed altri! ma si
consiglia la gestione automatica del #uer come illustrato nella (ezione +).
9edremo invece alcuni utilizzi dell'oggetto response. Dno dei piC usati 2 il reindirizzamento ad
un'altra risorsa.
4on il metodo sendRedirect()! il "e# $erver invia uno speciale messaggio al client di richiesta di
un'altra pagina.
6ell'esempio -.H (composto da due pagine %$P) viene illustrato un orm di login in cui si
richiedono il nome utente e la pass7ord. I dati inviati vengono intercettati e veriicati dalla stessa
pagina e in caso di valori corretti (come esempio ho impostato useridIadmin e pass7ordIsegreta)
l'utente viene reindirizzato alla pagina registrato.jsp! mentre in presenza di valori diversi si viene
reindirizzati alla stessa pagina di login.
Di seguito viene mostrato il codice del ile esepio"_,.jsp! con il orm di login.
%$P 3 (ezione - 3 Gli oggetti impliciti G
<%@ page language="java" session="false" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto re;uest + *nformaC1on1 a661unt1ve<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.T + !66etto re;uest<,h1><?r,>
<3>7e:u3ero d1 1nformaC1on1 a661unt1ve sul :l1ent<,3>
<%
out.5r1te("<(7,>%orta Gerver4 " A request.6etGerver%ort());
out.5r1te("<(7,>2ome Gerver4 " A request.6etGerver2ame());
out.5r1te("<(7,>%roto:ollo4 " A request.6et%roto:ol());
out.5r1te("<(7,>"od1f1:a :aratter14 " A request.6et"hara:ter&n:od1n6());
out.5r1te("<(7,>"ontent #<3e4 " A request.6et"ontent#<3e());
out.5r1te("<(7,>)un6heCCa :ontenuto4 " A request.6et"ontent)en6th());
out.5r1te("<(7,>*nd1r1CCo 7emoto4 " A request.6et7emoteDddr());
out.5r1te("<(7,>0ost remoto4 " A request.6et7emote0ost());
out.5r1te("<(7,>G:hema4 " A request.6etG:heme());
%>
<,ul>
<,?od<>
<,html>
('inclusione del ile 'un+ioni.jsp viene utilizzato per il metodo nn(o-ject) che restituisce una stringa
vuota in caso di oggetto nullo (evita la generazione dell'eccezione (ullPointer!xception al primo
caricamento della pagina). Per la comparazione delle stringhe in %ava si utilizza il metodo equals()
della classe $tring. In caso di valori esatti la richiesta del client viene traserita alla pagina
registrato.jsp altrimenti viene visualizzata sempre la pagina di login.
Il lettore attento potre##e aver notato che se si digita direttamente il nome della pagina
registrato.jsp nell'url! si #ypassa l'autenticazione dell'utente. ,ettivamente 2 cos>! il pro#lema lo
si corregge con la gestione delle sessioni utente. 6elle lezioni successive verr* mostrato come
creare delle pagine protette in un sito.
('oggetto response permette inoltre di poter generare degli errori e quindi inviare al client la pagina
con il codice di errore (errori ;<<P) ed un messaggio personalizzato. Per esempio la seguente riga
inserita in una pagina Jsp.
response.send&rror(response.G"E"!2J)*"#B ""onfl1tto d1 r1sorse.");
mostra la seguente schermata.
%$P 3 (ezione - 3 Gli oggetti impliciti H
<%@ page language="java" session="false" %>
<%@ include file=",)eC1one.,*n:lude,funC1on1.js3" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto res3onse + Metodo send7ed1re:t<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.= + !66etto res3onse<,h1><?r,>
<3>Metodo send7ed1re:t 3er 1l re1nd1r1CCamento delle r1:h1este<,3>
<form method="3ost">
<f1eldset>
<le6end>)o61n 'tente<,le6end>
<la?el for="user1d">'ser * 4 <,la?el>
<1n3ut t<3e="te8t" 2DM&="user1d"><?r>
<la?el for="35d">%ass5ord4<,la?el>
<1n3ut t<3e="3ass5ord" 2DM&="35d">
<?r,><?r,>
<1n3ut t<3e="su?m1t" value="*nv1a dat1">
<,f1eldset>
<,form>
<%
Gtr1n6 user=nn(request.6et%arameter("user1d"));
Gtr1n6 3ass5ord=nn(request.6et%arameter("35d"));
if (user.e;uals("adm1n") MM 3ass5ord.e;uals("se6reta"))I
response.send7ed1re:t("re61strato.js3");
K
%>
<,?od<>
<,html>
Per concludere vediamo ora un caso particolare di utilizzo dell'oggetto out. $upponiamo di dover
realizzare un applicativo di tipo chat o orum in cui un utente digita del testo e poi lo invia agli altri
utenti! provate ad immaginare se l'utente dovesse inserire del codice pericoloso! se non c'2 alcun
trattamento del testo esso verre##e visualizzato e di conseguenza eseguito su tutti i client connessi
con l'applicativo. : opportuno creare quindi un metodo che trasorma tutto il codice ;<?( e di
scripting in semplice testo. 9ediamo l'esempio -.)/ che mostra i vantaggi dell'utilizzo di questa
unzione.
%$P 3 (ezione - 3 Gli oggetti impliciti 0
<%@ page language="java" session="false" %>
<%!
public static Gtr1n6 :od1f1:a#a60tml(Gtr1n6 ta6) I
if (ta6==null)
return null;
int n"aratter1 = ta6.len6th();
Gtr1n6(uffer ta6"od1f1:ato = new Gtr1n6(uffer(H * n"aratter1);
for (int 1=0; 1<n"aratter1; 1AA) I
char : = ta6.:harDt(1);
switch (:)I
case @<@4
ta6"od1f1:ato.a33end("Mlt;");
break;
case @>@4
ta6"od1f1:ato.a33end("M6t;");
break;
case @M@4
ta6"od1f1:ato.a33end("Mam3;");
break;
case @"@4
ta6"od1f1:ato.a33end("M;uot;");
break;
case @ @4
ta6"od1f1:ato.a33end("Mn?s3;");
break;
default4
ta6"od1f1:ato.a33end(:);
K
K
return ta6"od1f1:ato.toGtr1n6();
K
%>
(a unzione codi'ica.agHtl riceve una stringa come parametro e la ela#ora utilizzando la classe
String*u''er che ha la particolarit* di implementare una sequenza varia#ile di caratteri. 9iene creata
una nuova istanza della classe String*u''er impostando inizialmente una grandezza doppia rispetto
alla stringa! poi ogni carattere viene conrontato con quelli particolari da sostituire (costrutto
switch())! se il carattere non necessita di codiica! viene semplicemente aggiunto all'istanza di
$tringKuer per poi essere restituita come stringa alla ine del ciclo (costrutto 'or()).
Loggetto pageContext
: un oggetto di tipo javax.servlet.jsp.Page/ontext! praticamente rappresenta la pagina %$P corrente
e contiene tutti gli oggetti impliciti relativi alla pagina.
Il suo utilizzo potre##e sem#rare superluo visto che se vogliamo accedere per esempio all'oggetto
request acciamo rierimento alla sua istanza diretta anzich1 ottenerlo con
page/ontext.getRequest().
(a sua utilit* verr* messa in risalto in seguito quando si parler* dei custom tag! per ora vediamo un
semplice esempio in cui ci servir* tale oggetto. accedere alle propriet* della pagina in una
dichiarazione.
$e vi ricordate nelle lezioni precedenti 2 stato detto che il codice inserito in una dichiarazione viene
scritto all'esterno del metodo _jspService() della servlet corrispondente. Gli argomenti passati a tale
metodo sono gli oggetti impliciti HttpServletRequest e HttpServletResponse (gli altri oggetti
impliciti sono ricavati tramite l'istruzione _jspx0actor1.getPage/ontext). &uesto signiica che gli
%$P 3 (ezione - 3 Gli oggetti impliciti )/
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto res3onse + "od1f1:a ta6 0#M)<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.10 + !66etto res3onse<,h1><?r,>
<3>"od1f1:a de1 ta6 0#M)<,3>
<form method="3ost">
<f1eldset>
<le6end>*nser1mento testo<,le6end>
<la?el for="testo">#esto4 <,la?el>
<te8tarea ro5s=">" :ols="L0" name="testo" 1d="testo"><h1>0o 1nser1to
de1 ta6 d1 formattaC1one e uno s:r13t<,h1><s:r13t
lan6ua6e=javas:r13t>alert(@G1mulaC1one d1 uno G:r13t
3er1:oloso@)<,s:r13t><,te8tarea>
<?r,><?r,>
<1n3ut t<3e="su?m1t" value="*nv1a dat1" name="1nv1a">
<,f1eldset>
<,form>
<%
if (request.6et%arameter("1nv1a")!=null)I
out.5r1te("<hH>N1sual1CCo 1 dat1 1nv1at1 senCa trattare 1 :aratter1
s3e:1al1<,hH>");
out.5r1te(request.6et%arameter("testo"));
out.5r1te("<hH>7endo 1nno:u1 eventual1 s:r13t 3er1:olos1<,hH>");
out.5r1te(:od1f1:a#a60tml(request.6et%arameter("testo")));
K
%>
<,?od<>
<,html>
oggetti relativi alla pagina esistono solo all'interno del metodo _jspService() e non saranno
assolutamente visi#ili all'esterno di tale metodo e quindi nelle dichiarazioni.
(a soluzione a tale limite 2 il passaggio dell'oggetto page/ontext al metodo inserito nella
dichiarazione! cos> da poter accedere a tutte le unzionalit* messe a disposizione dagli oggetti
impliciti. 9ediamo l'esempio -.)) che chiarisce meglio il concetto sopra esposto.
Il etodo!sterno() accetta un oggetto di tipo Page/ontext e permette di prelevare un oggetto out
(Jsp)riter) per inviare al client i messaggi! e un oggetto di tipo ServletRequest che utilizziamo per
prendere l'indirizzo IP del client. Bvviamente do##iamo gestire le eccezioni per l'invio dei dati al
canale out. 6el nostro caso con throws 34!xception dichiariamo al compilatore che siamo a
conoscenza che l'istruzione write potre##e generare un eccezione di tipo 34!xception ma non
vogliamo gestirla (le eccezioni si gestiscono con tryLcatch).
?entre negli scriptlet c'2 una gestione automatica degli errori (creata nel metodo _jspService() della
servlet)! nelle dichiarazioni siamo o##ligati a gestire tutto come se osse una normale classe %ava.
Loggetto session
6ella (ezione + a##iamo visto cosa sono le sessioni utente e come disa#ilitarle nelle pagine %$P (di
deault sono a#ilitate)! ora vedremo alcuni utilizzi pratici dell'oggetto session.
&uando una sessione utente viene creata! il "e# $erver crea un identiicativo univoco che verr*
associato all'utente e permetter* al server di poterlo riconoscere durante la navigazione.
(a sessione utente permette di creare un am#iente in cui potranno essere memorizzati degli oggetti
appartenenti! e quindi visi#ili! solo a quello speciico utente.
(o sviluppatore non si deve preoccupare n1 di generare il codice identiicativo! n1 di associare ogni
richiesta ad un determinato utente! n1 di gestire la sessione in maniera alternativa se il client non
accetta i coo=ie. <utto questo sar* atto dal "e# $erver acilitando il compito dello sviluppatore che
avr* semplicemente un oggetto a cui potr* aggiungere dei parametri (nome4hiaveIvalore).
: importante essere a conoscenza del ciclo di vita di una sessione. ,ssa viene creata alla prima
richiesta dell'utente ma la sua eliminazione non 2 altrettanto repentina! ci sar* un tempo di inattivit*
%$P 3 (ezione - 3 Gli oggetti impliciti ))
<%@ page language="java" session="false" %>
<%@ page import="java.1o.*" %>
<%!
public static void metodo&sterno(%a6e"onte8t 3a61na) throws *!&8:e3t1onI
Us3-r1ter m1o!ut=3a61na.6et!ut();
Gervlet7e;uest re;u=3a61na.6et7e;uest();

m1o!ut.5r1te( "*nd1r1CCo 0ost4 " A re;u.6et7emote0ost());
K
%>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto 3a6e"onte8t<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.11 + !66etto 3a6e"onte8t<,h1><?r,>
<3>7e:u3ero de6l1 o66ett1 1m3l1:1t1 1n una d1:h1araC1one<,3>
<%
metodo&sterno(pageContext);
%>
<,?od<>
<,html>
massimo concesso al visitatore. &uesto tempo di deault varia in #ase all'application server (in
genere +/ minuti)! ma 2 possi#ile modiicarlo con l'istruzione.
session.setMa8*na:t1ve*nterval(int se:ond1);
('esempio -.)5 mostra come ricavare inormazioni sulla sessione utente creata.
: possi#ile creare una varia#ile di sessione con l'istruzione.
session.setDttr1?ute(Gtr1n6 :h1aveB!?je:t valore);
Il nome della chiave 2 case@sensitive quindi 2 importante are attenzione alle minuscole e maiuscole
(come per i nomi delle varia#ili). 4ome valore accetta qualsiasi elemento di tipo B#Ject (la classe
da cui derivano tutte le altre in %ava).
Per il recupero di un valore si utilizza.
session.6etDttr1?ute(Gtr1n6 :h1ave)
che restituisce un B#Ject.
&uindi 2 preeri#ile ricordarsi il tipo di valore memorizzato per poter eettuare un casting del
valore (una conversione esplicita nel tipo desiderato). Per esempio per poter recuperare un valore di
tipo stringa.
Gtr1n6 valore=(Gtr1n6)session.6etDttr1?ute(Vnome"h1aveW);
(a scrittura di una chiave esistente comporta la sostituzione del vecchio valore memorizzato con il
nuovo passato al metodo setAttri#ute().
Per poter eliminare un valore si utilizza l'istruzione.
session.removeDttr1?ute("nome"h1ave");
$e si vuole terminare una sessione utente prima della scadenza predeinita si potr* utilizzare il
metodo.
session.1nval1date();
9ediamo un esempio pratico di utilizzo dell'oggetto session. 6ella pagina esepio"_56.jsp l'utente
avr* la possi#ilit* di creare delle varia#ili di sessione che poi potranno essere visualizzate nella
pagina leggiSession.jsp. ?emorizzate dei valori e poi aprite un'altra inestra del #ro7ser e andate
direttamente alla pagina leggiSession.jsp! noterete che non verranno visualizzati i valori
precedentemente memorizzati. &uesto perch1 aprendo un'altra istanza del #ro7ser avete creato una
nuova sessione utente e quindi non potrete avere accesso ai valori memorizzati con l'altra inestra.
%$P 3 (ezione - 3 Gli oggetti impliciti )5
<%@ page language="java" %>
<%@ page import="java.ut1l" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto sess1on<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.1H + !66etto sess1on<,h1><?r,>
<3>7e:u3ero delle 1nformaC1on1<,3>
<%
out.5r1te("* d1 sess1one4 " Asession.6et*d());
Gtr1n6 :reaC1one=new ate(session.6et"reat1on#1me()).toGtr1n6();
Gtr1n6 ultD::ess=new ate(session.6et)astD::essed#1me()).toGtr1n6();
out.5r1te("<?r,>#em3o d1 :reaC1one4 " A :reaC1one);
out.5r1te("<?r,>'lt1mo a::esso4 " A ultD::ess);
out.5r1te("<?r,>#em3o mass1mo d1 1natt1v1tP (se:ond1)4 "
Asession.6etMa8*na:t1ve*nterval());
%>
<,?od<>
<,html>
(a pagina esepio"_56.jsp
(a pagina leggiSession.jsp
%$P 3 (ezione - 3 Gli oggetti impliciti )+
<%@ page language="java" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto sess1on<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.1. + !66etto sess1on <,h1><?r,>
<h.>"reaC1one delle var1a?1l1 d1 sess1one<,h.>
<form method="3ost" a:t1on="le661Gess1on.js3">
<f1eldset>
<le6end>"reaC1one var1a?1l1<,le6end>
<la?el for=":h1ave">2ome :h1ave4 <,la?el>
<1n3ut t<3e="te8t" name=":h1ave"><?r>
<la?el for="valore">Nalore4<,la?el>
<1n3ut t<3e="te8t" name="valore">
<?r,><?r,>
<1n3ut t<3e="su?m1t" value="D661un61 var1a?1le">
<,f1eldset>
<,form><?r,>
<3><a href="le661Gess1on.js3" t1tle=")e661 le var1a?1l1 d1 sess1one">)e661 le
var1a?1l1 d1 sess1one<,a><,3>
<,?od<>
<,html>
<%@ page language="java" import="java.ut1l.*" %>
<%@ include file=",)eC1one.,*n:lude,funC1on1.js3" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto sess1on<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.1. + !66etto sess1on<,h1><?r,>
<3>7e:u3ero delle var1a?1l1<,3>
<%Gtr1n6 :h1ave=nn(request.6et%arameter(":h1ave"));
Gtr1n6 valore=nn(request.6et%arameter("valore"));
if (!:h1ave.e;uals(""))I
session.setDttr1?ute(:h1aveBvalore);
K
,,re:u3ero var1a?1l1 d1 sess1on1
out.5r1te("Nar1a?1l1 d1 sess1one memor1CCate<?r,>");
&numerat1on :h1av1=session.6etDttr1?ute2ames();
while(:h1av1.hasMore&lements())I
Gtr1n6 nome"h1ave=(Gtr1n6):h1av1.ne8t&lement();
out.5r1te("<?>2ome :h1ave4<,?>" A nome"h1aveA"<?r,>");
out.5r1te("<?>Nalore4<,?>" A session.6etDttr1?ute(nome"h1ave)
A"<?r,><?r,>");
K%>
<,?od<>
<,html>
Loggetto application
: un oggetto di tipo javax.servlet.Servlet/ontext. Il contesto della $ervlet altro non 2 che l'am#iente
in cui sono eseguite le servlet! quindi questo oggetto permette di leggere o impostare propriet*
comuni a tutte le servlet e le %$P della stessa "e# Application.
Per creare varia#ili application si usano gli stessi metodi cha a##iamo visto per l'oggetto session!
l'unica dierenza 2 che questa varia#ile puF essere vista e condivisa da tutti gli utenti della nostra
applicazione.
4reazione di una varia#ile.
application.setDttr1?ute(Gtr1n6 :h1aveB!?je:t valore);
Mecupero di un valore.
application.6etDttr1?ute(Gtr1n6 :h1ave)
che restituisce un B#Ject.
Per poter eliminare un valore si utilizza l'istruzione.
application.removeDttr1?ute("nome"h1ave");
Inoltre questo oggetto 2 utile per poter risalire al percorso assoluto dei ile.
application.6et7eal%ath(Gtr1n6 nomeJ1le)
B poter ricavare le inormazioni sul "e# $erver.
application.6etGerver*nfo()
(a pagina esepio"_5".jsp mostra come visualizzare queste inormazioni.
%$P 3 (ezione - 3 Gli oggetti impliciti )-
<%@ page language="java" %>
<%@ page import="java.ut1l.*" %>
<!!"#$%& html %'()*" "+,,-.",,# /0#M) 1.0 #rans1t1onal,,&2"
"htt34,,555.5..or6,#7,8html1,#,8html1+trans1t1onal.dtd">
<html 8mlns="htt34,,555.5..or6,1999,8html" 8ml4lan6="*#">
<head>
<t1tle>!66etto a33l1:at1on<,t1tle>
<meta htt3+e;u1v=""ontent+#<3e" :ontent="te8t,html; :harset=1so+==>9+1" ,>
<,head>
<?od<>
<h1 al16n=@:enter@>&sem31o L.1L + !66etto a33l1:at1on<,h1><?r,>
<%
&numerat1on attr1?utes = application.6etDttr1?ute2ames();
while (attr1?utes.hasMore&lements()) I
Gtr1n6 attr1?ute = (Gtr1n6) attr1?utes.ne8t&lement();
out.3r1ntln("Dttr1?ute name 4 " A attr1?uteA"<?r,>");
out.3r1ntln("Dttr1?ute value 4 " A
application.6etDttr1?ute(attr1?ute) A"<?r,><?r,>");
K
out.5r1te("Ners1one servlet D%* su33ortate dal :onta1ner (major)4 "
Aapplication.6etMajorNers1on()A"<?r,>");
out.3r1ntln("Ners1one servlet D%* su33ortate dal :onta1ner (m1nor)4 " A
application.6etM1norNers1on()A"<?r,>");
out.3r1ntln("Gerver 1nfo 4 " A application.6etGerver*nfo()A"<?r,>");
out.3r1ntln("%er:orso assoluto 4 " A
application.6et7eal%ath(")eC1oneL,esem31oLE1L.js3") A"<?r,>");
%>
<,?od<>
<,html>
Loggetto config
&uesto oggetto 2 poco utilizzato e permette di avere dei rierimenti alle inormazioni di
conigurazione della $ervlet (tra cui alcuni otteni#ili anche con l'oggetto application). : di tipo
javax.servlet.Servlet/on'ig.
Loggetto page
In Java per poter are rierimento alla classe corrente si usa la parola chiave this. ,ssa viene
utilizzata per poter accedere a metodi o propriet* interne alla classe.
6elle pagine %$P invece per poter are rierimento alla pagina si utilizza la parola page! di atto
questo oggetto non viene mai utilizzato.
Loggetto exception
Mappresenta l'oggetto che contiene l'eventuale eccezione sollevata. A##iamo visto il suo utilizzo
nella (ezione + quando si parlava di gestione delle pagine di errore personalizzate.
%$P 3 (ezione - 3 Gli oggetti impliciti )A