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]:

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

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

Потім у папці 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]. Його код такий:
Нові можливості:
- рядок 3: відображається представлення [formulaire]. У його моделі очікуються атрибути «nom» та «age». Воно не знайде їх там, оскільки контролер їх туди не вносить. У цьому випадку бібліотека JSTL отримає покажчики null для цих атрибутів. Це не спричиняє помилок, і для елементів ${nom} та ${age} у подання [formulaire] будуть відображатися порожні значення. Це нас влаштовує. Таким чином ми уникаємо необхідності ініціалізації моделі подання [formulaire].
9.5.2. Метод [doValidationFormulaire]
Цей метод обробляє запит № 2 [POST /personne4/main] із [action, txtNom, txtAge] у відправлених елементах. Його код такий:
Нові зміни:
- рядок 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] у надісланих елементах. Його код такий:
Нові можливості:
- рядок 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].








