Skip to content

9. Веб-додаток MVC [personne] – версія 4

Ця версія використовує бібліотеку тегів JSTL, представлену раніше.

9.1. Проєкт Eclipse

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

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

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


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

Цей файл ідентичний файлу попередньої версії, за винятком рядка 6, де ім’я для відображення веб-додатка змінилося на [mvc-personne-04].

Головна сторінка [index.jsp] змінюється:


<%@ 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"/>
  • рядок 5: сторінка [index.jsp] перенаправляє клієнта на URL-адресу [/main], яка веде до контролера [ServletPersonne] додатка [/personne4]. Тег <c:redirect> належить до бібліотеки JSTL / Core. Його особливістю є те, що він доповнює URL-адресу свого атрибута [url], додаючи до неї:
  • префікс [/contexte], де [contexte] — це контекст додатка, у даному випадку [personne4];
  • суфікс [?jsessionid=id_session], якщо браузер, що надсилає запит, не надіслав сесійний файл cookie. Ідентифікатор [jsessionid] позначає ідентифікатор сесійного токена, надісланого веб-сервером своїм клієнтам. Він залежить від веб-сервера. У даному випадку це ідентифікатор сервера Tomcat. [id_session] — це сам сесійний токен.

Отже, справжній URL-адресу перенаправлення у рядку 5, що містить [index.jsp], є URL-адреса [/personne4/main?jsessionid=XX], де XX — це сесійний токен. Саме це показано на сторінці нижче, отриманій після початкового запиту на URL-адресу [http://localhost:8080/personne4]:

Image

Зв’язок між тегом <c:redirect> та токеном сеансу є досить тонким. Його аналіз на даний момент є передчасним, але ми ще повернемося до цього питання.

9.3. Код подання

9.3.1. Вигляд [formulaire]

Цей вигляд не змінився:

Image

Вона генерується наступною сторінкою 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>

Нові елементи:

  • рядок 4: оголошення бібліотеки тегів JSTL / Core
  • рядки 21, 25: витяг атрибутів [nom, age] із шаблону сторінки. Нагадаємо, що ці атрибути будуть послідовно шукатися у запиті [request], сесії [session] та додатку [application] сторінки JSP. У нашому випадку контролер помістить їх у сесію.
  • На початку сторінки JSP більше немає коду Java для отримання шаблону сторінки через попередню операцію.

9.3.2. Вигляд [reponse]

Цей вигляд не змінився:

Нова сторінка JSP [reponse.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</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>

Нові елементи:

  • рядок 4: оголошення бібліотеки тегів JSTL / Core
  • рядки 16, 20, 28: витяг атрибутів [nom, age, lienRetourFormulaire] у шаблоні сторінки. На початку сторінки JSP більше немає коду Java для витягування цих атрибутів.

9.3.3. Вигляд [erreurs]

Цей вигляд не змінився:

Нова сторінка JSP [erreurs.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</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>

Нові елементи:

  • рядок 4: оголошення бібліотеки тегів JSTL / Core
  • рядки 13–15: відображення списку помилок за допомогою JSTL
  • на початку сторінки більше немає Java-коду JSP для отримання її шаблону.

9.4. Тестування подань

Щоб провести тестування попередніх подань, ми дублюємо їхні сторінки JSP у папці /WebContent/JSP проекту Eclipse:

Image

Потім у папці JSP сторінки змінюються наступним чином:

[formulaire.jsp]:


...
<%
  // -- тест: створюється модель сторінки
  session.setAttribute("nom","tintin");
  session.setAttribute("age","30");
%>

<html>
  <head>

Рядки 4–5 було додано для створення шаблону, необхідного для сторінки.

[reponse.jsp]:


...
<%
  // -- тест: створюємо модель сторінки
  request.setAttribute("nom","milou");
  request.setAttribute("age","10");
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>


<html>
  <head>

...

Рядки 4–6 було додано для створення шаблону, необхідного для сторінки.

[erreurs.jsp]:



<%
  // -- тест: створюємо шаблон сторінки
  ArrayList<String> erreurs1=new ArrayList<String>();
  erreurs1.add("erreur1");
  erreurs1.add("erreur2");
  request.setAttribute("erreurs",erreurs1);
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>

<html>
  <head>

Рядки 4–8 були додані для створення шаблону, необхідного для сторінки.

Запустіть Tomcat, якщо ви цього ще не зробили, а потім надішліть запити на такі URL-адреси:

 

Ми отримуємо очікувані результати.

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

Контролер [ServletPersonne] веб-додатку [/personne3] оброблятиме такі дії:

запит
джерело
обробка
1
[GET /personne4/main]
URL-адреса, введена користувачем
- надіслати порожній вигляд [formulaire]
2
[POST /personne4/main]
з параметрами [txtNom,
txtAge,
action=validationFormulaire]
опубліковані
натискання кнопки
[Envoyer] у вікні
[formulaire]
- перевірити значення параметрів [txtNom, txtAge]
- якщо вони неправильні, надіслати вигляд [erreurs(erreurs)]
- якщо вони правильні, надіслати вигляд [reponse(nom,age)]
3
[POST /personne4/main]
з параметрами
[action=retourFormulaire]
опубліковані
натиснувши на посилання [Повернутися до
формуляр] переглядів
[réponse] та [erreurs].
- надіслати попередньо заповнений вигляд [formulaire] з останніми введеними значеннями

Структура контролера [ServletPersonne] ідентична структурі попередньої версії. Ми розглянемо зміни, внесені до методів [doInit, doValidationFormulaire, doRetourFormulaire], оскільки методи [init, doGet, doPost] не зазнали змін.

9.5.1. Метод [doInit]

Цей метод обробляє запит № 1 [GET /personne4/main]. Його код такий:

1
2
3
4
5
6
     // відображення порожньої форми
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

Нові можливості:

  • рядок 3: відображається представлення [formulaire]. У його моделі очікуються атрибути «nom» та «age». Воно не знайде їх там, оскільки контролер їх туди не вносить. У цьому випадку бібліотека JSTL отримає покажчики null для цих атрибутів. Це не спричиняє помилок, і для елементів ${nom} та ${age} у подання [formulaire] будуть відображатися порожні значення. Це нас влаштовує. Таким чином ми уникаємо необхідності ініціалізації моделі подання [formulaire].

9.5.2. Метод [doValidationFormulaire]

Цей метод обробляє запит № 2 [POST /personne4/main] із [action, txtNom, txtAge] у відправлених елементах. Його код такий:

     // перевірка форми
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                 // отримання параметрів
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // які зберігаються в сесії
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // перевірка параметрів
...
         // параметри правильні — надсилаємо сторінку відповіді
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

Нові зміни:

  • рядок 15: метод [doValidationFormulaire] надсилає у відповідь представлення [réponse]. У його шаблоні містяться елементи [nom, age, lienRetourFormulaire]. [lienRetourFormulaire] додається до шаблону в рядку 14 за допомогою запиту. Елементи [nom,age], у свою чергу, додаються до моделі у рядках 8–10 за допомогою сесії. У попередній версії елементи [nom, age] також додавалися до запиту під час надсилання подання [réponse], оскільки це подання очікувало їх саме там. Тут, із бібліотекою JSTL, відомо, що різні контексти (запит, сесія, додаток) будуть перевірені для пошуку елементів моделі. Отже, їх буде знайдено в сесії, оскільки контролер розмістив їх саме там (рядки 8–10).

9.5.3. Метод [doRetourFormulaire]

Цей метод обробляє запит № 3 [POST /personne4/main] із [action=retourFormulaire] у надісланих елементах. Його код такий:

1
2
3
4
5
6
7
     // відображення попередньо заповненої форми
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // відображення форми
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

Нові можливості:

  • рядок 4: відображається представлення [formulaire]. У його моделі очікуються атрибути «ім’я» та «вік». Вона знайде їх у сесії, оскільки метод [doValidationFormulaire] помістив їх туди, а цей метод обов’язково виконується перед методом [doRetourFormulaire]. Отже, немає потреби ініціалізувати модель [formulaire] перед її відображенням у рядку 4. Отже, методи [doInit] та [doRetourFormulaire] є ідентичними, і можна видалити дію [retourFormulaire], замінивши її дією [init]. Тоді метод [doRetourFormulaire] зникне.

9.6. Tests

У цій новій версії змінюються лише подання. Сам контролер [ServletPersonne] не змінюється. Використання JSTL просто дозволило нам простіше використовувати на сторінках JSP модель, побудовану контролером.

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