2. Додаток strutspersonne
Ми розглянули класичний підхід — сервлет і сторінки JSP — для створення додатка «особа». Тепер ми пропонуємо ознайомитися зі Struts на прикладі цього самого додатка.
2.1. Принцип роботи додатка
Нагадаємо, як працює додаток «person», який ми розробили. Він складається з:
- сервлета main. Саме він забезпечує всю логіку роботи додатка.
- трьох сторінок JSP: formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp
Прикладка працює наступним чином. Доступ до неї здійснюється через URL-адресу URL http://localhost:8080/personne/main. За цією адресою відображається форма, що надається сторінкою formulaire.personne.jsp:

Користувач заповнює форму та натискає кнопку [Envoyer] типу «submit». Кнопка [Rétablir] є кнопкою типу «reset», c.a.d, яка повертає документ у той стан, у якому він був отриманий. Кнопка [Effacer] є кнопкою типу «button». Користувач повинен вказати дійсне ім’я та вік. Якщо це не так, йому надсилається сторінка з повідомленням про помилку за допомогою сторінки JSP erreurs.personne.jsp. Ось приклади:
Обмін № 1
![]() | ![]() |
Якщо перейти за посиланням [Retour au formulaire], то можна побачити, що воно залишилося в тому ж стані, в якому ми його залишили:
Обмін № 2
![]() | ![]() |
Якщо користувач надсилає правильні дані, додаток надсилає йому відповідь за допомогою сторінки JSP reponse.personne.jsp.
Обмін № 1
![]() | ![]() |
Якщо перейти за посиланням [Retour au formulaire], то можна побачити, що воно залишилося в тому ж стані, в якому ми його залишили:
Обмін № 2
![]() | ![]() |
2.2. Архітектура Struts додатка
Ми будемо використовувати таку архітектуру Struts:
![]() |
- буде три представлення
- контролер буде тим, що надається Struts
- FormulaireBean — це клас, відповідальний за збереження значень форми, представленої поданням formulaire.personne.jsp
- FormulaireAction — це клас, який обробляє значення з FormulaireBean та вказує, на яку сторінку слід надіслати відповідь:
- вигляд erreurs.personne.jsp, якщо дані форми містять помилки
- погляд reponse.personne.jsp в іншому випадку
Для розробника робота полягає у написанні коду:
- трьох представлень
- біна FormulaireBean, пов’язаного з формою
- класу FormulaireAction, відповідального за обробку форми
2.3. Компіляція класів, необхідних для роботи додатка Struts
Для компіляції класів, необхідних для нашого додатка, ми будемо використовувати JBuilder. Ця програма працює з файлом JDK, у якому відсутні класи, необхідні для додатків Struts. JBuilder можна налаштувати наступним чином:
- опція Tools (Інструменти) /Configure JDKs (Налаштувати JDK)

- скористатися кнопкою [Add/Ajouter], щоб додати до архівів класів JBuilder файли .jar, що постачаються Struts. Якщо архів Struts розпаковано на диск, до JBuilder можна додати всі файли .jar із папки <struts>/lib:

У архіви JBuilder можна додати всі вищезазначені файли .jar. Ми вже бачили, що Tomcat також потребує доступу до архівів Struts. Для Tomcat 4.x файли .jar Struts можна розмістити в папці <tomcat4>\common\lib. Для Tomcat 5.x їх можна розмістити в папці <tomcat5>\shared\lib. Далі можна налаштувати JBuilder так, щоб він знаходив файли .jar Struts у тому ж місці, що й Tomcat. Саме це було зроблено на знімку екрана, показаному трохи вище, де зображені файли .jar JBuilder. Вони були взяті з папки <tomcat5>\shared\lib.
Отже, якщо під час компіляції класу JBuilder повідомляє, що не може знайти клас Struts, перевірте дві речі:
- правильність написання назви класу
- файли .jar, які використовує JBuilder. Усі файли .jar Struts мають бути серед них.
2.4. Види додатка strutspersonne
Додаток має три такі подання:
- formulaire.personne.jsp: відображає форму для введення імені та віку особи
- reponse.personne.jsp: відображає введені значення, якщо вони є правильними
- erreurs.personne.jsp: відображає помилки, якщо такі є
2.4.1. Вигляд 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:XX/>, які не є тегами HTML. Дійсно, можна створювати бібліотеки тегів JSP, які під час перетворення сторінки JSP у сервлет перетворюються на код Java.
- Сторінка JSP повинна оголосити бібліотеки тегів, які вона використовує. Це робиться за допомогою рядка
Цей рядок містить дві інформації:
- uri: розташування файлу, що визначає правила використання бібліотеки. Файл struts-html.tld входить до складу дистрибутива Struts. У наведеному вище прикладі його слід розмістити в папці WEB-INF.
- prefix: ідентифікатор, який використовується в коді для додавання префікса до тегів бібліотеки. Це дозволяє уникнути конфліктів імен, які можуть виникнути під час одночасного використання декількох бібліотек тегів. Можливо, що в двох різних бібліотеках зустрінуться два теги з однаковою назвою. Присвоївши кожній бібліотеці окремий префікс, ми усуваємо будь-яку неоднозначність.
- Тег <html:errors> відображає список помилок, які йому передає контролер Struts.
- тег <html:link> створює посилання на /C/page, де
- C — це контекст додатка
- page — це URL, вказаний в атрибуті page тегу
Тег
згенерує такий код HTML:
де C — контекст додатка
2.4.2. Тестування подання erreurs.personne.jsp
- файл erreurs.personne.jsp розміщується в папці «vues» додатка strutspersonne:

- файл struts-html.tld береться з дистрибутива Struts (<struts>/lib) і розміщується у WEB-INF:

- файл struts-config.xml змінюється наступним чином:
<?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>
<action-mappings>
<action
path="/main"
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-mappings>
</struts-config>
Ми створюємо у файлі конфігурації новий URL /errors, призначений для обробки контролером Struts. URL /erreurs.do буде перенаправлено на сторінку /vues/erreurs.personne.jsp. Файл struts-config.xml розміщується в папці WEB-INF.
- Ми перезапускаємо Tomcat, щоб новий файл struts-config.xml був врахований, а потім вводимо URL-адресу http://localhost:8080/strutspersonne/erreurs.do:

Тег <html:errors/> нічого не вивів. Це нормально, оскільки дія ForwardAction не згенерувала список помилок, на який розраховував тег. Проте наведена вище відповідь свідчить про те, що наш вигляд JSP є принаймні синтаксично правильним, інакше ми б отримали сторінку з помилками. Перевіримо код HTML, отриманий браузером (View/Source):
<html>
<head>
<title>Personne - erreurs</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<a href="/strutspersonne/formulaire.do">Retour au formulaire</a>
</body>
</html>
Зверніть увагу на посилання, створене тегом <html:link>. Контекст /strutspersonne був автоматично включений у посилання. Це дозволяє переміщати додаток з одного контексту в інший (наприклад, при зміні комп’ютера) без необхідності змінювати посилання, згенеровані тегом <html:link>.
2.4.3. Вигляд reponse.personne.jsp
Цей вигляд, що підтверджує значення, введені у форму, виглядає наступним чином:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%
// отримуємо дані «ім'я», «вік»
//String ім'я = (String)request.getAttribute("ім'я");
String nom="jean";
//String age=(String)request.getAttribute("age");
String age="24";
%>
<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>
<br>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
На сторінці відображаються два записи: [nom] та [age], які контролер передасть їй у попередньо визначеному об’єкті request. Тут ми проводимо тест, у якому контролер не матиме можливості встановити значення [nom] та [age]. Тому ми ініціалізуємо ці два елементи з довільними значеннями. Крім того, тут також посилання для повернення до форми генерується за допомогою тегу <html:link>.
2.4.4. Тестування подання reponse.personne.jsp
- Файл reponse.personne.jsp розміщено в папці «vues» додатка strutspersonne:

- файл struts-config.xml змінено наступним чином:
<?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>
<action-mappings>
<action
path="/main"
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-mappings>
</struts-config>
У файлі конфігурації ми створюємо нову відповідь URL, призначену для обробки контролером Struts. URL /reponse.do буде перенаправлено на вигляд /vues/reponse.personne.jsp. Файл struts-config.xml розміщується в папці WEB-INF.
- Ми перезапускаємо Tomcat, щоб новий файл struts-config.xml був врахований, а потім вводимо URL-адресу http://localhost:8080/strutspersonne/erreurs.do:

Ми отримуємо саме те, що очікували.
2.4.5. Вигляд formulaire.personne.jsp
Цей вигляд містить форму для введення імені та віку користувача. Його код JSP такий:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<meta http-equiv="pragma" content="no-cache">
<head>
<title>Personne - formulaire</title>
<script language="javascript">
function effacer(){
with(document.frmPersonne){
nom.value="";
age.value="";
}
}
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">
<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>
<table>
<tr>
<td><html:submit value="Envoyer"/></td>
<td><html:reset value="Rétablir"/></td>
<td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
</tr>
</table>
</html:form>
</center>
</body>
</html>
Ми знову бачимо бібліотеку тегів struts-html.tld, яка використовується у вікні помилок. З’являються нові теги:
використовується як для генерації тегу HTML <form>, так і для надання інформації контролеру, який оброблятиме цю форму:
Слід зауважити, що метод надсилання параметрів форми (GET/POST) до контролера не вказано. Це можна зробити за допомогою атрибута method. За відсутності цього атрибута за замовчуванням використовується метод POST. | |||||||
використовується для генерації тегу <input type="text" value="...">:
| |||||||
використовується для генерації тегу HTML <input type="submit"...> | |||||||
використовується для генерації тегу HTML <input type="reset"...> | |||||||
використовується для генерації тегу HTML <input type="button"...> |
2.4.6. Бін, пов'язаний із формою formulaire.personne.jsp
- У Struts кожна форма повинна бути пов’язана з біном, який відповідає за збереження значень форми та їх утримання в поточній сесії. Бін — це клас Java, який повинен відповідати певному синтаксису. Бін, пов’язаний із формою, повинен походити від класу ActionForm, визначеного в бібліотеках Struts:
- імена атрибутів біна повинні відповідати полям форми (атрибути property тегів html:text форми). Згідно з кодом попередньої форми, бін повинен мати два поля з іменами nom та age.
- Для кожного поля XX у формі bean повинен визначати два методи:
- public void setXX(Type valeur): для присвоєння значення атрибуту XX
- Type getXX(): для отримання значення поля XX
Bean, пов’язаний із попередньою формою, може мати такий вигляд:
package istia.st.struts.personne;
import org.apache.struts.action.ActionForm;
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;
}
}
Цей клас буде скомпільовано за допомогою JBuilder.
2.4.7. Тестування подання formulaire.personne.jsp
Файл formulaire.personne.jsp розміщено в папці «vues» додатка strutspersonne:

- Файл struts-config.xml змінено наступним чином:
<?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>
<action-mappings>
<action
path="/main"
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>
</struts-config>
У файлі конфігурації ми створюємо нову форму URL, призначену для обробки контролером Struts. URL /formulaire.do буде перенаправлено на вигляд /vues/formulaire.personne.jsp. Файл struts-config.xml розміщується в папці WEB-INF.
- ми розміщуємо клас FormulaireBean у WEB-INF/classes:

- Перезапускаємо Tomcat, щоб новий файл struts-config.xml був врахований, а потім звертаємося за URL-адресою http://localhost:8080/strutspersonne/formulaire.do:

Форма відображається правильно. Можна з цікавістю подивитися, як були «перекладені» теги <html:XX>, які розкидані по коду JSP форми:
<html>
<meta http-equiv="pragma" content="no-cache">
<head>
<title>Personne - formulaire</title>
<script language="javascript">
function effacer(){
with(document.frmPersonne){
nom.value="";
age.value="";
}
}
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<form name="frmPersonne" method="post" action="/strutspersonne/main.do">
<table>
<tr>
<td>Nom</td>
<td><input type="text" name="nom" size="20" value=""></td>
</tr>
<tr>
<td>Age</td>
<td><input type="text" name="age" size="3" value=""></td>
</tr>
<tr>
</table>
<table>
<tr>
<td><input type="submit" value="Envoyer"></td>
<td><input type="reset" value="Rétablir"></td>
<td><input type="button" name="btnEffacer" value="Effacer" onclick="effacer()"></td>
</tr>
</table>
</form>
</center>
</body>
</html>
У отриманій формі працюють кнопки |Відновити] та [Effacer]. Кнопка [Envoyer] типу «submit» перенаправляє на сторінку URL /strutspersonne/main.do. Згідно з файлом web.xml додатка, контролер Struts буде обробляти цей запит. Згідно з файлом struts-config.html, контролер повинен перенаправити запит на представлення /vues/main.html. Спробуємо:

Все відбувається так, як і очікувалося. Залишилося лише фактично обробити значення форми, c.a.d. Напишемо клас типу Action, який прийматиме дані форми в об’єкт FormulaireBean.








