Skip to content

7. Приклад 05B — Навігація у формі введення даних

Ми розглядаємо форму, що містить кілька кнопок для відправлення (submit) введених даних для виконання певної дії.

 

7.1. Проєкт NetBeans

Проєкт NetBeans виглядає так:

  

Елементи проекту такі:

  • [DoSomething.JSP]: єдиний вигляд додатка, що містить три кнопки навігації та одне посилання.
  • [DoSomething.java] та [DoSomethingElse.java]: дві дії проекту
  • [messages.properties]: файл інтернаціоналізованих повідомлень
  • [struts.xml]: файл конфігурації Struts 2

7.2. Configuration

Наступний файл [struts.xml] налаштовує додаток:


<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
 <constant name="struts.custom.i18n.resources" value="messages" />
 <package name="actions" namespace="/actions" extends="struts-default">
    <action name="DoSomething" class="actions.DoSomething">
      <result name="success">/vues/DoSomething.JSP</result>
    </action>  
    <action name="DoSomethingElse" class="actions.DoSomethingElse">
      <result name="success">/vues/DoSomething.JSP</result>
    </action>  
  </package>
</struts>
  • Дія [/actions/DoSomething] спричинить створення екземпляра класу [actions.DoSomething], і його метод execute буде виконано за замовчуванням. Цю поведінку за замовчуванням можна скасувати, якщо параметри, передані до дії [Something], вказують на інший метод. Незалежно від того, який метод виконується, він повинен повернути ключ навігації success, оскільки визначено лише цей ключ. Після цього буде відображено вікно [DoSomething.JSP].
  • Конфігурація дії [/actions/DoSomethingElse] є ідентичною.

7.3. Файл повідомлень

Файл повідомлень [messages.properties] має такий вигляд:


formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3

7.4. Вигляд [DoSomething.JSP]

Вигляд [DoSomething.JSP] такий:

 

Його код такий:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="formulaire.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="formulaire.titre2"/></h1>
    <s:form action="DoSomething">
      <s:submit key="formulaire.execute"/>
      <s:submit key="formulaire.action1" method="action1"/>
      <s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
    </s:form>
    <s:url id="URL" action="DoSomething" method="action3"/>
    <s:a href="%{URL}"><s:text name="formulaire.action3"/></s:a>
  </body>
</html>
  • рядок 11: форма буде відправлена до дії [DoSomething]. Це не обов’язково означає, що саме ця дія буде запущена. Це залежить від кнопки submit, яка використовується для POST.
  • рядок 12: кнопка submit не вказує ані дії, ані методу. Буде інстанційована дія [DoSomething], вказана тегом <form>. Виконається метод, визначений у файлі [struts.xml], а саме метод execute.
  • рядок 13: кнопка submit вказує метод. Буде інстанційована дія [DoSomething], визначена тегом <form>. Виконаним методом буде метод action1.
  • рядок 14: кнопка submit визначає дію та метод. Буде створено екземпляр дії [DoSomethingElse]. Виконаним методом буде метод action2.
  • рядки 16–17: посилання на дію [DoSomething] та метод action3. Буде створено екземпляр дії [DoSomething], а її метод action3 — виконано. На відміну від кнопок submit, натискання на посилання викликає не POST, а GET. Отже, жодних параметрів не надсилається.

HTML-код, згенерований цією процедурою при виклику URL [http://localhost:8084/exemple-05B/actions/DoSomething.action], має такий вигляд:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Actions et Méthodes</title>
  </head>
  <body>
    <h1>Actions et Méthodes</h1>
    <form ... action="/exemple-05B/actions/DoSomething.action" method="post">
...
       <input type="submit" ... name="formulaire.execute" value="DoSomething.execute"/>
...
       <input type="submit" ... name="method:action1" value="DoSomething.action1"/>
...
        <input type="submit" ... name="action:DoSomethingElse!action2" value="DoSomethingElse.action2"/>
...
    </form>
    ...
    <a href="<a href="view-source:http://localhost:8084/exemple-05B/actions/DoSomething%21action3.action">/exemple-05B/actions/DoSomething!action3.action</a>">DoSomething.action3</a>
  </body>
</html>
  • рядок 9: тег form HTML-форми. Атрибут action вказує на URL, куди будуть відправлені параметри форми. Ця URL відповідає дії [DoSomething].
  • рядки 11, 13, 15: атрибути name кнопок будуть відправлені до цільової дії кнопки submit. Саме це дозволяє Struts визначити, яку дію слід інстанціювати та який метод виконати.
  • рядок 13: атрибут name=method:action1 вказує, що має бути виконано метод DoSomething.action1.
  • рядок 15: атрибут name= action:DoSomethingElse!action2 вказує, що має бути виконано метод DoSomethingElse.action2.
  • рядок 11: атрибут name= formulaire.execute не вказує ані дії, ані методу. Отже, буде виконано метод DoSomething.execute.
  • рядок 19: посилання явно вимагає виконання методу DoSomething.action3

7.5. Дії

Дія [DoSomething] виглядає так:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class DoSomething extends ActionSupport {

  public DoSomething() {
    System.out.println("DoSomething");
  }

  @Override
  public String execute() {
    System.out.println("DoSomething.execute");
    return SUCCESS;
  }

  public String action1() {
    System.out.println("DoSomething.action1");
    return SUCCESS;
  }

  public String action3() {
    System.out.println("DoSomething.action3");
    return SUCCESS;
  }
}
  • методи execute, action1 та action3 записують дані на консоль веб-сервера та повертають ключ навігації success.
  • рядок 8: конструктор також виводить інформацію на консоль веб-сервера

Різні записи в консолі дозволяють дізнатися, які методи виконуються під час запиту.

Акція [DoSomethingElse] працює аналогічно:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class DoSomethingElse extends ActionSupport {

  public DoSomethingElse() {
    System.out.println("DoSomethingElse");
  }
  
  @Override
  public String execute() {
    System.out.println("DoSomethingElse.execute");
    return SUCCESS;
  }
  
  public String action2() {
    System.out.println("DoSomethingElse.action2");
    return SUCCESS;
  }
}

7.6. Тестування

Тестування показує такі результати (у консолі веб-сервера):

  • при натисканні кнопки [DoSomething.execute] створюється екземпляр дії [DoSomething] і виконується її метод execute.
  • при натисканні кнопки [DoSomething.action1] створюється екземпляр дії [DoSomething] і виконується її метод action1.
  • при натисканні на кнопку [DoSomethingElse.action2] створюється екземпляр дії [DoSomethingElse] і виконується її метод action2.
  • при натисканні на посилання [DoSomething.action3] створюється екземпляр дії [DoSomething] і виконується її метод action3.