9. Applicazione Web MVC [person] – Versione 4
Questa versione utilizza la libreria di tag JSTL presentata in precedenza.
9.1. Il progetto Eclipse
Per creare il progetto Eclipse [mvc-personne-04] per l'applicazione Web [/personne4], duplicare il progetto [mvc-personne-03] seguendo la procedura descritta nella sezione 6.2 a pagina 78.
![]() | ![]() |
9.2. Configurazione dell'applicazione web [personne4]
Il file web.xml per l'applicazione /personne4 è il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>mvc-personne-04</display-name>
...
Questo file è identico a quello della versione precedente, tranne che per la riga 6, dove il nome visualizzato dell'applicazione web è stato modificato in [mvc-personne-04].
La pagina iniziale [index.jsp] cambia:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<c:redirect url="/main"/>
- riga 5: la pagina [index.jsp] reindirizza il client all'URL [/main], che porta al controller [ServletPersonne] dell'applicazione [/personne4]. Il tag <c:redirect> appartiene alla libreria JSTL / Core. Ha la particolarità di completare l'URL del suo attributo [url] aggiungendo:
- il prefisso [/context], dove [context] è il contesto dell'applicazione, in questo caso [personne4].
- il suffisso [?jsessionid=id_session] se il browser che effettua la richiesta non ha inviato un cookie di sessione. L'identificatore [jsessionid] si riferisce all'identificatore del token di sessione inviato dal server web ai propri clienti. Dipende dal server web. In questo caso, è quello del server Tomcat. [id_session] è il token di sessione stesso.
Pertanto, l'URL di reindirizzamento effettivo alla riga 5 di [index.jsp] è l'URL [/person4/main?jsessionid=XX], dove XX è il token di sessione. Ciò è mostrato nella pagina sottostante, ottenuta dopo aver inizialmente richiesto l'URL [http://localhost:8080/personne4]:

La relazione tra il tag <c:redirect> e il token di sessione è piuttosto sottile. È troppo presto per approfondirla qui, ma avremo l'opportunità di riprenderla in seguito.
9.3. Il codice della vista
9.3.1. La vista [form]
Questa vista non è cambiata:

È generata dalla seguente pagina JSP [formulaire.jsp]:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne - formulaire</title>
<script language="javascript">
...
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<form name="frmPersonne" method="post">
<table>
<tr>
<td>Nom</td>
<td><input name="txtNom" value="${nom}" type="text" size="20"></td>
</tr>
<tr>
<td>Age</td>
<td><input name="txtAge" value="${age}" type="text" size="3"></td>
</tr>
<tr>
</table>
<table>
<tr>
<td><input type="submit" value="Submit"></td>
<td><input type="button" value="[Envoyer]" onclick="envoyer()"></td>
<td><input type="reset" value="Rétablir"></td>
<td><input type="button" value="[Effacer]" onclick="effacer()"></td>
</tr>
</table>
<input type="hidden" name="action" value="validationFormulaire">
</form>
</center>
</body>
</html>
Novità:
- Riga 4: Dichiarazione della libreria di tag JSTL / Core
- Righe 21, 25: Recupero degli attributi [name, age] dal modello di pagina. Si noti che questi attributi verranno cercati in successione nella richiesta, nella sessione e nell'applicazione della pagina JSP. Nel nostro caso, il controller li inserirà nella sessione.
- Non c'è più alcun codice Java all'inizio della pagina JSP per recuperare il modello della pagina a causa dell'implementazione precedente.
9.3.2. La vista [risposta]
Questa vista non è cambiata:
![]() | ![]() |
La nuova pagina JSP [response.jsp] è la seguente:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td>${nom}</td>
</tr>
<tr>
<td>Age</td>
<td>${age}</td>
</tr>
</table>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
Novità:
- riga 4: dichiarazione della libreria di tag JSTL / Core
- Righe 16, 20, 28: recupero degli attributi [name, age, formSubmitLink] nel modello di pagina. Non è più presente alcun codice Java all'inizio della pagina JSP per recuperarli.
9.3.3. La vista [errors]
Questa vista non è cambiata:
![]() | ![]() |
La nuova pagina JSP [errors.jsp] è la seguente:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
Novità:
- riga 4: dichiarazione della libreria di tag JSTL / Core
- Righe 13–15: visualizzazione dell'elenco degli errori tramite JSTL
- Non c'è più alcun codice Java all'inizio della pagina JSP per recuperare il suo modello.
9.4. Test delle viste
Per testare le viste precedenti, duplichiamo le relative pagine JSP nella cartella /WebContent/JSP del progetto Eclipse:

Quindi, nella cartella JSP, le pagine vengono modificate come segue:
[form.jsp]:
...
<%
// -- test : on crée le modèle de la page
session.setAttribute("nom","tintin");
session.setAttribute("age","30");
%>
<html>
<head>
Le righe 4–5 sono state aggiunte per creare il modello richiesto dalla pagina.
[response.jsp]:
...
<%
// -- test : on crée le modèle de la page
request.setAttribute("nom","milou");
request.setAttribute("age","10");
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<html>
<head>
...
Le righe 4-6 sono state aggiunte per creare il modello richiesto dalla pagina.
[errors.jsp]:
<%
// -- test : on crée le modèle de la page
ArrayList<String> erreurs1=new ArrayList<String>();
erreurs1.add("erreur1");
erreurs1.add("erreur2");
request.setAttribute("erreurs",erreurs1);
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<html>
<head>
Le righe 4-8 sono state aggiunte per creare il modello richiesto dalla pagina.
Avvia Tomcat se non l'hai già fatto, quindi effettua una richiesta ai seguenti URL:
![]() | ![]() |
![]() |
Otteniamo le visualizzazioni previste.
9.5. Il controller [ServletPersonne]
Il controller [ServletPersonne] dell'applicazione web [/personne3] gestirà le seguenti azioni:
No. | richiesta | origine | elaborazione |
1 | [GET /person4/main] | URL inserito dall'utente | - invia la vista [form] vuota |
2 | [POST /person4/hand] con i parametri [txtName, txtAge, action=validateForm] pubblicato | fare clic sul [Invia] nel [form] | - controlla i valori dei parametri [txtName, txtAge] - se non sono corretti, inviare la vista [errors(errors)] - se sono corretti, invia la vista [response(name,age)] |
3 | [POST /person4/main] con i parametri [action=returnForm] pubblicato | fare clic sul [Torna al modulo] dal [risposta] e [errori]. | - invia la vista [modulo] precompilata con gli ultimi valori inseriti |
Lo scheletro del controller [ServletPersonne] è identico a quello della versione precedente. Esamineremo le modifiche apportate ai metodi [doInit, doValidationFormulaire, doRetourFormulaire]; i metodi [init, doGet, doPost] rimangono invariati.
9.5.1. Il metodo [doInit]
Questo metodo gestisce la richiesta n. 1 [GET /personne4/main]. Il suo codice è il seguente:
Novità:
- Riga 3: Viene visualizzata la vista [form]. Questa vista si aspetta gli attributi "name" e "age" nel proprio template. Non li troverà perché il controller non li fornisce. In questo caso, la libreria JSTL recupererà puntatori null per questi attributi. Ciò non causa alcun errore e verranno visualizzati valori vuoti per gli elementi ${name} e ${age} della vista [form]. Questo ci va bene. Evitiamo così di dover inizializzare il modello della vista [form].
9.5.2. Il metodo [doValidationFormulaire]
Questo metodo gestisce la richiesta n. 2 [POST /person4/main] con [action, txtName, txtAge] negli elementi inviati. Il suo codice è il seguente:
Novità:
- Riga 15: Il metodo [doValidationFormulaire] restituisce la vista [response]. Questa vista ha gli elementi [name, age, formReturnLink] nel proprio modello. [formReturnLink] viene aggiunto al modello alla riga 14 tramite la richiesta. Gli elementi [name, age] vengono inseriti nel modello alle righe 8–10 tramite la sessione. Nella versione precedente, avevamo inserito gli elementi [name, age] anche nella richiesta al momento dell'invio della vista [response], poiché tale vista li aspettava lì. Qui, con la libreria JSTL, sappiamo che i vari contesti (richiesta, sessione, applicazione) verranno esaminati per trovare gli elementi del modello. Essi saranno quindi reperibili nella sessione, poiché il controller li ha inseriti lì (righe 8–10).
9.5.3. Il metodo [doRetourFormulaire]
Questo metodo elabora la richiesta n. 3 [POST /person4/main] con [action=retourFormulaire] negli elementi inviati. Il suo codice è il seguente:
Novità:
- riga 4: viene visualizzata la vista [form]. Questa vista richiede gli attributi "name" e "age" nel proprio modello. Li troverà nella sessione poiché il metodo [doValidationForm] li ha inseriti lì e tale metodo viene necessariamente eseguito prima del metodo [doReturnForm]. Pertanto, non è necessario inizializzare il modello [form] prima di visualizzarlo alla riga 4. Di conseguenza, i metodi [doInit] e [doReturnForm] sono identici e potremmo rimuovere l'azione [returnForm] e sostituirla con l'azione [init]. Il metodo [doReturnForm] scomparirebbe quindi.
9.6. Test
In questa nuova versione, sono cambiate solo le viste. Il controller [ServletPersonne] rimane invariato. L'uso di JSTL ci ha semplicemente permesso di utilizzare più facilmente il modello costruito dal controller all'interno delle pagine JSP.
Avviare o riavviare Tomcat dopo aver integrato il progetto Eclipse [personne-mvc-04]. Richiedere l'URL [http://localhost:8080/personne4].








