JSP parte C - · B6 JSP Paolo Salvaneschi 1 B6_3 V1.10 JSP parte C Applicazioni Internet B Paolo...
Transcript of JSP parte C - · B6 JSP Paolo Salvaneschi 1 B6_3 V1.10 JSP parte C Applicazioni Internet B Paolo...
B6 JSP Paolo Salvaneschi 1
B6_3 V1.10
JSP parte C
Applicazioni Internet B
Paolo Salvaneschi
Università di BergamoFacoltà di Ingegneria
Il contenuto del documento è liberamente utilizzabile dagli studenti, per studio personale e per supporto a lezioni universitarie.Ogni altro uso è riservato, e deve essere preventivamente autorizzato dall’ autore.
Sono graditi commenti o suggerimenti per il miglioramento del materiale
B6 JSP Paolo Salvaneschi 2B6 JSP Paolo Salvaneschi 2
• Utilizzo di JSTL – Installazione di JSTL– Azioni JSP di JSTL e linguaggio EL
• Gestione dell’input con JSTL• Passaggio del controllo tra pagine• Model View Controller• Passaggio dei dati tra pagine-scope
INDICE
B6 JSP Paolo Salvaneschi 3B6 JSP Paolo Salvaneschi 3
Utilizzo di JSTL
• Elementi di azione• Motivazione:permettere l’utilizzo di tag speciali
che realizzano funzioni utili per rendere dinamiche le pagine
• Raggruppati in tag libraries– Standard– Personalizzate– JSTL
B6 JSP Paolo Salvaneschi 4B6 JSP Paolo Salvaneschi 4
Utilizzo di JSTL
• Elementi di azione standard<jsp:
• Elementi di azione personalizzataSpecifica e ambiente di sviluppo per realizzare nuove azioni personalizzate (nuove tag library)
• JSTL (Java Standard Tag Library)Librerie predefinite di azioni
<c: Core
<x: Elaborazione XML
<fmt: Formattazione e internazionalizzazione
<sql: Accesso a database
B6 JSP Paolo Salvaneschi 5B6 JSP Paolo Salvaneschi 5
Utilizzo di JSTL
Esempio
Index.htm
Risposta.jsp
B6 JSP Paolo Salvaneschi 6B6 JSP Paolo Salvaneschi 6
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>prova</title></head><body bgcolor="white"><H1>Pagina di prova</H1><c:choose>
<c:when test="${param.nome == 'Mario'}"><HR><H2>Benvenuto <c:out value="${param.nome}" /></H2></HR>
</c:when><c:otherwise>
<HR><H2>Utente non riconosciuto</H2></HR>
</c:otherwise></c:choose></body></html>
Risposta.jsp
linguaggio EL
Dichiarazione di una tag library
Utilizzo di un tag
Utilizzo di JSTL
B6 JSP Paolo Salvaneschi 7B6 JSP Paolo Salvaneschi 7
Utilizzo di JSTL
• Installazione taglib jstl• Scaricare il distribution
jakarta-taglibs-standard-1.0.5.zipda http://jakarta.apache.org/taglibs
• Copiare i file dalla cartella lib alla cartella lib di Web-inf dell’applicazione
• Copiare i file dalla cartella tld alla cartella Web-infdell’applicazione
B6 JSP Paolo Salvaneschi 8B6 JSP Paolo Salvaneschi 8
Utilizzo di JSTL
• Files JAR– Contengono le classi java che implementano
le azioni• Files TLD
– Contengono le definizioni dei tag della libreria, i nomi delle classi,…Es. c.tld – espressioni con scripting
c-rt.tld – espressioni con linguaggio EL
B6 JSP Paolo Salvaneschi 9B6 JSP Paolo Salvaneschi 9
Utilizzo di JSTL
B6 JSP Paolo Salvaneschi 10B6 JSP Paolo Salvaneschi 10
Utilizzo di JSTL
• Dichiarazione di una tag library<%@taglib prefix=“prefisso” uri=“taglibURI” %>• Dichiara una tag library utilizzata nella pagina che
contiene azioni personalizzate (o JSTL)
prefix prefisso da utilizzare nei nomi degli elementi di azione
uri stringa utilizzata per localizzarel’implementazione della tag library(es. nome simbolico definito nel file TLD della library)
B6 JSP Paolo Salvaneschi 11B6 JSP Paolo Salvaneschi 11
Utilizzo di JSTL
• Utilizzo di una tag library - sintassi<prefix:action_name attr1=“value1” attr2=“value2”>
action_body</prefix:action_name>
• Esempio<jsp:forward page=“userinfovalid.jsp”>
<jsp:param name=“msg” value=“invalid email address” /></jsp:forward>
• Forma abbreviata <prefix:action_name attr1=“value1” attr2=“value2”/>
B6 JSP Paolo Salvaneschi 12B6 JSP Paolo Salvaneschi 12
Utilizzo di JSTL
<c:if><c:choose><c:when><c:otherwise><c:forEach><c:forTokens>
<c:out><c:import><c:redirect><c:url><c:param><c:remove><c:set><c:catch>
• La libreria JSTL core
B6 JSP Paolo Salvaneschi 13B6 JSP Paolo Salvaneschi 13
Utilizzo di JSTL
<c:if test=“espressione booleana”>Elementi JSP
</c:if><c:choose>
azioni <c:when> ed eventualmente un’azione <c:otherwise>
</c:choose>Elabora la prima azione <c:when> che ha espressione di test con valore true; se nessuna elabora <c:otherwise>
B6 JSP Paolo Salvaneschi 14B6 JSP Paolo Salvaneschi 14
Utilizzo di JSTL
<c:when test=“espressione booleana”>Elementi JSP
</c:when>
<c:otherwise>Elementi JSP
</c:otherwise>
B6 JSP Paolo Salvaneschi 15B6 JSP Paolo Salvaneschi 15
<c:choose><c:when test="${param.nome == 'Mario'}">
<HR><H2>Benvenuto <c:out value="${param.nome}" /></H2></HR>
</c:when><c:otherwise>
<HR><H2>Utente non riconosciuto</H2></HR>
</c:otherwise></c:choose>
paramVariabile EL implicita
Utilizzo di JSTL
B6 JSP Paolo Salvaneschi 16B6 JSP Paolo Salvaneschi 16
Utilizzo di JSTL
• Numero prefissato di iterazioni<c:forEach
[var=“var”][varStatus=“varStatus”]begin=“startIndex”end=“stopIndex”[step=“increment”]>
Elementi JSP</c:forEach>
Valuta il corpo un numero di volte prefissato
indice corrente
Variabile che contiene un oggetto LoopTagStatus che definisce lo
stato dell’iterazione
B6 JSP Paolo Salvaneschi 17B6 JSP Paolo Salvaneschi 17
Utilizzo di JSTL
• Iterazione sugli elementi di una collezione<c:forEach items=“collection”
[var=“var”][varStatus=“varStatus”][begin=“startIndex”][end=“stopIndex”][step=“increment”]>
Elementi JSP</c:forEach>
Valuta il corpo una volta per ciascun elemento di una collezione
elemento corrente della
collezione
collezione
Indice iniziale con base 0Default: 0
Indice finale con base 0 (incluso nell’iterazione). Default: ultimo elemento
B6 JSP Paolo Salvaneschi 18B6 JSP Paolo Salvaneschi 18
Utilizzo di JSTL
<%-- cinque iterazioni che scrivono 1,2,3,4,5 --%><c:forEach var=“current” begin=“1” end=“5”>
<c:out value=“${current}”/></c:forEach>
<%-- iterazione su tutti i parametri di una richiesta --%><c:forEach items=“${param}” var=“current”>
Name:<c:out value=“${current.key}”/>Value:<c:out value=“${current.value}”/>
</c:forEach>Nome e valore del singolo elemento (java.util.Map)
B6 JSP Paolo Salvaneschi 19B6 JSP Paolo Salvaneschi 19
Utilizzo di JSTL
<c:forTokens items=“stringOfTokens”delims=“delimiters”[var=“var”][varStatus=“varStatus”][begin=“startIndex”][end=“stopIndex”][step=“increment”]>
Elementi JSP</c:forTokens >
Valuta il corpo una voltaper ciascun tokenpresente in una String, delimitato da un carattere specificato
Elenco dei delimitatori
I token su cui effettuare l’iterazione
elemento corrente
B6 JSP Paolo Salvaneschi 20B6 JSP Paolo Salvaneschi 20
Utilizzo di JSTL
<%-- iterazione su token separati da barre verticali --%><c:forTokens items=“${tokens}” delims=“|”
var=“current”><c:out value=“${current}”/>
</c:forTokens>
B6 JSP Paolo Salvaneschi 21B6 JSP Paolo Salvaneschi 21
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title></title></head><c:set var="elemento" value="primo|secondo|terzo|quarto"/><h3>Elemento</h3><c:out value="${elemento}"/><h3>Tokens</h3><c:forTokens items="${elemento}" delims="|" var="current">
<c:out value="${current}"/> <br></c:forTokens></body></html>
Utilizzo di JSTL
B6 JSP Paolo Salvaneschi 22B6 JSP Paolo Salvaneschi 22
Utilizzo di JSTL
<c:out value=“espressione”[default=“espressioneDiDefault”]/>Valuta un’espressione e inserisce il risultato nella risposta convertito in String ( o un valore di default se l’espressione vale null)
B6 JSP Paolo Salvaneschi 23B6 JSP Paolo Salvaneschi 23
Utilizzo di JSTL
<c:import> Importa una risorsa interna (all’applicazione web) (come <jsp:include>) o esterna.(può essere salvato il contenuto come String o reso disponibile tramite java.io.Reader --- vedi JSTL library X:)
<c:redirect> Invia al client una URL che indica di effettuare una nuova richiesta
<c:url> Applica regole di conversione ad una URL (es. da percorso relativo al contesto (tomcat) a percorso relativo al server)
<c:param> Utilizzata nidificata con le precedenti per inserire un parametro della richiesta in un URL
B6 JSP Paolo Salvaneschi 24B6 JSP Paolo Salvaneschi 24
Utilizzo di JSTL
<c:set> imposta una variabile di scope<c:set var= " name " value= " myname " scope= " session " />
<c:remove> rimuove una variabile di scope<c:remove var= " authenticationToken " scope= " session " />
<c:catch> intercetta un’eccezione lanciata da elementi JSP
Cfr.Passaggio dati tra pagine
B6 JSP Paolo Salvaneschi 25B6 JSP Paolo Salvaneschi 25
Utilizzo di JSTL
• IL linguaggio EL• Linguaggio per scrivere le espressioni che
impostano dinamicamente gli attributi delle azioni <c:out value="${param.nome} "/>
• EL fa parte delle specifiche JSTLNon delle azioni standard
<jsp:setProperty name="msg" property="category" value= "<%= request.getParameter('item') %>" />
Espressione java
Linguaggio EL
B6 JSP Paolo Salvaneschi 26B6 JSP Paolo Salvaneschi 26
Utilizzo di JSTL
• Sintassi<c:out value="${param.nome}"/>
– Inizio con delimitatore ${– Fine con }– Si possono combinare espressioni EL e testo
statico<c:out value="Risultato:${1+2+3}"/>
B6 JSP Paolo Salvaneschi 27B6 JSP Paolo Salvaneschi 27
Utilizzo di JSTL
• Sintassi– Operatori: + - * / < ,>,&&,||,!,empty (var con
valore nullo o vuoto )……..– Variabili specifiche dell’applicazione– Variabili implicite previste da EL
B6 JSP Paolo Salvaneschi 28B6 JSP Paolo Salvaneschi 28
Utilizzo di JSTL
• Variabili implicite previste da EL param
collezione di tutti i valori dei parametri della richiesta, un valoreString per parametro (java.util.Map)
paramValuesidem, array di String per ogni parametro (java.util.Map) (es. di uso con checkbox)
B6 JSP Paolo Salvaneschi 29B6 JSP Paolo Salvaneschi 29
Utilizzo di JSTL
• Variabili implicite previste da EL pageScope, requestScope, sessionScope,applicationScopecollezione di tutte le variabili con scope a livello di pagina, richiesta,sessione, applicazione
pageContextFornisce l’accesso a vari dati relativi alla richiesta(es.pageContext.request.method)………………..
B6 JSP Paolo Salvaneschi 30B6 JSP Paolo Salvaneschi 30
Gestione dell’input con JSTL
index.jsp
response.jsp
Esempio 1
B6 JSP Paolo Salvaneschi 31B6 JSP Paolo Salvaneschi 31
<html><head><title>User Info Entry Form</title></head><body bgcolor="white"><form action="response.jsp" method="post">
<table><tr><td>Nome:</td><td><input type="text" name="nome"></td></tr><tr><td>Cognome:</td><td><input type="text" name="cognome"></td></tr><tr> <td>Vini preferiti:</td><td>
<input type="checkbox" name="vino" value="Ferrari">Ferrari<br><input type="checkbox" name="vino" value="Berlucchi">Berlucchi<br><input type="checkbox" name="vino" value="Prosecco">Prosecco<br></td>
</tr><tr><td><input type="submit" value="Invia"></td></tr>
</table></form>
</body></html>
Gestione dell’input con JSTL
B6 JSP Paolo Salvaneschi 32B6 JSP Paolo Salvaneschi 32
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>User Info Response</title></head><body bgcolor="white"><h2>Dati ricevuti</h2><table border="1">
<tr><td>Nome:</td><td><c:out value="${param.nome}" /></td>
</tr><tr><td>Cognome:</td><td><c:out value="${param.cognome}" /></td>
</tr><td>Vini preferiti:</td><td><c:forEach items="${paramValues.vino}" var="current"><c:out value="${current}" /> <br></c:forEach></td>
</table></body></html>
Gestione dell’input con JSTL
Per tutti gli elementi dell’array di String (da 0 a ultimo)
B6 JSP Paolo Salvaneschi 33B6 JSP Paolo Salvaneschi 33
Gestione dell’input con JSTL
Esempio 2
B6 JSP Paolo Salvaneschi 34B6 JSP Paolo Salvaneschi 34
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>Request Info</title></head><body bgcolor="white"><h2>Sono state ricevute le seguenti informazioni:</h2><ul>
<li>Request Method: <c:out value="${pageContext.request.method}" />
<li>Request Protocol: <c:out value="${pageContext.request.protocol}" />
<li>Request URL: <c:out value="${pageContext.request.requestURL}" />
<li>Server Port: <c:out value="${pageContext.request.serverPort}" />
<li>Remote Address: <c:out value="${pageContext.request.remoteAddr}" />
</ul></body></html>
Gestione dell’input con JSTL
B6 JSP Paolo Salvaneschi 35B6 JSP Paolo Salvaneschi 35
Gestione dell’input con JSTL
Validazione dell’input
B6 JSP Paolo Salvaneschi 36B6 JSP Paolo Salvaneschi 36
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>User Info Entry Form</title></head><body bgcolor="white"><form action="index.jsp" method="post">
<input type="hidden" name="formInviata" value="true"><table>
<c:if test="${param.formInviata && empty param.nome}"><tr><td></td><td colspan="2"><font color="red">
Scrivere il nome</font></td></tr>
</c:if><tr><td>Nome:</td><td>
<input type="text" name="nome“ value="<c:out value="${param.nome}" />"></td>
</tr>
Gestione dell’input con JSTL
Validazione dell’input
Al primo caricamento della pagina non è true
(null)
Verifica se il valore della variabile è not null AND stringa vuota (" ")
B6 JSP Paolo Salvaneschi 37B6 JSP Paolo Salvaneschi 37
Gestione dell’input con JSTL
<c:if test="${param.formInviata && empty param.cognome}"><tr><td></td><td colspan="2"><font color="red">
Scrivere il cognome</font></td></tr>
</c:if><tr><td>Cognome:</td><td><input type="text" name="cognome"
value="<c:out value="${param.cognome}" />"></td></tr>
<tr><td colspan="3">
<input type="submit" value="Send Data"></td>
</tr></table>
</form></body></html>
Validazione dell’input
Nota: quando tutti iparametri sono validatisi può passare il controlload un’altra pagina affinchèelabori i parametri……
B6 JSP Paolo Salvaneschi 38B6 JSP Paolo Salvaneschi 38
Passaggio del controllo tra pagine
<jsp:forward page=“nextPage.jsp”/>Trasferisce il controllo dell’elaborazione della richiesta http ad un’altra pagina. Il controllo non torna alla pagina di origine.
<jsp:forward page=“nextPage.jsp”>
<jsp:param> <jsp:param> ….</jsp:forward >
Trasferisce il controllo dell’elaborazione della richiesta http ad un’altra pagina passando parametri supplementari che si aggiungono ai parametri della richiesta http
B6 JSP Paolo Salvaneschi 39B6 JSP Paolo Salvaneschi 39
Passaggio del controllo tra pagine
http://localhost:8080/Es_controllo_1/index.jsp?nome=Mario&cognome=Rossi
B6 JSP Paolo Salvaneschi 40B6 JSP Paolo Salvaneschi 40
Passaggio del controllo tra pagine
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><HTML><HEAD></HEAD><BODY><H1>
Pagina chiamata<HR> <BR><H2>Nome:<c:out value="${param.nome}" /></H2><H2>Cognome:<c:out value="${param.cognome}" /></H2>
</H1><HR></BODY></HTML>
<HTML><HEAD></HEAD><BODY>
<jsp:forward page="forwarded.jsp"/></BODY></HTML>
B6 JSP Paolo Salvaneschi 41B6 JSP Paolo Salvaneschi 41
Passaggio del controllo tra pagine
http://localhost:8080/Es_controllo_1/index.jsp?nome=Mario&cognome=Rossi
indirizzo=Via Roma 4
B6 JSP Paolo Salvaneschi 42B6 JSP Paolo Salvaneschi 42
Passaggio del controllo tra pagine
<HTML><HEAD></HEAD><BODY><HR>
<jsp:forward page="forwarded.jsp"><jsp:param name="indirizzo" value="Via Roma 4"/>
</jsp:forward></BODY></HTML>
B6 JSP Paolo Salvaneschi 43B6 JSP Paolo Salvaneschi 43
Passaggio del controllo tra pagine
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><HTML><HEAD></HEAD><BODY><H1>
Pagina chiamata<HR> <BR><H2>Nome:<c:out value="${param.nome}" /></H2><H2>Cognome:<c:out value="${param.cognome}" /></H2><H2>Indirizzo:<c:out value="${param.indirizzo}" /></H2>
</H1><HR></BODY></HTML>
B6 JSP Paolo Salvaneschi 44B6 JSP Paolo Salvaneschi 44
Passaggio del controllo tra pagine
index.jsp
forwarded.jsp
index.jsp
B6 JSP Paolo Salvaneschi 45B6 JSP Paolo Salvaneschi 45
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>User Info Entry Form</title></head><body bgcolor="white"><c:if test="${!empty param.nome && !empty param.cognome}"><jsp:forward page="forwarded.jsp"/>
</c:if><form action="index.jsp" method="post">
<input type="hidden" name="formInviata" value="true"><table>
<c:if test="${param.formInviata && empty param.nome}"><tr><td></td><td colspan="2"><font color="red">
Scrivere il nome</font></td></tr>
</c:if><tr>
…………come prima……………….
Gestione dell’input con JSTL
Esempio precedente(validazionedell’input)modificato
Nota: trasferisce il controllo dell’elaborazione della richiesta http. Il controllo non torna alla pagina di origine.
B6 JSP Paolo Salvaneschi 46B6 JSP Paolo Salvaneschi 46
Model View Controller
B6 JSP Paolo Salvaneschi 47B6 JSP Paolo Salvaneschi 47
Model View Controller
Gestione
Cliente
Formdi richiesta
index.htm
Pagina dirisposta valida
Pagina dirisposta
non validaaccetta.jsp rifiuta.jsp
Gestione.JSP
ClienteBeanModel
View
Controller
submit forwardforward
Bean access
B6 JSP Paolo Salvaneschi 48B6 JSP Paolo Salvaneschi 48
• Model– contiene dati / comportamenti relativi al
dominio • View
– visualizza il modello– visualizza ogni informazione necessaria
• Controller– gestisce l’input– manipola il modello– causa l’attivazione della view appropriata
Model View Controller
B6 JSP Paolo Salvaneschi 49B6 JSP Paolo Salvaneschi 49
Model View Controller
Gestione
Cliente
Formdi richiesta
index.htm
Pagina dirisposta valida
Pagina dirisposta
non valida
accetta.jsp rifiuta.jsp
Gestione.JSP
ClienteBeanModel
View
Controller
Nota: nonostante sembri dalla forma non è una architettura a layer
B6 JSP Paolo Salvaneschi 50B6 JSP Paolo Salvaneschi 50
Model View Controller
Formdi richiesta
<HTML><HEAD></HEAD><BODY><H1>Form di richiesta</H1><HR><FORM method= "get" action="gestione.jsp">Nome:<br><input type="text" name="nome" size="30"><br>Cognome:<br><input type="text" name="cognome" size="30"><br>Codice utente:<br><input type="text" name="codice" size="10" maxlength ="10"><br><br>Tipo fornitura:<br><input type="radio" name="tipo" Value="tipoC">Prodotto su specifica<br><input type="radio" name="tipo" Value="tipoD" checked>Prodotto a magazzino<br><br><input type="submit" value="Invia"></FORM></BODY></HTML>
B6 JSP Paolo Salvaneschi 51B6 JSP Paolo Salvaneschi 51
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><HTML><HEAD></HEAD><BODY><HR> <BR><H2><c:out value="${param.info}" /></H2></H1><HR></BODY></HTML>
Model View Controller
Pagina dirisposta valida
Pagina dirisposta
non valida
<HTML><HEAD></HEAD><BODY><HR><BR><H2> Richiesta non accettata</H2><BR><HR></BODY></HTML>
B6 JSP Paolo Salvaneschi 52B6 JSP Paolo Salvaneschi 52
Model View Controller
Gestione
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><jsp:useBean id="cliente" class="info.ClienteBean" />
<jsp:setProperty name="cliente" property="*" /><c:choose>
<c:when test="${cliente.stato == 'Cliente riconosciuto'}"><jsp:forward page="accetta.jsp"><jsp:param name="info"value="Cliente riconosciuto--Sconto accordato"/>
</jsp:forward></c:when><c:otherwise>
<jsp:forward page="rifiuta.jsp"/></c:otherwise>
</c:choose>
Nota: non utilizza HTML
B6 JSP Paolo Salvaneschi 53B6 JSP Paolo Salvaneschi 53
Importo dello sconto accordatoReadStringsconto
Stato: “Cliente non riconosciuto” , “Cliente riconosciuto”La lettura dello stato causa l’aggiornamento dello sconto
ReadStringstato
Tipo fornituraReadWrite
Stringtipo
Codice utenteReadWrite
Stringcodice
Cognome del clienteReadWrite
Stringcognome
Nome del clienteReadWrite
StringnomeClienteBeanDescrizioneAccessoTipoProprietàNome
Utilizzo di componenti JavaBean
Cliente
B6 JSP Paolo Salvaneschi 54B6 JSP Paolo Salvaneschi 54
Model View Controller
package info;import java.util.*;public class ClienteBean implements java.io.Serializable {
private String nome;private String cognome;private String codice;private String tipo;private String stato;private String sconto;
//Costruttore che inizializza le strutture di datipublic ClienteBean() {
initCliente();}
Cliente
B6 JSP Paolo Salvaneschi 55B6 JSP Paolo Salvaneschi 55
//Return stato e scontopublic String getStato() {
stato = "Cliente non riconosciuto";sconto = "-------";if ("Mario".equals(nome)) {stato = "Cliente riconosciuto";sconto = "20 %";}return stato;}
public String getSconto() {return sconto;}
//Inizializzaprivate void initCliente() {
nome = " ";cognome = " ";codice = " ";tipo = " ";stato = " ";sconto = "0 %";}}
Model View Controller
//Set dei parametri Clientepublic void setNome(String nome) {
this.nome = nome;}public void setCognome(String cognome) {
this.cognome = cognome;}public void setCodice(String codice) {
this.codice = codice;}public void setTipo(String tipo) {
this. tipo = tipo;}
//Return anagrafica clientepublic String getNome() {
return nome;}public String getCognome() {
return cognome;}public String getCodice() {
return codice;}public String getTipo() {
return tipo;}
B6 JSP Paolo Salvaneschi 56B6 JSP Paolo Salvaneschi 56
• Nota: Accesso alle proprietà del Bean– Accesso con jsp:getProperty
<jsp:getProperty name="cliente" property="stato" />Aggiunge il valore della proprietà di un Bean convertito in una stringa, alla risposta generata dalla pagina
– Accesso con notazione a punto attraverso EL<c:out value="${cliente.stato}" />ottiene lo stesso risultato di sopra
<c:when test="${cliente.stato == 'Cliente riconosciuto'}">………<c:set var="statoLocale" value="${cliente.stato}" />
Model View Controller
B6 JSP Paolo Salvaneschi 57B6 JSP Paolo Salvaneschi 57
Passaggio dei dati tra pagine - scope
• Condivisione dati tra pagine:Scope (ambiti di validità)
• Lo scope definisce la disponibilità di un oggetto:– Page (default) oggetti disponibili solo all’interno di una
pagina
– Request oggetti disponibili a tutte le pagine che elaborano la stessa richiesta (cfr. jsp:forward)
– Session oggetti condivisi da più richieste dello stesso browser
– Application oggetti condivisi da tutti gli utenti dell’applicazione web
B6 JSP Paolo Salvaneschi 58B6 JSP Paolo Salvaneschi 58
Passaggio dei dati tra pagine - scope
Pagina 1
Scope di pagina
Scope di sessione
Scope di richiesta
Pagina 3Pagina 2 Pagina 4
Scope di pagina
inoltroinoltro
Scope di pagina Scope di pagina
Scope di richiesta
richiesta richiestarisposta risposta
Client
B6 JSP Paolo Salvaneschi 59B6 JSP Paolo Salvaneschi 59
Passaggio dei dati tra pagine - scope
• Nota: il nome di un oggetto deve essere univoco in tutti gli scope (secondo la specifica JSP. In pratica disatteso dai container che implementano JSP)
• Specifica dello scope. Esempio:<jsp:useBean id="cliente" scope="request"
class="info.ClienteBean" />Al momento dell’esecuzione cerca un bean con lo stesso nome nello scope. Se esiste: nulla. Se non esiste: crea istanza nello scope
• Accesso tramite variabili implicite<c:out value="${pageScope.userInfo1.userName}" /><c:out value="${requestScope.userInfo2.userName}" />
B6 JSP Paolo Salvaneschi 60B6 JSP Paolo Salvaneschi 60
Passaggio dei dati tra pagine - scope
Gestione
Cliente
Formdi richiesta
index.jsp Pagina dirisposta valida
accetta.jsp
gestione.JSP
clienteBeanModel
View
Controller
scope object Bean access
submit
forward forward
B6 JSP Paolo Salvaneschi 61B6 JSP Paolo Salvaneschi 61
Passaggio dei dati tra pagine - scope
B6 JSP Paolo Salvaneschi 62B6 JSP Paolo Salvaneschi 62
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><jsp:useBean id="cliente" scope="request" class="info.ClienteBean" /><HTML><HEAD></HEAD><BODY><H1>Form di richiesta</H1><HR><FORM method= "get" action="gestione.jsp">Nome:<br><input type="text" name="nome" size="30"><br>Cognome:<br><input type="text" name="cognome" size="30"><br>Codice utente:<br><input type="text" name="codice" size="10" maxlength ="10"><br><br>Tipo fornitura:<br><input type="radio" name="tipo" Value="tipoC">Prodotto su specifica<br><input type="radio" name="tipo" Value="tipoD" checked>Prodotto a magazzino<br><br>
……
Passaggio dei dati tra pagine - scope
Formdi richiesta
NB
B6 JSP Paolo Salvaneschi 63B6 JSP Paolo Salvaneschi 63
………
<c:if test="${param.info == 'Cliente non riconosciuto'}"><font color="red">Nome:<c:out value="${cliente.nome}" /><br>Cognome:<c:out value="${cliente.cognome}" /><br>Cliente non riconosciuto. Inserire i dati<br><br></font>
</c:if><input type="submit" value="Invia"></FORM></BODY></HTML>
Passaggio dei dati tra pagine - scope
Formdi richiesta
Proprietà del Bean nello scope di request
(E’ il Bean caricato con i dati della form. I dati sono utilizzati per produrre la scritta
in rosso)
B6 JSP Paolo Salvaneschi 64B6 JSP Paolo Salvaneschi 64
Passaggio dei dati tra pagine - scope
Pagina dirisposta valida Cliente
Come esempio precedente
B6 JSP Paolo Salvaneschi 65B6 JSP Paolo Salvaneschi 65
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><jsp:useBean id="cliente" scope="request" class="info.ClienteBean" />
<jsp:setProperty name="cliente" property="*" /><c:choose>
<c:when test="${cliente.stato == 'Cliente riconosciuto'}"><jsp:forward page="accetta.jsp"><jsp:param name="info" value="Cliente riconosciuto--Sconto accordato"/></jsp:forward>
</c:when><c:otherwise>
<jsp:forward page="index.jsp"><jsp:param name="info" value="Cliente non riconosciuto"/></jsp:forward>
</c:otherwise></c:choose>
Passaggio dei dati tra pagine - scope
Gestione
Torna alla form di richiesta
B6 JSP Paolo Salvaneschi 66B6 JSP Paolo Salvaneschi 66
Passaggio dei dati tra pagine - scope
• Nota sull’esempio:• Prima request della pagina index.jsp: è creato un
Bean cliente (che non è utilizzato)• L’utente compila la form e inoltra una nuova
request alla pagina gestione.jsp la quale – Crea un nuovo Bean cliente (il vecchio è fuori dallo
scope di validità – è una nuova request)– Imposta le proprietà del Bean– Passa il controllo alla pagina index.jsp (nello stesso
scope di request)
B6 JSP Paolo Salvaneschi 67B6 JSP Paolo Salvaneschi 67
Passaggio dei dati tra pagine - scope
• La pagina index.jsp:– recupera il Bean esistente nello scope di
request– utilizza le proprietà caricate da gestione.jsp per
visualizzare la segnalazione di errore
B6 JSP Paolo Salvaneschi 68B6 JSP Paolo Salvaneschi 68
Passaggio dei dati tra pagine - scope
• Attenzione quando si mischia l’utilizzo di JSTL e lo scripting
• Le azioni JSTL espongono i dati mediante le variabili di scope che vivono in uno degli scope di JSP
• Uno scriptlet dichiara variabili di scripting nello specifico linguaggio (java)
B6 JSP Paolo Salvaneschi 69B6 JSP Paolo Salvaneschi 69
Passaggio dei dati tra pagine - scope
• Per manipolare variabili di scope in uno script bisogna disporre di una variabile di scripting che accede alla variabile di scope
• L’azione <jsp:useBean... crea anche una variabile di scripting che contiene il riferimento all’istanza di Bean.
B6 JSP Paolo Salvaneschi 70B6 JSP Paolo Salvaneschi 70
Passaggio dei dati tra pagine - scope
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><jsp:useBean id="magazzino" scope="request" class="info.MagazzinoBean" />
<jsp:setProperty name="magazzino" property="*" /><%-- Nota: l'unico articolo in magazzino è "patate" con codice "p21" --%><c:choose>
<c:when test="${magazzino.stato == 'a_magazzino'}"><jsp:forward page="rispondi_ok.jsp">
<jsp:param name="info" value="Articolo a magazzino"/></jsp:forward>
</c:when><c:otherwise>
<jsp:forward page="rispondi_nok.jsp"><jsp:param name="info" value="Articolo non a magazzino"/>
</jsp:forward></c:otherwise>
</c:choose>
B6 JSP Paolo Salvaneschi 71B6 JSP Paolo Salvaneschi 71
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><jsp:useBean id="magazzino" scope="request" class="info.MagazzinoBean" /><HTML><HEAD></HEAD><BODY>
<HR> <BR><H2><c:out value="${param.info}" /></H2><font color="red">Quantità attualmente disponibile:<br>
<c:out value="${magazzino.quantità}" /><br><jsp:getProperty name="magazzino" property="quantità" /><br><%=magazzino.getQuantità()%></font>
</H1><HR>
Passaggio dei dati tra pagine - scope
rispondi_ok
Accesso alla proprietà del bean con–notazione a punto attraverso EL–jsp:getProperty–Script (espressione)
B6 JSP Paolo Salvaneschi 72B6 JSP Paolo Salvaneschi 72
Passaggio dei dati tra pagine - scope
<%--con la dichiarazione <jsp:useBean.... tutti e tre i modi funzionano--%><%--senza <jsp:useBean.... funzionano i primi due: le librerie JSTL ritrovano la VARIABILE DI SCOPE "magazzino" nello scope di request--%>
<%--ma non funziona il terzo. Infatti il terzo richiede una VARIABILE DI SCRIPTINGche contenga il riferimento all'oggetto "magazzino".
L’azione <jsp:useBean... Al momento dell’esecuzione cerca un beancon lo stesso nome nello scope. Se esiste non crea un’istanza nello scope.
Crea anche una variabile di scripting che contiene il riferimento all’istanza di Bean.L’utilizzo dell’azione è un modo per creare la variabile di scriptinge rendere accessibili le variabili di scope allo script--%>
rispondi_ok
B6 JSP Paolo Salvaneschi 73B6 JSP Paolo Salvaneschi 73
Passaggio dei dati tra pagine - scope
• Condivisione dei dati di sessione e applicazione
Ogni finestra dell’esempio è
associata ad una sessione
B6 JSP Paolo Salvaneschi 74B6 JSP Paolo Salvaneschi 74
Passaggio dei dati tra pagine - scope
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html><head><title>Counter page</title></head><body bgcolor="white"><%-- Increment counters --%><c:set var="sessionCounter" scope="session"
value="${sessionCounter + 1}" /><c:set var="applCounter" scope="application"
value="${applCounter + 1}" /><h1>Counter page</h1><h2>This page has been visited <i><c:out value="${sessionCounter}" /></i> times within the current session, and <i><c:out value="${applCounter}" /></i> times by all users since the application was started.</h2>
</body></html>
Incrementato ad ogni attivazione
dell’applicazione web
Incrementato ad ogni attivazione da parte dello stesso browser
B6 JSP Paolo Salvaneschi 75B6 JSP Paolo Salvaneschi 75
Passaggio dei dati tra pagine - scope
sessione
B6 JSP Paolo Salvaneschi 76B6 JSP Paolo Salvaneschi 76
………………<The following information was received:<ul>
<li>Request Method: <c:out value="${pageContext.request.method}" /><li>Request Protocol: <c:out value="${pageContext.request.protocol}" /><li>Request URL: <c:out value="${pageContext.request.requestURL}" /><li>Server Port: <c:out value="${pageContext.request.serverPort}" /><li>Remote Host: <c:out value="${pageContext.request.remoteHost}" />
<li>Cookies:<br><c:forEach items="${pageContext.request.cookies}" var="c">
<b><c:out value="${c.name}" /></b>:<c:out value="${c.value}" /><br>
</c:forEach></ul>
</body></html>
Passaggio dei dati tra pagine - scope