Skip to content

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]:

Image

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:

Image

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:

Image

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:

1
2
3
4
5
6
     // visualizzazione del modulo vuoto
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

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:

     // convalida del modulo
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                 // si recuperano i parametri
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // che vengono memorizzati nella sessione
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // verifica dei parametri
...
         // i parametri sono corretti - invio della pagina di risposta
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

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:

1
2
3
4
5
6
7
     // visualizzazione del modulo precompilato
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // visualizzazione del modulo
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

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].