3. Обробка форми контролером
Тепер розглянемо обробку значень форми контролером, коли користувач натисне кнопку [Envoyer] у формі.
3.1. Файл struts-config.xml
Новий файл конфігурації struts-config.xml контролера Struts має такий вигляд:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean
name="frmPersonne"
type="istia.st.struts.personne.FormulaireBean"
/>
</form-beans>
<action-mappings>
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/erreurs"
parameter="/vues/erreurs.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/reponse"
parameter="/vues/reponse.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
</action-mappings>
<message-resources parameter="ressources.personneressources"/>
</struts-config>
Ми виділили зміни:
- з’являється розділ <form-beans>. Він слугує для визначення класів, пов’язаних із кожною формою в додатку. Кількість тегів <form-bean> має відповідати кількості різних форм у додатку. У цьому випадку ми маємо лише одну форму, отже, лише один розділ <form-bean>. Для кожної форми ми маємо визначити:
- його ім’я (атрибут name)
- ім’я класу, похідного від ActionForm, що відповідає за зберігання значень форми (атрибут type)
Ці два атрибути не можуть бути довільними. Вони повинні збігатися з тими, що використовуються в тезі <html:form> коду HTML форми. Нагадаємо, що для форми (nom, age) це:
Цю форму потрібно вказати таким самим чином у файлі struts-config.html. Саме це й зроблено тут:
- Конфігурація дії /main змінилася. Вона відповідає за обробку значень форми. Тому потрібно вказати в ній необхідну інформацію:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Сервлет /main оброблятиме форму, якій потрібно надати ім'я. Цю функцію виконує атрибут name. Це ім'я має посилатися на атрибут name одного з розділів <form-bean>, у даному випадку frmPersonne.
Атрибут scope="session" вказує, що значення форми мають зберігатися в сесії. Це не завжди необхідно. У даному випадку це потрібно. Адже у поданнях /reponse.do та /erreurs.do ми бачимо посилання, що ведуть до цієї форми. В обох випадках ми хочемо відобразити форму з значеннями, введеними користувачем під час попереднього обміну даними між клієнтом і сервером. Звідси й необхідність збереження форми в сесії.
Атрибут validate вказує, чи слід викликати метод validate об’єкта frmPersonne. Цей метод слугує для перевірки правильності даних форми. Тут ми вказуємо, що дані мають бути перевірені, що означає, що нам доведеться написати метод validate у класі FormulaireBean. Метод validate форми викликається контролером Struts перед тим, як буде викликано сервлет /main. Він повертає об’єкт типу ActionErrors, який є аналогом списку помилок. Якщо цей список існує і не є порожнім, контролер Struts зупиниться на цьому етапі та надішле у відповідь вигляд, вказаний атрибутом input. Вигляд отримає у запиті список ActionErrors, який він зможе відобразити за допомогою тегу <html:errors>. Вище ми зазначили, що у разі помилок сервлет /main повинен надіслати вигляд /erreurs.do. Нагадаємо, що цей вигляд пов’язаний із наступним URL /vues/erreurs.reponse.jsp:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<html:errors/>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Вигляд правильно використовує тег <html:errors>, який дозволить відобразити список помилок. У цьому списку помилок містяться не самі повідомлення про помилки, а ідентифікатори повідомлень, що містяться у файлі, на який посилається тег <message-resources> (увага: resources з одним «s»):
Тег, наведений нижче, вказує, що файл, який містить повідомлення, що використовуються додатком, знаходиться у файлі WEB-INF/classes/ressources/personneressources.properties:

Що міститься в цьому файлі? Це файл властивостей, що відповідає класу Properties у Java, тобто набір рядків у форматі «ключ=значення»:
errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
Цей файл повідомлень має щонайменше дві функції:
- він дозволяє змінювати повідомлення додатка без необхідності його перекомпіляції
- він забезпечує інтернаціоналізацію додатків Struts. Можна створити кілька файлів ресурсів — по одному для кожної мови. Struts автоматично використовуватиме відповідний файл повідомлень за умови дотримання певних стандартів у назвах цих файлів.
- Якщо метод validate форми повертає порожній список помилок, то контролер Struts викликає метод execute сервлету ForwardAction. Тут важливо зрозуміти, що коли виконується метод `execute` сервлета, це означає, що дані форми були визнані дійсними (звичайно, за умови, що вони були перевірені за допомогою `validate="true"`). Саме в методі `execute` сервлета, пов’язаного з дією, розробник фактично обробляє форму. Саме там буде розташовано ядро обробки (логіка додатка, використання бізнес-класів та класів доступу до даних). У підсумку метод повертає результат типу ActionForward, який вказує конструктору, який вигляд (view) слід надіслати клієнту у відповідь. Тут ми використали попередньо визначену дію ForwardAction з Struts. Її метод `execute` просто повертає ActionForward, що вказує на URL, вказаний атрибутом `parameter`:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Отже, якщо дані форми є дійсними, то дія /main поверне вигляд /vues/main.html, який ми вже використовували.
3.2. Новий клас FormulaireBean
Ми вже створили першу версію класу FormulaireBean, який відповідає за збереження даних (ім’я, вік) з форми formulaire.personne.jsp. Ця версія не перевіряла правильність даних. Тепер ми маємо це зробити, оскільки у файлі struts-config.xml ми вказали, що дані форми мають бути перевірені (validate="true") перед передачею до сервлету ForwardAction. Код класу виглядає наступним чином:
package istia.st.struts.personne;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class FormulaireBean
extends ActionForm {
// ім'я
private String nom = null;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
// вік
private String age = null;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
// перевірка
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
// обробка помилок
ActionErrors erreurs = new ActionErrors();
// прізвище має бути не порожнім
if (nom == null || nom.trim().equals("")) {
erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
// вік має бути додатним цілим числом
}
if (age == null || age.trim().equals("")) {
erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
}
else {
// вік має бути додатним цілим числом
if (!age.matches("^\\s*\\d+\\s*$")) {
erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
// повертається список помилок
}
} //if
// повертається список помилок
return erreurs;
}
}
Новизна полягає в реалізації методу validate. Цей метод викликається контролером Struts після того, як він присвоїв атрибутам «nom» та «age» класу значення полів форми з такими ж назвами. Він повинен перевірити правильність значень атрибутів «nom» та «age». Наведений вище код досить простий для розуміння:
- створюється порожній список помилок (ActionErrors errors)
- перевіряється поле «nom». Якщо воно порожнє, до списку помилок додається помилка за допомогою методу ActionErrors.add("ключ", ActionError).
- те саме робиться, якщо поле «age» не є цілим числом.
- Метод validate повертає контролеру Struts список помилок (ActionErrors errors). Якщо errors дорівнює null або якщо erreurs.size() дорівнює 0, контролер вважає, що помилок не було. Тоді він запустить метод `execute` класу `Action`, пов’язаного з цією дією (type="org.apache.struts.actions.ForwardAction"). В іншому випадку він поверне вигляд, пов’язаний із випадком помилок у формі (input="/erreurs.do").
Додаємо помилку до списку ActionErrors помилок за допомогою ActionErrors.add("cléErreur", new ActionError("cléMessage"[,param0, param1, param2, param3])). Перший параметр «cléErreur» слугує для однозначного позначення елемента ActionError у списку ActionErrors, подібно до словника. Він може бути будь-яким. ActionError — це об’єкт, який пов’язується з повідомленням про помилку за допомогою його конструктора ActionError(String cléMessage[,String param0, String param1, String param2, String param3]), де cléMessage — це ідентифікатор повідомлення, пов’язаного з помилкою, та до 4 необов’язкових параметрів. Ідентифікатор cléMessage не є випадковим. Це один з ідентифікаторів, які містяться у файлі, вказаному тегом <message-resources> у файлі struts-config.xml:
Нагадаємо, що цей файл (насправді WEB-INF/classes/ressources/personneressources.properties) містить такі ключі:
errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
Можна переконатися, що ключі повідомлень, які використовуються методом validate класу FormulaireBean, дійсно існують у вищезазначеному файлі. Для кожного повідомлення про помилку було використано тег HTML <li>, щоб тег <html:errors> відображав їх у вигляді списку HTML. Ми побачили, що об’єкт ActionError можна створити не лише за допомогою ключа повідомлення, а й із додатковими параметрами:
Якщо ActionError було створено з додатковими параметрами (максимум чотири), до них можна отримати доступ у тексті повідомлення за допомогою позначень від {0} до {3}. Таким чином, метод validate для FormulaireBean створює ActionError із ключем personne.formulaire.age.incorrect та додатковим параметром param0 age:
Повідомлення, пов’язане у файлі .properties повідомлень із ключем personne.formulaire.age.incorrect, має такий вигляд:
{0} буде замінено на значення віку. Нарешті, повідомлення з ключами errors.header та errors.footer будуть записані відповідно перед та після списку помилок. У цьому випадку ці два ключі слугуватимуть для включення тегів HTML <ul> та </ul>, які повинні оточувати теги <li>.
3.3. Перевірка валідності форми
Ми готові до тестування валідності форми. Нижче нагадуємо, де мають бути розміщені різні компоненти додатка:
![]() | |
![]() | |
![]() | |
![]() |
3.3.1. Тест 1
Перезапустимо Tomcat, щоб він прочитав нові файли конфігурації, а потім запустимо URL http://localhost:8080/strutspersonne/formulaire.do :

Пояснення:
- у struts-config.html було використано наступний розділ:
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Якщо ми переглянемо код HTML отриманої сторінки, то побачимо, що тег <form> на цій сторінці має такий вигляд:
Отже, кнопка [Envoyer], яка є кнопкою типу «submit», надішле дані форми на URL /strutspersonne/main.do.
3.3.2. Тест 2
Скористаємося кнопкою [Envoyer], залишивши поля введення порожніми. Отримаємо таку відповідь:

Пояснення:
- як зазначено вище, дані форми були надіслані до URL /strutspersonne/main.do. Тоді були використані такі розділи файлу struts-config.xml:
<form-bean
name="frmPersonne"
type="istia.st.struts.personne.FormulaireBean"
scope="session"
/>
....
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Було запущено дію /main. Вона використовує форму frmPersonne (name="frmPersonne"). Отже, контролер Struts, за необхідності, створив екземпляр об’єкта класу FormulaireBean (type="istia.st.struts.personne.FormulaireBean" у тезі form-bean). Він заповнив атрибути «name» та «age» цього об’єкта даними з полів з такими ж назвами у формі HTML:
<table>
<tr>
<td>Nom</td>
<td><html:text property="nom" size="20"/></td>
</tr>
<tr>
<td>Age</td>
<td><html:text property="age" size="3"/></td>
</tr>
<tr>
</table>
Після цього контролер Struts викликав метод validate об’єкта FormulaireBean, оскільки атрибут validate дії /main у файлі конфігурації має значення true:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Метод validate класу FormulaireBean має такий вигляд:
// перевірка
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
// обробка помилок
ActionErrors erreurs = new ActionErrors();
// ім'я має бути не порожнім
if (nom == null || nom.trim().equals("")) {
erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
// вік має бути додатним цілим числом
}
if (age == null || age.trim().equals("")) {
erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
}
else {
// вік має бути додатним цілим числом
if (!age.matches("^\\s*\\d+\\s*$")) {
erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
// виводиться список помилок
}
} //if
// повертається список помилок
return erreurs;
}
Оскільки поля [nom] та [age] були порожніми, описаний вище метод перевірки сформував список із двох помилок, який він повернув контролеру Struts. Оскільки були виявлені помилки, контролер потім повернув клієнту представлення, пов’язане з атрибутом input. Щоб визначити, про який вигляд йдеться, він використав наступний фрагмент свого файлу конфігурації:
<action
path="/erreurs"
parameter="/vues/erreurs.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Отже, врешті-решт він надіслав сторінку /vues/erreurs.personne.jsp. Вона має такий код:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<html:errors/>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Тег <html:errors> просто відображає список повідомлень, надісланих йому контролером Struts. Він використовує файл повідомлень, вказаний тегом <message-resources>:
У ньому містяться такі ключі та повідомлення:
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.vide=<li>Vous devez indiquer un age</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
errors.header=<ul>
errors.footer=</ul>
- запис, пов'язаний із ключем errors.header, записано
- записуються повідомлення, пов’язані з різними ключами зі списку ActionErrors, що надійшов
- запис, пов'язаний із ключем errors.footer, записано
3.3.3. Тест 3
Скористаємося посиланням [Retour au formulaire] на сторінці помилок. Ми отримуємо таку сторінку:

Пояснення:
- посилання [Retour au formulaire] має такий код: HTML:
Контролер Struts використав наступний розділ зі свого конфігураційного файлу:
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Отже, він повернув перегляд /vues/formulaire.personne.jsp.
3.3.4. Тест 4
Заповнюємо наступну форму, а потім натискаємо кнопку [Envoyer]:

Ми отримуємо таку відповідь:

Пояснення: такі самі, як і для тесту № 2.
3.3.5. Тест 5
Використовуємо наведене вище посилання [Retour au formulaire]. Отримуємо таку сторінку:

Ми бачимо, що форма збереглася в тому стані, в якому ми її підтвердили.
Пояснення: такі самі, як у тесті № 3, з додатковою інформацією:
- відображена форма HTML містить такі теги:
<table>
<tr>
<td>Nom</td>
<td><html:text property="nom" size="20"/></td>
</tr>
<tr>
<td>Age</td>
<td><html:text property="age" size="3"/></td>
</tr>
<tr>
</table>
Теги <html:text> виконують дві функції:
- під час надсилання значень форми від клієнта до сервера значення полів введення форми присвоюються полям з такими самими іменами в об’єкті FormulaireBean
- під час надсилання сервером клієнту коду HTML форми, що має відобразитися, атрибути value полів введення, пов’язані з тегами <html:text>, ініціалізуються значеннями полів з однаковою назвою в об’єкті FormulaireBean.
Тут маємо справу з двома різними обмінами даними між клієнтом і сервером:
- у першому користувач заповнив форму та надіслав її на сервер
- у другому — користувач скористався посиланням [Retour au formulaire], щоб повернутися до форми.
Єдиний спосіб, щоб у другому обміні форма знову відобразилася з її початковими значеннями, — це збереження цих значень у сесії клієнта. Саме це було задано в розділі налаштування дії /main:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Якби ми вказали scope="request", дані форми не зберігалися б у сесії, і ми не змогли б отримати ці значення під час другого обміну даними.
3.3.6. Тест 6
Повернімося до форми, щоб цього разу ввести правильні дані:

Натиснімо кнопку «Відправити». Отримаємо такий результат:

Пояснення:
- оскільки кнопка [Envoyer] надсилає значення форми до URL /strutspersonne/main.do, то ми бачимо ті самі пояснення, що й у тесті № 2, аж до повернення до контролера Struts результату ActionErrors від методу validate класу FormulaireBean. Але тут цей список порожній. Тоді контролер використовує нову частину конфігурації дії /main:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Контролер Struts, за необхідності, створює об’єкт типу, вказаного атрибутом type. Виконується метод execute цього класу, який повинен повернути об’єкт типу ActionForward, що вказує на представлення, яке контролер має надіслати клієнту у відповідь. Тут атрибут type вказує на попередньо визначений клас ForwardAction. Метод execute цього класу нічого не робить і просто повертає об’єкт ActionForward, який вказує на представлення, визначене атрибутом parameter, у даному випадку — на представлення /vues/main.html. Це саме те представлення, яке повернув контролер.
3.3.7. Тест 7
Знову запитуємо вигляд /formulaire.do:

Ми бачимо форму такою, якою її було підтверджено. Пояснення вже надано. Завдяки налаштуванню (scope="session") ми вимагали, щоб форма залишалася в сесії. Отже, її значення зберігаються під час обміну даними між клієнтом і сервером.
Ми майже закінчили. Залишилося створити власну дію на випадок, якщо дані форми є правильними. Наразі ми використовували попередньо визначену дію ForwardAction, щоб спростити нашу демонстрацію.
3.4. Нова конфігурація дії /main
Ми не змінюємо поточний файл конфігурації struts-config.xml, окрім як для внесення таких змін до його розділу /main:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
Атрибут type тепер вказує на інший клас під назвою FormulaireAction, який нам доведеться створити. Саме метод execute цього класу буде виконано, якщо дані форми frmPersonne є дійсними. Ми вказали, що метод execute виконує необхідні дії та повертає об’єкт типу **ActionForward, який вказує, який вигляд контролер повинен повернути клієнту. Залежно від результату обробки форми часто існує кілька можливих представлень. Перелік різних можливих представлень наведено в тегах <forward>, що містяться в тезі <action**>. Синтаксис такого тегу є таким:
довільна назва, що однозначно ідентифікує вигляд | |
URL подання, пов’язаного з ключем |
3.5. Клас FormulaireAction
Написання класу FormulaireAction полягає, в основному, у написанні його методу execute:
package istia.st.struts.personne;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;
public class FormulaireAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException {
// форма є дійсною, інакше ми б не дійшли до цього місця
FormulaireBean formulaire=(FormulaireBean)form;
request.setAttribute("nom",formulaire.getNom());
request.setAttribute("age",formulaire.getAge());
return mapping.findForward("reponse");
}//виконується
}
Метод **execute** приймає чотири параметри:
- ActionMapping mapping: об’єкт «image» з конфігурації дії, що виконується, тобто в даному випадку зображення такої конфігурації:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
Таким чином, дія має доступ до ключів, пов'язаних з подами, які можуть бути повернуті клієнту після завершення дії. Метод, що виконується, повинен повернути один із цих ключів.
- ActionForm form: об’єкт bean, у якому містяться значення форми, що використовується поточною дією. У даному випадку це об’єкт frmPersonne типу FormulaireBean. Таким чином, дія має доступ до значень форми.
- HttpServletRequest request: запит клієнта, який міг бути доповнений різними сервлетами. Таким чином, дія має доступ до всіх параметрів початкового запиту (request.getParameter), а також до всіх атрибутів, доданих до цього початкового запиту (request.getAttribute). У нашому прикладі метод `execute` доповнює запит, додаючи до нього ім’я та вік. Це тут абсолютно непотрібно, оскільки ці два значення вже є в запиті, але як параметри, а не як атрибути. Код наведено тут лише для прикладу.
- HttpServletResponse response: відповідь, яка буде надіслана клієнту. Акція могла б доповнити цю відповідь. У даному випадку вона цього не робить.
Тут ми маємо справу з особливим випадком. Метод execute практично нічого не робить. Він повинен просто вказати, що наступним видом є вид **/reponse.do**, та вказати у запиті, що цей вид отримає інформацію про ім’я та вік, яку він має відобразити. Вона робить це за допомогою методу findForward класу ActionMapping, який приймає як параметр один із ключів, знайдених у тегах forward у конфігурації дії. Тут є лише один такий тег:
Отже, наш метод execute повертає ActionForward із ключем «reponse», щоб вказати, що потрібно надіслати представлення /reponse.do.
3.6. Тестування FormulaireAction
Ми компілюємо попередній клас за допомогою JBuilder і розміщуємо згенерований файл .class у папці WEB-INF/classes:

Ми змінюємо вигляд /vues/reponse.personne.jsp:
<%
// отримуємо дані: ім'я, вік
String nom=(String)request.getAttribute("nom");
String age=(String)request.getAttribute("age");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td><%= nom %>
</tr>
<tr>
<td>Age</td>
<td><%= age %>
</tr>
</table>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Погляд отримує інформацію про ім'я та вік з атрибутів запиту, який він отримує. Ми запитуємо форму за адресою URL http://localhost:8080/strutspersonne/formulaire.do, а потім заповнюємо її:

Ми використовуємо кнопку [Envoyer] і отримуємо таку відповідь:

Пояснення:
- для початку процесу використаємо пояснення, наведене для тесту № 2. Нагадаємо конфігурацію дії /main:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
- після надсилання форми контролеру URL /main.do, той створив або переробив об’єкт frmPersonne типу FormulaireBean і вніс до нього значення з форми
- був викликаний метод validate об’єкта frmPersonne. Оскільки дані були правильними, метод validate повернув порожній список ActionErrors.
- Був створений або повторно використаний об’єкт FormulaireAction, і було викликано його метод execute. Цей метод повернув об’єкт ActionForward із ключем «reponse».
- Потім контролер надіслав вигляд, пов’язаний із ключем «reponse», — c.a.d. /reponse.do і, відповідно, /vues/reponse.personne.jsp.
- Вигляд reponse.personne.jsp відобразився із значеннями, введеними у запит методом execute об’єкта FormulaireAction.
3.7. Висновок
Ми створили повноцінний, але простий додаток. Під час його реального впровадження за допомогою Struts, Tomcat та JBuilder існує безліч можливостей припуститися помилок, зокрема у файлах конфігурації додатка XML. На перший погляд може здатися простішим створити цей додаток без Struts, використовуючи сервлет та сторінки JSP. Для початківця це, ймовірно, так і є. З набуттям досвіду розробка за допомогою Struts стає простішою. Багато компаній вимагають використання методології Struts у своїх веб-розробках з таких причин:
- Struts дотримується моделі MVC
- коли всі розробники працюють однаково, обслуговування додатків стає простішим, оскільки вони мають стандартну архітектуру.



