Skip to content

11. Applicazione Web MVC [person] – Versione 6

11.1. Introduzione

In questa versione, apportiamo la seguente modifica:

La versione precedente non utilizzava le sessioni per memorizzare i dati tra gli scambi client/server. Utilizzava i cookie, il che significa che i dati da memorizzare vengono inviati al client dal server in modo che il client possa inviarli nuovamente durante lo scambio successivo. In questa nuova versione, utilizziamo una tecnica simile: i campi nascosti nei moduli. Esistono delle differenze tra queste due tecniche:

Cookie
Campi nascosti
- Il server inserisce gli elementi da memorizzare nel flusso HTTP che precede il documento HTML.
- Il server inserisce gli elementi da memorizzare all'interno del documento HTML.
- Questa tecnica richiede che il browser accetti i cookie in modo da poterli inviare al server durante le richieste GET o POST.
- Questa tecnica richiede che tutte le richieste del client al server siano richieste POST, in modo che i campi nascosti vengano inviati al server.
- L'utente può accedere agli elementi memorizzati visualizzando i cookie ricevuti dal proprio browser. La maggior parte dei browser offre questa opzione.
- L'utente può accedere ai dati memorizzati visualizzando il codice sorgente del documento HTML ricevuto.

La tecnica dei campi nascosti può essere utilizzata in questo caso poiché tutte le richieste del client sono richieste POST.

11.2. Il progetto Eclipse

Per creare il progetto Eclipse [mvc-personne-06] per l'applicazione web [/personne6], duplicare il progetto [mvc-personne-05] seguendo la procedura descritta nella sezione 6.2.

11.3. Configurazione dell'applicazione web [personne6]

Il file web.xml per l'applicazione /personne6 è 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-06</display-name>
...

Questo file è identico a quello della versione precedente, tranne che per alcuni dettagli:

  • riga 6: il nome visualizzato dell'applicazione web è cambiato in [mvc-personne-06]

La pagina iniziale [index.jsp] è identica a quella dell'applicazione [/personne5]:


<%@ 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="/do/formulaire"/>

11.4. Il codice della vista

Sono cambiate solo le viste [response, errors]. Ora includono campi nascosti nei rispettivi moduli, mentre nella versione precedente questi moduli non inviavano alcun parametro.

[response.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>
 
 
  • Righe 6–9: il modulo che verrà inviato al server quando si clicca sul link alle righe 10–12
  • riga 6: la destinazione POST sarà [/do/retourFormulaire]
  • righe 7-8: verranno inviati i campi nascosti [name] e [age]. I loro valori ${name} e ${age} saranno impostati dal controller che visualizza [response.jsp]. Questi saranno i valori inseriti nel modulo.

[errors.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

Le modifiche e le spiegazioni sono le stesse della vista [response.jsp]. Si noti che il modello della vista [errors] è stato ampliato con due nuovi elementi [name, age], che si aggiungono ai due già esistenti: [errors, returnToFormLink].

I lettori sono invitati a testare queste nuove viste seguendo l'approccio utilizzato nelle versioni precedenti.

11.5. Il controller [ServletPersonne]

Il controller [ServletPersonne] per l'applicazione web [/personne6] è molto simile a quello della versione precedente. Le modifiche derivano dal fatto che il modello per la vista [errors] è cambiato. È necessario aggiungere due elementi aggiuntivi: [name, age]. Sono interessati solo i metodi che visualizzano questa vista. Si tratta dei metodi [doGet] e [doValidateForm].

11.5.1. Il metodo [doGet]

Il codice per [doGet] è il seguente:

    // GET
    @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // check how the servlet was initialized
        if (erreursInitialisation.size() != 0) {
            // we hand over to the error page
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
            // end
            return;
        }
...
    }

In realtà, questo codice rimane identico a com'era. Nella versione precedente, gli elementi [name, age] non erano inclusi nel modello di visualizzazione [errors]. Se continuiamo a tralasciarli, le variabili ${name} e ${age} in [errors.jsp] verranno sostituite da una stringa vuota. Questo ci va bene, perché in questo caso specifico il link [Torna al modulo] non viene mostrato all'utente. Infatti, non includiamo nemmeno l'elemento [formBackLink] nel modello. La variabile ${lienRetourFormulaire} in [erreurs.jsp] verrà sostituita dalla stringa vuota. Pertanto, non ci sarà alcun link e quindi nessun modo per inviare i campi nascosti [name, age] dal modulo in [erreurs.jsp]. Il valore di questi campi può quindi essere la stringa vuota.

11.5.2. Il metodo [doValidationFormulaire]

Il suo codice è il seguente:

    // form validation
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
        // parameters are retrieved
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
        // prepare the view model [response, errors]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        // parameter verification
...

Righe 8–10: Passiamo gli elementi [name, age, formReturnLink] al modello. Sappiamo che il metodo visualizza una delle viste [response] o [errors]. Quest'ultima avrà quindi gli elementi [name, age] nel proprio modello.

11.6. Test

Avviare o riavviare Tomcat dopo aver integrato il progetto Eclipse [person-mvc-06] al suo interno, quindi richiedere l'URL [http://localhost:8080/personne6].