Skip to content

11. MVC-Webanwendung [person] – Version 6

11.1. Einführung

In dieser Version nehmen wir folgende Änderung vor:

Die vorherige Version verwendete keine Sitzungen, um Daten zwischen Client- und Server-Austauschvorgängen zu speichern. Sie nutzte Cookies, was bedeutet, dass die zu speichernden Daten vom Server an den Client gesendet werden, damit dieser sie beim nächsten Austausch zurücksenden kann. In dieser neuen Version verwenden wir eine ähnliche Technik: versteckte Felder in Formularen. Es gibt Unterschiede zwischen diesen beiden Techniken:

Cookies
Versteckte Felder
- Der Server platziert die zu speichernden Elemente im HTTP-Stream vor dem HTML-Dokument.
- Der Server platziert die zu speichernden Elemente innerhalb des HTML-Dokuments.
- Diese Technik setzt voraus, dass der Browser Cookies akzeptiert, damit er diese bei seinen GET- oder POST-Anfragen an den Server zurücksenden kann.
- Diese Technik setzt voraus, dass alle Client-Anfragen an den Server POST-Anfragen sind, damit die versteckten Felder an den Server gesendet werden.
- Der Benutzer kann auf die gespeicherten Elemente zugreifen, indem er die von seinem Browser empfangenen Cookies einsehen. Die meisten Browser bieten diese Option an.
- Der Benutzer kann auf die gespeicherten Daten zugreifen, indem er den Quellcode des empfangenen HTML-Dokuments anzeigt.

Die Technik der versteckten Felder kann hier verwendet werden, da alle Client-Anfragen POST-Anfragen sind.

11.2. Das Eclipse-Projekt

Um das Eclipse-Projekt [mvc-personne-06] für die Webanwendung [/personne6] zu erstellen, duplizieren Sie das Projekt [mvc-personne-05], indem Sie die in Abschnitt 6.2 beschriebene Vorgehensweise befolgen.

11.3. Konfigurieren der Webanwendung [personne6]

Die Datei web.xml für die Anwendung /personne6 sieht wie folgt aus:


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

Diese Datei ist bis auf wenige Details identisch mit der aus der vorherigen Version:

  • Zeile 6: Der Anzeigename der Webanwendung wurde in [mvc-personne-06] geändert

Die Startseite [index.jsp] ist identisch mit der der Anwendung [/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. Der View-Code

Nur die Ansichten [response, errors] haben sich geändert. Sie enthalten nun versteckte Felder in ihren jeweiligen Formularen, während diese Formulare in der vorherigen Version keine Parameter übermittelten.

[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>
 
 
  • Zeilen 6–9: Das Formular, das an den Server gesendet wird, wenn der Link in den Zeilen 10–12 angeklickt wird
  • Zeile 6: Das POST-Ziel lautet [/do/retourFormulaire]
  • Zeilen 7–8: Die versteckten Felder [name] und [age] werden übermittelt. Ihre Werte ${name} und ${age} werden vom Controller festgelegt, der [response.jsp] anzeigt. Dies sind die Werte, die in das Formular eingegeben wurden.

[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>

Die Änderungen und Erläuterungen entsprechen denen der Ansicht [response.jsp]. Beachten Sie, dass die Vorlagendatei [errors] um zwei neue Elemente [name, age] erweitert wurde, die zu den beiden bereits vorhandenen Elementen [errors, returnToFormLink] hinzugefügt wurden.

Leser sind eingeladen, diese neuen Ansichten nach dem in früheren Versionen verwendeten Ansatz zu testen.

11.5. Der [ServletPersonne]-Controller

Der [ServletPersonne]-Controller für die Webanwendung [/personne6] ist dem der vorherigen Version sehr ähnlich. Die Änderungen ergeben sich aus der Tatsache, dass sich das Modell für die Ansicht [errors] geändert hat. Zwei zusätzliche Elemente müssen hinzugefügt werden: [name, age]. Betroffen sind nur die Methoden, die diese Ansicht anzeigen. Dies sind die Methoden [doGet] und [doValidateForm].

11.5.1. Die Methode [doGet]

Der Code für [doGet] lautet wie folgt:

    // 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;
        }
...
    }

Tatsächlich bleibt dieser Code unverändert. In der vorherigen Version waren die Elemente [name, age] nicht in der Vorlagenansicht [errors] enthalten. Wenn wir sie weiterhin weglassen, werden die Variablen ${name} und ${age} in [errors.jsp] durch eine leere Zeichenfolge ersetzt. Das ist für uns in Ordnung, da in diesem speziellen Fall der Link [Zurück zum Formular] dem Benutzer nicht angezeigt wird. Tatsächlich nehmen wir auch das Element [formBackLink] nicht in die Vorlage auf. Die Variable ${lienRetourFormulaire} in [erreurs.jsp] wird durch die leere Zeichenfolge ersetzt. Daher gibt es keinen Link und somit keine Möglichkeit, die versteckten Felder [name, age] aus dem Formular in [erreurs.jsp] zu übermitteln. Der Wert dieser Felder kann daher die leere Zeichenfolge sein.

11.5.2. Die Methode [doValidationFormulaire]

Ihr Code lautet wie folgt:

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

Zeilen 8–10: Wir übergeben die Elemente [name, age, formReturnLink] an das Modell. Wir wissen, dass die Methode eine der Ansichten [response] oder [errors] anzeigt. Letztere enthält daher die Elemente [name, age] in ihrem Modell.

11.6. Tests

Starten oder starten Sie Tomcat neu, nachdem Sie das Eclipse-Projekt [person-mvc-06] darin integriert haben, und rufen Sie dann die URL [http://localhost:8080/personne6] auf.