Skip to content

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) це:

      <html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">

Цю форму потрібно вказати таким самим чином у файлі struts-config.html. Саме це й зроблено тут:

        <form-bean 
            name="frmPersonne" 
            type="istia.st.struts.personne.FormulaireBean"
        />
  • Конфігурація дії /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»):

    <message-resources parameter="ressources.personneressources"/>    

Тег, наведений нижче, вказує, що файл, який містить повідомлення, що використовуються додатком, знаходиться у файлі WEB-INF/classes/ressources/personneressources.properties:

Image

Що міститься в цьому файлі? Це файл властивостей, що відповідає класу 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:

    <message-resources parameter="ressources.personneressources"/>    

Нагадаємо, що цей файл (насправді 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 можна створити не лише за допомогою ключа повідомлення, а й із додатковими параметрами:

public ActionError(String cléMessage[,String param0, String param1, String param2, String param3])

Якщо ActionError було створено з додатковими параметрами (максимум чотири), до них можна отримати доступ у тексті повідомлення за допомогою позначень від {0} до {3}. Таким чином, метод validate для FormulaireBean створює ActionError із ключем personne.formulaire.age.incorrect та додатковим параметром param0 age:

      erreurs.add("age", new ActionError("personne.formulaire.age.incorrect",age));

Повідомлення, пов’язане у файлі .properties повідомлень із ключем personne.formulaire.age.incorrect, має такий вигляд:

personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>

{0} буде замінено на значення віку. Нарешті, повідомлення з ключами errors.header та errors.footer будуть записані відповідно перед та після списку помилок. У цьому випадку ці два ключі слугуватимуть для включення тегів HTML <ul> та </ul>, які повинні оточувати теги <li>.

3.3. Перевірка валідності форми

Ми готові до тестування валідності форми. Нижче нагадуємо, де мають бути розміщені різні компоненти додатка:

les vues
les fichiers de configuration
le fichier des messages
les classes

3.3.1. Тест 1

Перезапустимо Tomcat, щоб він прочитав нові файли конфігурації, а потім запустимо URL http://localhost:8080/strutspersonne/formulaire.do :

Image

Пояснення:

  • у struts-config.html було використано наступний розділ:
      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

Якщо ми переглянемо код HTML отриманої сторінки, то побачимо, що тег <form> на цій сторінці має такий вигляд:

      <form name="frmPersonne" method="post" action="/strutspersonne/main.do">

Отже, кнопка [Envoyer], яка є кнопкою типу «submit», надішле дані форми на URL /strutspersonne/main.do.

3.3.2. Тест 2

Скористаємося кнопкою [Envoyer], залишивши поля введення порожніми. Отримаємо таку відповідь:

Image

Пояснення:

  • як зазначено вище, дані форми були надіслані до 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>:

    <message-resources parameter="ressources.personneressources"/>

У ньому містяться такі ключі та повідомлення:

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] на сторінці помилок. Ми отримуємо таку сторінку:

Image

Пояснення:

  • посилання [Retour au formulaire] має такий код: HTML:
    <a href="/strutspersonne/formulaire.do">Retour au formulaire</a>

Контролер Struts використав наступний розділ зі свого конфігураційного файлу:

      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

Отже, він повернув перегляд /vues/formulaire.personne.jsp.

3.3.4. Тест 4

Заповнюємо наступну форму, а потім натискаємо кнопку [Envoyer]:

Image

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

Image

Пояснення: такі самі, як і для тесту № 2.

3.3.5. Тест 5

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

Image

Ми бачимо, що форма збереглася в тому стані, в якому ми її підтвердили.

Пояснення: такі самі, як у тесті № 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

Повернімося до форми, щоб цього разу ввести правильні дані:

Image

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

Image

Пояснення:

  • оскільки кнопка [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:

Image

Ми бачимо форму такою, якою її було підтверджено. Пояснення вже надано. Завдяки налаштуванню (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**>. Синтаксис такого тегу є таким:

            <forward name="clé" path="/vue" />
clé
довільна назва, що однозначно ідентифікує вигляд
vue
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** приймає чотири параметри:

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

Таким чином, дія має доступ до ключів, пов'язаних з подами, які можуть бути повернуті клієнту після завершення дії. Метод, що виконується, повинен повернути один із цих ключів.

  1. ActionForm form: об’єкт bean, у якому містяться значення форми, що використовується поточною дією. У даному випадку це об’єкт frmPersonne типу FormulaireBean. Таким чином, дія має доступ до значень форми.
  2. HttpServletRequest request: запит клієнта, який міг бути доповнений різними сервлетами. Таким чином, дія має доступ до всіх параметрів початкового запиту (request.getParameter), а також до всіх атрибутів, доданих до цього початкового запиту (request.getAttribute). У нашому прикладі метод `execute` доповнює запит, додаючи до нього ім’я та вік. Це тут абсолютно непотрібно, оскільки ці два значення вже є в запиті, але як параметри, а не як атрибути. Код наведено тут лише для прикладу.
  3. HttpServletResponse response: відповідь, яка буде надіслана клієнту. Акція могла б доповнити цю відповідь. У даному випадку вона цього не робить.

Тут ми маємо справу з особливим випадком. Метод execute практично нічого не робить. Він повинен просто вказати, що наступним видом є вид **/reponse.do**, та вказати у запиті, що цей вид отримає інформацію про ім’я та вік, яку він має відобразити. Вона робить це за допомогою методу findForward класу ActionMapping, який приймає як параметр один із ключів, знайдених у тегах forward у конфігурації дії. Тут є лише один такий тег:

            <forward name="reponse" path="/reponse.do"/>

Отже, наш метод execute повертає ActionForward із ключем «reponse», щоб вказати, що потрібно надіслати представлення /reponse.do.

3.6. Тестування FormulaireAction

Ми компілюємо попередній клас за допомогою JBuilder і розміщуємо згенерований файл .class у папці WEB-INF/classes:

Image

Ми змінюємо вигляд /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, а потім заповнюємо її:

Image

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

Image

Пояснення:

  • для початку процесу використаємо пояснення, наведене для тесту № 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
  • коли всі розробники працюють однаково, обслуговування додатків стає простішим, оскільки вони мають стандартну архітектуру.