9. Applicazione web MVC [personne] – 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] dell’applicazione web [/personne4], si duplicherà il progetto [mvc-personne-03] seguendo la procedura descritta al paragrafo 6.2, pagina 78.
![]() | ![]() |
9.2. Configurazione dell'applicazione web [personne4]
Il file web.xml dell’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, ad eccezione della riga 6, in cui 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 proprio attributo [url] aggiungendovi:
- il prefisso [/contexte], dove [contexte] è il contesto dell'applicazione, in questo caso [personne4].
- il suffisso [?jsessionid=id_session] se il browser che effettua la richiesta non ha inviato alcun cookie di sessione. L’identificativo [jsessionid] indica l’identificativo del token di sessione inviato dal server web ai propri client. Dipende dal server web. In questo caso, è quello del server Tomcat. [id_session] è il token di sessione stesso.
Pertanto, il vero URL di reindirizzamento della riga 5 di [index.jsp] è l'URL [/personne4/main?jsessionid=XX], dove XX è il token di sessione. È quanto mostra la pagina riportata di seguito, ottenuta dopo aver inizialmente richiesto l’URL [http://localhost:8080/personne4]:

Il legame tra il tag <c:redirect> e il token di sessione è piuttosto sottile. Un’analisi approfondita in questa sede sarebbe prematura, ma avremo modo di tornarci sopra.
9.3. Il codice delle viste
9.3.1. La vista [formulaire]
Questa vista non è cambiata:

Viene generata dalla pagina seguente: 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 [nom, age] nel modello della pagina. Ricordiamo che questi attributi saranno ricercati in successione nella richiesta [request], nella sessione [session] e nell'applicazione [application] della pagina JSP. Nel nostro caso, il controller li inserirà nella sessione.
- Non è più presente codice Java all’inizio della pagina JSP per recuperare il modello della pagina, a causa del funzionamento descritto in precedenza.
9.3.2. La vista [reponse]
Questa vista non è cambiata:
![]() | ![]() |
La nuova pagina JSP [reponse.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>
Le novità:
- riga 4: dichiarazione della libreria di tag JSTL / Core
- righe 16, 20, 28: recupero degli attributi [nom, age, lienRetourFormulaire] nel modello della pagina. Non è più presente il codice Java all'inizio della pagina JSP per recuperarli.
9.3.3. La vista [erreurs]
Questa vista non è cambiata:
![]() | ![]() |
La nuova pagina JSP [erreurs.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>
Le novità:
- riga 4: dichiarazione della libreria di tag JSTL / Core
- righe 13-15: visualizzazione dell'elenco degli errori tramite JSTL
- non è più presente il codice Java all’inizio della pagina JSP per recuperare il modello della stessa.
9.4. Test delle viste
Per eseguire i test delle viste precedenti, duplichiamo le relative pagine JSP nella cartella /WebContent/JSP del progetto Eclipse:

Quindi, nella cartella JSP, le pagine vengono modificate come segue:
[formulaire.jsp]:
...
<%
// -- test: si crea il modello della pagina
session.setAttribute("nom","tintin");
session.setAttribute("age","30");
%>
<html>
<head>
Le righe 4-5 sono state aggiunte per creare il modello necessario alla pagina.
[reponse.jsp]:
...
<%
// -- test: si crea il modello della pagina
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 necessario alla pagina.
[erreurs.jsp]:
<%
// -- test: si crea il modello della pagina
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 necessario alla pagina.
Avvia Tomcat, se non l'hai già fatto, quindi richiedi i seguenti URL:
![]() | ![]() |
![]() |
Otteniamo effettivamente le visualizzazioni previste.
9.5. Il controller [ServletPersonne]
Il controller [ServletPersonne] dell'applicazione web [/personne3] gestirà le seguenti azioni:
n. | richiesta | origine | elaborazione |
1 | [GET /personne4/main] | URL digitato dall'utente | - inviare la vista [formulaire] vuota |
2 | [POST /personne4/main] con parametri [txtNom, txtAge, action=validationFormulaire] pubblicati | clic sul pulsante [Envoyer] della vista [formulaire] | - verificare i valori dei parametri [txtNom, txtAge] - se non sono corretti, inviare la vista [erreurs(erreurs)] - se sono corretti, inviare la vista [reponse(nom,age)] |
3 | [POST /personne4/main] con parametri [action=retourFormulaire] pubblicati | cliccando sul link [Torna al modulo] delle visualizzazioni [réponse] e [erreurs]. | - inviare la vista [formulaire] precompilata con gli ultimi valori inseriti |
Lo scheletro del controller [ServletPersonne] è identico a quello della versione precedente. Esaminiamo le modifiche apportate ai metodi [doInit, doValidationFormulaire, doRetourFormulaire], poiché 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 [formulaire]. Questa, nel proprio modello, si aspetta gli attributi "nome" e "età". Non li troverà lì poiché in questo caso il controller non li inserisce. In questo caso, la libreria JSTL recupererà i puntatori null per questi attributi. Ciò non provoca errori e verranno visualizzati valori vuoti per gli elementi ${nom} e ${age} della vista [formulaire]. Questo ci va bene. In questo modo evitiamo di dover inizializzare il modello della vista [formulaire].
9.5.2. Il metodo [doValidationFormulaire]
Questo metodo elabora la richiesta n. 2 [POST /personne4/main] con [action, txtNom, txtAge] negli elementi inviati. Il suo codice è il seguente:
Novità:
- riga 15: il metodo [doValidationFormulaire] invia in risposta la vista [réponse]. Questa contiene nel proprio modello gli elementi [nom, age, lienRetourFormulaire]. [lienRetourFormulaire] viene inserito nel modello alla riga 14 tramite la richiesta. Gli elementi [nom,age] vengono invece inseriti nel modello alle righe 8-10 tramite la sessione. Nella versione precedente, gli elementi [nom, age] venivano inseriti anche nella richiesta quando si inviava la vista [réponse], poiché tale vista li attendeva in quella posizione. In questo caso, con la libreria JSTL, sappiamo che i diversi contesti (richiesta, sessione, applicazione) verranno esaminati per individuare 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 gestisce la richiesta n. 3 [POST /personne4/main] con [action=retourFormulaire] tra gli elementi inviati. Il suo codice è il seguente:
Novità:
- riga 4: viene visualizzata la vista [formulaire]. Questa vista richiede nel proprio modello gli attributi "nome" e "età". Li troverà nella sessione poiché il metodo [doValidationFormulaire] li ha inseriti lì e tale metodo viene necessariamente eseguito prima del metodo [doRetourFormulaire]. Non è quindi necessario inizializzare il modello di [formulaire] prima della sua visualizzazione alla riga 4. Di conseguenza, i metodi [doInit] e [doRetourFormulaire] sono identici e si potrebbe eliminare l’azione [retourFormulaire] per sostituirla con l’azione [init]. Il metodo [doRetourFormulaire] verrebbe quindi eliminato.
9.6. Tests
In questa nuova versione cambiano solo le viste. Il controller [ServletPersonne] rimane invece invariato. L’utilizzo di JSTL ci ha semplicemente permesso di sfruttare più facilmente nelle pagine JSP il modello creato dal controller.
Avviare o riavviare Tomcat dopo avervi integrato il progetto Eclipse [personne-mvc-04]. Richiedere l'URL [http://localhost:8080/personne4].








