Skip to content

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:

Image

Користувач заповнює форму та натискає кнопку [Envoyer] типу «submit». Кнопка [Rétablir] є кнопкою типу «reset», c.a.d, яка повертає документ у той стан, у якому він був отриманий. Кнопка [Effacer] є кнопкою типу «button». Користувач повинен вказати дійсне ім’я та вік. Якщо це не так, йому надсилається сторінка з повідомленням про помилку за допомогою сторінки JSP erreurs.personne.jsp. Ось приклади:

Обмін № 1

demande
réponse

Якщо перейти за посиланням [Retour au formulaire], то можна побачити, що воно залишилося в тому ж стані, в якому ми його залишили:

Обмін № 2

demande
réponse

Якщо користувач надсилає правильні дані, додаток надсилає йому відповідь за допомогою сторінки JSP reponse.personne.jsp.

Обмін № 1

demande
réponse

Якщо перейти за посиланням [Retour au formulaire], то можна побачити, що воно залишилося в тому ж стані, в якому ми його залишили:

Обмін № 2

demande
réponse

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)

Image

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

Image

У архіви 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>

У цьому коді є дві новинки:

  1. наявність тегів <html:XX/>, які не є тегами HTML. Дійсно, можна створювати бібліотеки тегів JSP, які під час перетворення сторінки JSP у сервлет перетворюються на код Java.
  2. Сторінка JSP повинна оголосити бібліотеки тегів, які вона використовує. Це робиться за допомогою рядка
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

Цей рядок містить дві інформації:

  • uri: розташування файлу, що визначає правила використання бібліотеки. Файл struts-html.tld входить до складу дистрибутива Struts. У наведеному вище прикладі його слід розмістити в папці WEB-INF.
  • prefix: ідентифікатор, який використовується в коді для додавання префікса до тегів бібліотеки. Це дозволяє уникнути конфліктів імен, які можуть виникнути під час одночасного використання декількох бібліотек тегів. Можливо, що в двох різних бібліотеках зустрінуться два теги з однаковою назвою. Присвоївши кожній бібліотеці окремий префікс, ми усуваємо будь-яку неоднозначність.
  • Тег <html:errors> відображає список помилок, які йому передає контролер Struts.
  • тег <html:link> створює посилання на /C/page, де
    • C — це контекст додатка
    • page — це URL, вказаний в атрибуті page тегу

Тег

    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>

згенерує такий код HTML:

<a href="/C/formulaire.do">Retour au formulaire</a>

де C — контекст додатка

2.4.2. Тестування подання erreurs.personne.jsp

  • файл erreurs.personne.jsp розміщується в папці «vues» додатка strutspersonne:

Image

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

Image

  • файл 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:

Image

Тег <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:

Image

  • файл 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:

Image

Ми отримуємо саме те, що очікували.

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
використовується як для генерації тегу HTML <form>, так і для надання інформації контролеру, який оброблятиме цю форму:
action
URL-адреса, на яку будуть надіслані значення форми
name
назва форми HTML. Це також назва біна, який зберігатиме її значення
type
ім'я класу, який потрібно інстанціювати для отримання біна, що зберігає дані форми
Слід зауважити, що метод надсилання параметрів форми (GET/POST) до контролера не вказано. Це можна зробити за допомогою атрибута method. За відсутності цього атрибута за замовчуванням використовується метод POST.
html:text
використовується для генерації тегу <input type="text" value="...">:
property
— ім’я поля bean форми, яке буде пов’язане з полем введення. Під час надсилання форми на сервер (клієнт → сервер) поле bean прийме значення з поля введення. Під час відображення форми (сервер → клієнт) значення, що міститься в полі bean, відображається в полі введення.
html:submit
використовується для генерації тегу HTML <input type="submit"...>
html:reset
використовується для генерації тегу HTML <input type="reset"...>
html:button
використовується для генерації тегу HTML <input type="button"...>

2.4.6. Бін, пов'язаний із формою formulaire.personne.jsp

  • У Struts кожна форма повинна бути пов’язана з біном, який відповідає за збереження значень форми та їх утримання в поточній сесії. Бін — це клас Java, який повинен відповідати певному синтаксису. Бін, пов’язаний із формою, повинен походити від класу ActionForm, визначеного в бібліотеках Struts:
public class FormulaireBean extends ActionForm {
  • імена атрибутів біна повинні відповідати полям форми (атрибути 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:

Image

  • Файл 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:

Image

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

Image

Форма відображається правильно. Можна з цікавістю подивитися, як були «перекладені» теги <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. Спробуємо:

Image

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