Skip to content

11. Aplikacja internetowa MVC [personne] – wersja 6

11.1. Introduction

W tej wersji wprowadzamy następującą zmianę:

Poprzednia wersja nie wykorzystywała sesji do przechowywania danych między kolejnymi wymianami danych między klientem a serwerem. Wykorzystywała technikę plików cookie, w ramach której dane do zapamiętania są wysyłane do klienta przez serwer, aby ten mógł je odesłać podczas następnej wymiany. W tej nowej wersji stosujemy podobną technikę, polegającą na wykorzystaniu ukrytych pól w formularzach. Istnieją różnice między tymi dwiema technikami:

Pliki cookie
Ukryte pola
- serwer umieszcza elementy do zapamiętania w strumieniu HTTP, który poprzedza dokument HTML.
- serwer umieszcza elementy do zapamiętania w dokumencie HTML.
- technika ta wymaga, aby przeglądarka akceptowała pliki cookie, tak aby mogła je odesłać do serwera podczas wysyłania żądań GET lub POST.
- technika ta wymaga, aby wszystkie żądania wysyłane przez klienta do serwera miały postać POST, tak aby ukryte pola były przesyłane do serwera.
- Użytkownik ma dostęp do zapisanych danych poprzez wyświetlenie plików cookie otrzymanych przez swoją przeglądarkę. Większość przeglądarek oferuje tę opcję.
- Użytkownik ma dostęp do zapisanych elementów, wyświetlając kod źródłowy otrzymanego dokumentu HTML.

Technika pól ukrytych ma tutaj zastosowanie, ponieważ wszystkie wywołania klienta są typu POST.

11.2. Projekt Eclipse

Aby utworzyć projekt Eclipse [mvc-personne-06] dla aplikacji internetowej [/personne6], należy skopiować projekt [mvc-personne-05], postępując zgodnie z procedurą opisaną w punkcie 6.2.

11.3. Konfiguracja aplikacji internetowej [personne6]

Plik web.xml aplikacji /personne6 ma następującą treść:


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

Ten plik jest identyczny z plikiem z poprzedniej wersji, z wyjątkiem kilku szczegółów:

  • wiersz 6: nazwa wyświetlana aplikacji internetowej została zmieniona na [mvc-personne-06]

Strona główna [index.jsp] jest identyczna jak strona główna aplikacji [/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. Kod widoków

Zmieniły się jedynie widoki [réponse, erreurs]. Teraz zawierają one ukryte pola w swoich formularzach, podczas gdy w poprzedniej wersji formularze te nie wysyłały żadnych parametrów.

[réponse.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>


  • wiersze 6–9: formularz, który zostanie wysłany na serwer po kliknięciu linku w wierszach 10–12
  • wiersz 6: celem formularza POST będzie [/do/retourFormulaire]
  • wiersze 7–8: ukryte pola [nom] i [age] zostaną przesłane. Ich wartości ${nazwa} i ${wiek} zostaną ustalone przez kontroler, który wyświetli [réponse.jsp]. Będą to wartości wprowadzone w formularzu.

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

Zmiany i objaśnienia są takie same jak w przypadku widoku [réponse.jsp]. Należy zauważyć, że szablon widoku [erreurs] został wzbogacony o dwa nowe elementy [nom, age], które dołączają do dwóch już istniejących: [erreurs, lienRetourFormulaire].

Zachęcamy czytelnika do przetestowania tych nowych widoków zgodnie z zasadą omówioną w poprzednich wersjach.

11.5. Kontroler [ServletPersonne]

Kontroler [ServletPersonne] aplikacji internetowej [/personne6] jest bardzo zbliżony do kontrolera z poprzedniej wersji. Zmiany wynikają z faktu, że zmienił się model widoku [erreurs]. Należy w nim dodać dwa dodatkowe elementy: [nom, age]. Dotyczy to wyłącznie metod wyświetlających ten widok. Są to metody [doGet] i [doValidationFormulaire].

11.5.1. Metoda [doGet]

Kod metody [doGet] jest następujący:

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

         // sprawdzamy, jak przebiegła inicjalizacja serwletu
        if (erreursInitialisation.size() != 0) {
             // przekazujemy kontrolę do strony błędów
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
             // koniec
            return;
        }
...
    }

W rzeczywistości kod ten pozostaje taki sam jak poprzednio. W poprzedniej wersji elementy [nom, age] nie były umieszczane w szablonie widoku [erreurs]. Jeśli nadal nie będziemy ich tam umieszczać, zmienne ${nazwa} i ${wiek} z [erreurs.jsp] zostaną zastąpione pustym ciągiem znaków. Jest to dla nas korzystne, ponieważ w tym konkretnym przypadku link [Retour au formulaire] nie jest wyświetlany użytkownikowi. W rzeczywistości nie umieszczamy również elementu [lienRetourFormulaire] w szablonie. Zmienna ${lienRetourFormulaire} z [erreurs.jsp] zostanie zastąpiona pustym ciągiem znaków. Nie będzie więc żadnego powiązania, a zatem nie będzie możliwości przesłania ukrytych pól [nom, age] z formularza [erreurs.jsp]. Wartością tych pól może więc być pusty ciąg znaków.

11.5.2. Metoda [doValidationFormulaire]

Jej kod wygląda następująco:

     // walidacja formularza
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
         // pobieranie parametrów
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // przygotowuje się szablon widoków [réponse, erreurs]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
         // weryfikacja parametrów
...

W wierszach 8–10 umieszczamy w szablonie elementy [nom, age, lienRetourFormulaire]. Wiadomo, że metoda wyświetla jeden z widoków: [réponse] lub [erreurs]. Ten ostatni będzie zatem zawierał w swoim szablonie elementy [nom,age].

11.6. Tests

Uruchom lub ponownie uruchom Tomcat po dodaniu do niego projektu Eclipse o nazwie [personne-mvc-06], a następnie wywołaj adres URL [http://localhost:8080/personne6].