Lezione 5 Le Standard Action

Transcript

Lezione 5 Le Standard Action
Le JavaServer Pages - Lezione 5
Le Standard Action
A cura di Giuseppe De Pietro ([email protected])
Contenuti
In questa lezione vedremo cosa sono le azioni standard JSP (standard action) facendo una
panoramica su tutte quelle messe a disposizione dalle specifiche J2EE di Sun.
Illustreremo più nel dettaglio le azioni che si occupano delle inclusioni di pagine esterne e dei
trasferimenti di richiesta, ponendo in evidenza i vantaggi e gli svantaggi rispetto ai metodi già visti
in precedenza1.
Le azioni sono elementi particolari che non sono affatto implementati nelle altre tecnologie Web, e
da questa lezione vedremo alcune tecniche di programmazione possibili solo con le Java Web
Application.
Alcune azioni saranno menzionate per completezza, ma affronteremo il loro studio nelle lezioni
successive.
Le azioni standard
Le azioni JSP sono dei tag XML (non preoccupatevi, non è richiesta la conoscenza del linguaggio
XML) che vengono tradotti in codice Java dall’Application Server.
L’elenco delle standard action a disposizione è il seguente:
- jsp:include: in un certo senso effettua l’inclusione di documenti lato server, ma vedremo
come questa azione operi in maniera differente rispetto alla direttiva include.
- jsp:param: viene utilizzata per passare dei parametri al documento specificato da
jsp:include.
- jsp:forward: utilizzata per il trasferimento delle richieste.
- jsp:useBean: mette a disposizione del documento JSP, un JavaBean. Il loro utilizzo sarà
discusso nella lezione 7.
- jsp:setProperty e jsp:getProperty: sono azioni utilizzate rispettivamente per impostare e
prelevare i valori delle proprietà di un JavaBean.
- jsp:plugin: serve per effettuare il download e l’utilizzo di plugin specifici per eseguire dei
componenti particolari.
- jsp:fallback: si utilizza opzionalmente con jsp:plugin.
jsp:include
Questa azione viene utilizzata per l’inclusione dei documenti lato server. Vediamo un primo
esempio simile a quello mostrato nella lezione 3.
Useremo una la pagina esempio5_1.jsp per includere i documenti header.html e menu.html.
1
Direttiva include (Lezione 3) per l’inclusione di documenti lato server e il reindirizzamento effettuato con l’oggetto
implicito response.sendRedirect() (Lezione 4).
JSP – Lezione 5 – Le Standard Action
1
<head>
<title>Azione include</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="stili.css">
</head>
<body>
<jsp:include page="header.html" />
<div id="corpo">
<jsp:include page="menu.html" />
<div id="main">
<h3>Corso JSP - Lezione 5</h3>
<h3>Home page</h3>
<p>
Esempio di azione include con inclusione file HTML
</p>
</div>
</div>
</body>
</html>
Se visualizziamo la pagina noteremo che si avrà lo stesso effetto ottenuto con la direttiva include,
ovvero la visualizzazione di un documento con la testata e la barra dei menu laterali.
In realtà delle differenze ci sono, se osserviamo la servlet corrispondente, noteremo come il codice
dei documenti inclusi (header.html e menu.html) non comparirà affatto, ci sarà invece la seguente
riga di codice:
org.apache.jasper.runtime.
JspRuntimeLibrary.include (request, response, "header.html", out, false);
Viene richiamato il metodo include della classe JspRuntimeLibrary, quindi la richiesta viene
trasferita automaticamente al documento. Dopo l’esecuzione del codice il controllo verrà restituito
alla pagina che ha richiamato il metodo. Inoltre nel documento incluso saranno disponibili anche gli
oggetti impliciti request, response e out. Questa è la traduzione di Tomcat, le specifiche J2EE
prevedono l’utilizzo del metodo include dell’oggetto pageContext ma il funzionamento è simile in
tutti gli Application Server.
Il nome del documento da includere può essere generato dinamicamente con la seguente sintassi:
<jsp:include page="<%=nomePagina%>" />
L’esempio 5.2 mostra come sia possibile stabilire dinamicamente la pagina da includere e inoltre di
come sia possibile utilizzare i parametri inviati dal client.
Il file esempio5_2.jsp contiene un form dove l’utente dovrà inserire il nome e la pagina a cui inviare
il parametro:
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione include</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h2>Inclusione di pagina determinata dinamicamente</h2>
<form method="post" action="caricaPagina.jsp">
<fieldset>
<legend>Scelta della pagina</legend>
<label for="nome">Inserisci il nome: </label>
<input type="text" name="nome" id="nome">
<br/>
<label for="pagina">Pagina: </label>
JSP – Lezione 5 – Le Standard Action
2
<select name="pagina" id="pagina">
<option value="null" selected>Seleziona la pagina</option>
<option value="pagina1.jsp" >Pagina 1</option>
<option value="pagina2.jsp">Pagina 2</option>
</select>
<br/><br/>
<input type="submit" value="Carica pagina" name="invia">
</fieldset>
</form>
</body>
</html>
I parametri scelti saranno inviati alla pagina caricaPagina.jsp:
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione include</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Nuova pagina con inclusione dinamica</h3>
<%
String nome=request.getParameter("nome");
String pagina=request.getParameter("pagina");
if (!nome.equals("") && !pagina.equals("null")){
%>
<jsp:include page="<%=pagina%>" />
<%
}
else
{
out.write("Inserisci i parametri");
%>
<br/>
<a href="esempio5_2.jsp" title="Torna indietro">Indietro</a>
<%
}
%>
</body>
</html>
Questa pagina preleva i parametri nome e pagina, verifica che non siano nulli e poi trasferisce la
richiesta al documento selezionato.
Di seguito si riporta il codice della pagina1.jsp (il codice della seconda pagina è simile):
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Pagina 1</title>
</head>
<body>
<h2>Questa è la pagina 1</h2><br/>
<%out.write("Nome inserito: "+request.getParameter("nome"));%>
</body>
</html>
JSP – Lezione 5 – Le Standard Action
3
Da notare come sia possibile utilizzare l’oggetto request in questo documento anche se la richiesta è
stata inoltrata alla pagina caricaPagina.jsp.
Differenze tra direttiva include e jsp:include
Dato che il risultato dei due metodi è simile, tanti potrebbero aver dubbi sull’utilità di avere i due
metodi in JSP. In realtà è il diverso modo di operare che giustifica la loro esistenza.
Con la direttiva include il codice viene copiato in un unico documento, mentre con l’azione include
il controllo viene trasferito al documento da includere per poi ritornare alla pagina chiamante. Il
trasferimento di richiesta avviene lato server, quindi il browser non viene interessato dalle richieste
generate dall’azione include.
Quando utilizzare l’uno e quando l’altro? In alcuni casi è indifferente ma considerando che alcuni
Application Server non aggiornano il codice compilato in caso di modifica dei documenti da
includere, è opportuno utilizzare il più possibile l’azione jsp:include.
La direttiva di solito viene utilizzata per la creazione di layout HTML (vedi index.jsp della lezione
3). Inoltre la direttiva è l’unico strumento che permette l’ inclusione di funzioni Java da utilizzare
nelle pagine JSP (vedi esempi di pagina.jsp e funzioni.jsp della lezione 3), questo perché con
l’azione include non si opera un innesto del codice e quindi risulta impossibile richiamare funzioni
Java da un’altra pagina.
L’azione include invece è molto utile quando si deve determinare la pagina da chiamare in maniera
dinamica (vedi esempio 5.2), inoltre è possibile inviare ulteriori parametri alla pagina utilizzando
l’azione jsp:param.
Vediamo l’esempio 5.3:
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione include</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h2>Passaggio dei parametri alla pagina da includere</h2>
<form method="post">
<fieldset>
<legend>Scelta articolo</legend>
<label for="articolo">Articoli: </label>
<select name="articolo" id="articolo">
<option value="a1" selected>Articolo 1</option>
<option value="a2">Articolo 2</option>
<option value="a3">Articolo 3</option>
</select><br/><br/>
<input type="submit" value="Invia dati" name="invia">
</fieldset>
</form>
<% if(request.getParameter("invia")!=null){
String IDArt=request.getParameter("articolo");
%>
<jsp:include page="parametri.jsp" >
<jsp:param name="IDarticolo" value="<%= IDArt %>" />
</jsp:include>
<%}%>
</body>
</html>
JSP – Lezione 5 – Le Standard Action
4
Il form permette di selezionare un articolo e il valore selezionato viene inviato alla stessa pagina.
Poi con le seguenti istruzioni:
<jsp:include page="parametri.jsp" >
<jsp:param name="IDarticolo" value="<%= IDArt %>" />
</jsp:include>
Si dice all’application server di eseguire la pagina parametri.jsp e di inviare il parametro Idarticolo
che ha per valore il contenuto della variabile IDArt.
Il file parametri.jsp riceve il valore e lo visualizza:
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione include</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Parametri ricevuti dalla pagina</h3>
<%
String IDArt=request.getParameter("IDarticolo");
out.write("E' stato selezionato l'articolo "+ IDArt);
%>
<br/>
<a href="index.html" title="Torna indietro">Indietro</a>
</body>
</html>
Il valore del parametro inviato avrà come scope (ambito di visibilità) la sola pagina inclusa, quindi
non sarà possibile utilizzarlo all’interno della pagina esempio5_3.jsp. Come pure le direttive page
non hanno alcun effetto sui documenti inclusi a differenza della direttiva include.
jsp:forward
L’azione jsp:forward si comporta in maniera analoga all’azione jsp:include, l’unica differenza è che
il controllo non viene restituito alla pagina chiamante, quindi il codice che segue l’azione viene
ignorato.
Altre differenze sono che l’oggetto request viene passato alla nuova pagina, mentre l’oggetto out
no. Quindi eventuali messaggi inseriti nel buffer, vengono cancellati. In caso di output non
bufferizzato si genera un’eccezione dato che il protocollo HTTP non è in grado di gestire i
trasferimenti di richiesta se parte dei dati (e precisamente le intestazioni HTTP) sono stati già inviati
al client.
In un certo senso quest’azione ha lo stesso effetto del metodo sendRedirect dell’oggetto response.
Tutte e due i metodi reindirizzano l’utente ad una nuova risorsa ma è importante capire
tecnicamente come funzionano le due istruzioni.
Il metodo sendRedirect invia del codice al browser che indica di chiamare una nuova risorsa e
questo significa che c’è un continuo scambio di risposte tra client e server. Inoltre nei
reindirizzamenti si perde il contesto dell’oggetto request e quindi eventuali valori da passare alle
nuove risorse andrebbero gestiti diversamente.
Mentre con l’azione jsp:forwad le richieste sono reindirizzate senza passare per il client e questo si
traduce in un notevole incremento di prestazioni.
Vediamo l’esempio 5.4:
JSP – Lezione 5 – Le Standard Action
5
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione forward</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h2>Esempio di azione jsp:forward</h2>
<p></p>
<form method="post">
<fieldset>
<legend>Invio parametri</legend>
<label for="nome">Nome: </label>
<input type="text" name="nome"/>
<br/><br/>
<input type="submit" value="Invia dati" name="invia">
</fieldset>
</form>
<% if(request.getParameter("invia")!=null){ %>
<p>Questo messaggio non verrà visualizzato</p>
<jsp:forward page="forward.jsp"/>
<%
}
%>
</body>
</html>
Il parametro nome verrà inviato alla stessa pagina che a sua volta trasferirà la richiesta alla pagina
forward.jsp:
<%@ page language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="IT">
<head>
<title>Azione forward</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h2>Esempio di azione jsp:forward</h2>
<p></p>
<%
out.write("Valore inviato:"+ request.getParameter("nome"));
%>
</body>
</html>
In questa pagina è possibile recuperare l'oggetto request della pagina chiamante. Mentre il buffer
dell’oggetto out verrà cancellato, infatti il messaggio presente nella pagina esempio5_4.jsp non
verrà visualizzato.
JSP – Lezione 5 – Le Standard Action
6