Skip to content

11. Веб-додаток MVC [personne] — версія 6

11.1. Introduction

У цій версії ми внесли таку зміну:

У попередній версії не використовувалася сесія для збереження даних між двома обмінами даними між клієнтом і сервером. Замість цього застосовувалася технологія файлів cookie, завдяки якій дані, що підлягають збереженню, надсилаються сервером клієнту, щоб той повернув їх під час наступного обміну. У цій новій версії ми використовуємо схожу технологію — приховані поля у формах. Між цими двома технологіями існують такі відмінності:

Файли cookie
Приховані поля
- сервер розміщує елементи, які потрібно зберегти, у потоці HTTP, що передує документу HTML.
- сервер розміщує елементи, які потрібно запам’ятати, у документі HTML.
- ця техніка вимагає, щоб браузер приймав файли cookie, щоб він міг надсилати їх серверу під час запитів GET або POST.
- ця техніка вимагає, щоб усі запити клієнта до сервера були у форматі POST, щоб приховані поля надсилалися на сервер.
- Користувач має доступ до збережених даних, переглянувши файли cookie, отримані його браузером. Більшість браузерів пропонують цю опцію.
- Користувач має доступ до збережених елементів, переглянувши вихідний код отриманого документа HTML.

Техніка прихованих полів може бути використана в цьому випадку, оскільки всі запити клієнта мають тип POST.

11.2. Проєкт Eclipse

Щоб створити проект Eclipse [mvc-personne-06] для веб-додатку [/personne6], потрібно продублювати проект [mvc-personne-05], дотримуючись процедури, описаної в розділі 6.2.

11.3. Налаштування веб-додатку [personne6]

Файл web.xml додатка /personne6 має такий вигляд:


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

Цей файл ідентичний файлу попередньої версії, за винятком кількох дрібниць:

  • рядок 6: ім'я для відображення веб-додатку змінилося на [mvc-personne-06]

Головна сторінка [index.jsp] ідентична головній сторінці додатка [/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. Код переглядів

Змінилися лише подання [réponse, erreurs]. Тепер у відповідних формах є приховані поля, тоді як у попередній версії ці форми не надсилали жодних параметрів.

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


  • рядки 6–9: форма, яка буде відправлена на сервер при натисканні на посилання в рядках 10–12
  • рядок 6: ціллю POST буде [/do/retourFormulaire]
  • рядки 7–8: приховані поля [nom] та [age] будуть відправлені. Їхні значення ${nom} та ${age} будуть визначені контролером, який відображатиме [réponse.jsp]. Це будуть значення, введені у форму.

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

Зміни та пояснення такі самі, як і для подання [réponse.jsp]. Слід зазначити, що шаблон подання [erreurs] доповнюється двома новими елементами [nom, age], які додаються до двох інших, що вже існували: [erreurs, lienRetourFormulaire].

Читачеві пропонується протестувати ці нові види за принципом, розглянутим у попередніх версіях.

11.5. Контролер [ServletPersonne]

Контролер [ServletPersonne] веб-додатку [/personne6] дуже схожий на контролер попередньої версії. Зміни пов’язані з тим, що змінилася модель подання [erreurs]. У нього потрібно додати два додаткові елементи: [nom, age]. Це стосується лише методів, які відповідають за відображення цього виду. Йдеться про методи [doGet] та [doValidationFormulaire].

11.5.1. Метод [doGet]

Код [doGet] такий:

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

         // перевіряється, як пройшла ініціалізація сервлета
        if (erreursInitialisation.size() != 0) {
             // передаємо управління сторінці помилок
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
             // кінець
            return;
        }
...
    }

Насправді цей код залишився таким самим, як і раніше. У попередній версії елементи [nom, age] не вставлялися в шаблон подання [erreurs]. Якщо й надалі не додавати їх туди, змінні ${nom} та ${age} з [erreurs.jsp] будуть замінені порожнім рядком. Це нас влаштовує, оскільки в цьому конкретному випадку посилання [Retour au formulaire] не відображається користувачеві. Дійсно, ми також не вставляємо елемент [lienRetourFormulaire] у шаблон. Змінна ${lienRetourFormulaire} з [erreurs.jsp] буде замінена порожнім рядком. Отже, посилання не буде, а отже, не буде можливості відправити приховані поля [nom, age] з форми [erreurs.jsp]. Тому значенням цих полів може бути порожній рядок.

11.5.2. Метод [doValidationFormulaire]

Його код такий:

     // перевірка форми
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
         // отримуємо параметри
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // підготовка шаблону для переглядів [réponse, erreurs]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
         // перевірка параметрів
...

У рядках 8–10 у шаблон вставляються елементи [nom, age, lienRetourFormulaire]. Відомо, що метод відображає один із видів [réponse] або [erreurs]. Отже, останній матиме у своїй моделі елементи [nom,age].

11.6. Tests

Запустіть або перезапустіть Tomcat після інтеграції в нього проекту Eclipse [personne-mvc-06], а потім введіть URL-адресу [http://localhost:8080/personne6].