Skip to content

2. Die Anwendung „strutspersonne“

Wir haben eine „Person“-Anwendung nach der traditionellen Methode implementiert: mit Servlets und JSP-Seiten. Nun schlagen wir vor, Struts anhand derselben Anwendung vorzustellen.

2.1. So funktioniert die Anwendung

Schauen wir uns noch einmal an, wie die von uns entwickelte „Person“-Anwendung funktioniert. Sie besteht aus:

  • einem Haupt-Servlet. Dieses übernimmt die gesamte Anwendungslogik.
  • drei JSP-Seiten: formulaire.personne.jsp, reponse.personne.jsp und erreurs.personne.jsp

Die Anwendung funktioniert wie folgt. Sie ist über die URL http://localhost:8080/personne/main erreichbar. Unter dieser URL wird ein Formular angezeigt, das von der Seite formulaire.personne.jsp bereitgestellt wird:

Image

Der Benutzer füllt das Formular aus und klickt auf die Schaltfläche [Submit]. Die Schaltfläche [Reset] ist eine Rücksetzschaltfläche, d. h., sie versetzt das Dokument in den Zustand zurück, in dem es empfangen wurde. Die Schaltfläche [Delete] ist eine Standardschaltfläche. Der Benutzer muss einen gültigen Namen und ein gültiges Alter angeben. Ist dies nicht der Fall, wird ihm über die JSP-Seite erreurs.personne.jsp eine Fehlerseite angezeigt. Hier sind einige Beispiele:

Austausch Nr. 1

Anfrage
Antwort

Wenn Sie dem Link [Zurück zum Formular] folgen, finden Sie das Formular in dem Zustand vor, in dem Sie es verlassen haben:

Austausch Nr. 2

Anfrage
Antwort

Wenn der Benutzer gültige Daten übermittelt, sendet die Anwendung eine Antwort über die JSP-Seite reponse.personne.jsp.

Austausch Nr. 1

Anfrage
Antwort

Wenn Sie dem Link [Zurück zum Formular] folgen, finden Sie das Formular in dem Zustand vor, in dem Sie es verlassen haben:

Austausch Nr. 2

Anfrage
Antwort

2.2. Die Struts-Architektur der Anwendung

Wir werden die folgende Struts-Architektur verwenden:

  • Es wird drei Ansichten geben
  • Der Controller wird von Struts bereitgestellt
  • FormBean ist die Klasse, die für die Speicherung der Werte aus dem Formular zuständig ist, das von der Ansicht form.person.jsp dargestellt wird
  • FormAction ist die Klasse, die für die Verarbeitung der Werte von FormBean und die Angabe der zu sendenden Antwortseite zuständig ist:
    • die Ansicht errors.person.jsp, wenn die Formulardaten fehlerhaft sind
    • ansonsten die Ansicht „response.personne.jsp“

Für den Entwickler besteht die Aufgabe darin, den folgenden Code zu schreiben:

  • die drei Ansichten
  • das mit dem Formular verknüpfte FormBean
  • die FormAction-Klasse, die für die Verarbeitung des Formulars zuständig ist

2.3. Kompilieren der für die Struts-Anwendung erforderlichen Klassen

Um die für unsere Anwendung erforderlichen Klassen zu kompilieren, verwenden wir JBuilder. JBuilder arbeitet mit einem JDK, das die für Struts-Anwendungen erforderlichen Klassen nicht enthält. Wir können JBuilder wie folgt konfigurieren:

  • Tools / JDKs konfigurieren

Image

  • Fügen Sie über die Schaltfläche [Hinzufügen] die von Struts bereitgestellten .jar-Dateien zu den Klassenarchiven von JBuilder hinzu. Wenn Sie das Struts-Archiv auf Ihre Festplatte entpackt haben, können Sie alle .jar-Dateien aus dem Ordner <struts>/lib zu JBuilder hinzufügen:

Image

Sie können alle oben genannten .jar-Dateien zu den Archiven von JBuilder hinzufügen. Wir haben bereits gesehen, dass auch Tomcat Zugriff auf die Struts-Archive benötigt. Bei Tomcat 4.x können Sie die Struts-.jar-Dateien in <tomcat4>\common\lib ablegen. Bei Tomcat 5.x können Sie sie in <tomcat5>\shared\lib ablegen. Anschließend können Sie JBuilder so konfigurieren, dass die Struts-JAR-Dateien am selben Speicherort wie bei Tomcat gefunden werden. Genau das wurde in dem zuvor erwähnten Screenshot mit den JBuilder-JAR-Dateien getan. Diese wurden aus dem Verzeichnis <tomcat5>\shared\lib übernommen.

Wenn JBuilder also beim Kompilieren einer Klasse meldet, dass es eine Struts-Klasse nicht finden kann, überprüfen Sie zwei Dinge:

  • die Schreibweise der Klasse
  • die von JBuilder verwendeten .jar-Dateien. Alle Struts-.jar-Dateien müssen enthalten sein.

2.4. Die Ansichten der Struts-Personne-Anwendung

Die drei Ansichten der Anwendung lauten wie folgt:

  • form.person.jsp: zeigt das Formular zur Eingabe von Name und Alter einer Person an
  • reponse.personne.jsp: zeigt die eingegebenen Werte an, sofern sie gültig sind
  • errors.person.jsp: zeigt eventuelle Fehler an

2.4.1. Die Ansicht erreurs.personne.jsp

Diese Ansicht, die eine Liste von Fehlern anzeigt, wird wie folgt definiert:

<%@ 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>

Dieser Code enthält zwei neue Funktionen:

  1. das Vorhandensein von <html:XX/>-Tags, die keine HTML-Tags sind. Sie können Bibliotheken mit JSP-Tags erstellen, die in Java-Code umgewandelt werden, wenn die JSP-Seite in ein Servlet transformiert wird.
  2. Die JSP-Seite muss die von ihr verwendeten Tag-Bibliotheken deklarieren. Dies geschieht hier mit der Zeile
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

Diese Zeile enthält zwei Informationen:

  • uri: Der Speicherort der Datei, die die Verwendungsregeln der Bibliothek festlegt. Die Datei struts-html.tld ist im Struts-Paket enthalten. Im obigen Beispiel befindet sie sich im Ordner WEB-INF.
  • prefix: Die Kennung, die im Code als Präfix für die Tags der Bibliothek verwendet wird. Dies verhindert Namenskonflikte, die bei der gleichzeitigen Verwendung mehrerer Tag-Bibliotheken auftreten könnten. Es ist möglich, dass zwei Tags mit demselben Namen in zwei verschiedenen Bibliotheken vorkommen. Indem jeder Bibliothek ein anderes Präfix zugewiesen wird, werden jegliche Mehrdeutigkeiten beseitigt.
  • Das <html:errors>-Tag zeigt die Liste der Fehler an, die der Struts-Controller an dieses Tag übermittelt.
  • Das <html:link>-Tag generiert einen Link, der auf /C/page verweist, wobei
    • C der Anwendungskontext ist
    • page die im Attribut „page“ des Tags angegebene URL ist

Das

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

erzeugt den folgenden HTML-Code:

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

wobei C der Anwendungskontext ist

2.4.2. Testen der Ansicht errors.person.jsp

  • Die Datei errors.person.jsp befindet sich im Ordner „views“ der Anwendung strutspersonne:

Image

  • Die Datei „struts-html.tld“ wird aus der Struts-Distribution (<struts>/lib) entnommen und im Verzeichnis „WEB-INF“ abgelegt:

Image

  • Die Datei struts-config.xml wird wie folgt geändert:
<?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>

Wir legen in der Konfigurationsdatei eine neue URL „/errors“ an, die vom Struts-Controller verarbeitet werden soll. Die URL „/errors.do“ wird auf die Ansicht „/views/errors.person.jsp“ umgeleitet. Die Datei „struts-config.xml“ wird im Ordner „WEB-INF“ abgelegt.

  • Wir starten Tomcat neu, damit die neue Datei struts-config.xml berücksichtigt wird, und rufen dann die URL http://localhost:8080/strutspersonne/erreurs.do auf:

Image

Das <html:errors/>-Tag hat nichts ausgegeben. Das ist normal; die ForwardAction hat die vom Tag erwartete Fehlerliste nicht generiert. Dennoch zeigt die obige Antwort, dass unsere JSP-Ansicht zumindest syntaktisch korrekt ist; andernfalls hätten wir eine Fehlerseite erhalten. Sehen wir uns den vom Browser empfangenen HTML-Code an (Ansicht/Quelltext):

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

Beachten Sie den durch das <html:link>-Tag generierten Link. Der Kontext /strutspersonne wurde automatisch in den Link aufgenommen. Dadurch kann die Anwendung von einem Kontext in einen anderen verschoben werden (z. B. bei einem Rechnerwechsel), ohne dass die durch <html:link> generierten Links geändert werden müssen.

2.4.3. Die Ansicht „response.personne.jsp“

Diese Ansicht, die die im Formular eingegebenen Werte bestätigt, sieht wie folgt aus:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%
    // on récupère les données nom, age
  //String nom=(String)request.getAttribute("nom");
  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>

Die Seite zeigt zwei Informationen an, [name] und [age], die ihr vom Controller im vordefinierten Request-Objekt übergeben werden. Hier führen wir einen Test durch, bei dem der Controller keine Möglichkeit hat, die Werte von [name] und [age] festzulegen. Daher initialisieren wir diese beiden Informationen mit beliebigen Werten. Auch hier wird der Link zurück zum Formular durch ein <html:link>-Tag generiert.

2.4.4. Testen der Ansicht reponse.personne.jsp

  • Die Datei reponse.personne.jsp befindet sich im Ordner „views“ der Anwendung strutspersonne:

Image

  • Die Datei „struts-config.xml“ wird wie folgt geändert:
<?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>

Wir erstellen in der Konfigurationsdatei eine neue URL /reponse, die vom Struts-Controller verarbeitet werden soll. Die URL /reponse.do wird zur Ansicht /vues/reponse.personne.jsp weitergeleitet. Die Datei struts-config.xml wird im Ordner WEB-INF abgelegt.

  • Wir starten Tomcat neu, damit die neue Datei struts-config.xml berücksichtigt wird, und rufen dann die URL http://localhost:8080/strutspersonne/erreurs.do auf:

Image

Wir erhalten genau das, was wir erwartet haben.

2.4.5. Die Ansicht „formulaire.personne.jsp“

Diese Ansicht zeigt das Formular zur Eingabe des Namens und des Alters des Benutzers an. Ihr JSP-Code lautet wie folgt:

<%@ 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>

Wir sehen, dass die Tag-Bibliothek „struts-html.tld“ in der Fehleransicht verwendet wird. Es erscheinen neue Tags:

html:form
wird sowohl zur Generierung des HTML-Tags <form> als auch zur Bereitstellung von Informationen für den Controller verwendet, der dieses Formular verarbeitet:
action
URL, an die die Formularwerte gesendet werden
name
Name des HTML-Formulars. Dies ist auch der Name der Bean, in der die Werte des Formulars gespeichert werden
Typ
Name der Klasse, die instanziiert werden muss, um die Formularspeicher-Bean zu erhalten
Beachten Sie, dass die Methode zum Senden von Formularparametern (GET/POST) an den Controller nicht angegeben ist. Dies könnte mithilfe des Attributs „method“ erfolgen. Fehlt dieses Attribut, wird standardmäßig die POST-Methode verwendet.
html:text
Wird verwendet, um das Tag <input type="text" value="..."> zu generieren:
Eigenschaft
Name des Feldes in der Formular-Bean, das mit dem Eingabefeld verknüpft wird. Wenn das Formular an den Server gesendet wird (Client -> Server), übernimmt das Bean-Feld den Wert des Eingabefeldes. Wenn das Formular angezeigt wird (Server -> Client), wird der im Bean-Feld enthaltene Wert im Eingabefeld angezeigt.
html:submit
wird verwendet, um den HTML-Tag <input type="submit"...> zu generieren
html:reset
wird verwendet, um den HTML-Tag <input type="reset"...> zu generieren
html:button
wird verwendet, um den HTML-Tag <input type="button"...> zu generieren

2.4.6. Die mit dem Formular „formulaire.personne.jsp“ verknüpfte Bean

  • Bei Struts muss jedes Formular mit einer Bean verknüpft sein, die für die Speicherung der Formularwerte und deren Pflege in der aktuellen Sitzung zuständig ist. Eine Bean ist eine Java-Klasse, die einer bestimmten Syntax entsprechen muss. Die mit einem Formular verknüpfte Bean muss die in der Struts-Bibliothek definierte Klasse ActionForm erweitern:
public class FormulaireBean extends ActionForm {
  • Die Namen der Attribute des Beans müssen mit den Formularfeldern übereinstimmen (Eigenschaftsattribute der <html:text>-Tags des Formulars). Basierend auf dem Code des vorherigen Formulars muss der Bean daher zwei Felder namens name und age haben.
  • Für jedes Feld XX im Formular muss der Bean zwei Methoden definieren:
    • public void setXX(Type value): um dem Attribut XX einen Wert zuzuweisen
    • public getXX(Value type): zum Abrufen des Werts des Felds XX

Die mit dem vorherigen Formular verknüpfte Bean könnte wie folgt aussehen:

package istia.st.struts.personne;

import org.apache.struts.action.ActionForm;

public class FormulaireBean extends ActionForm {
   // name
  private String nom = null;
  public String getNom() {
    return nom;
  }
  public void setNom(String nom) {
    this.nom = nom;
  }

   // age
  private String age = null;
  public String getAge() {
    return age;
  }
  public void setAge(String age) {
    this.age = age;
  }
}

Wir werden diese Klasse mit JBuilder kompilieren.

2.4.7. Testen der Ansicht „formulaire.personne.jsp“

Die Datei „formulaire.personne.jsp“ befindet sich im Ordner „views“ der Anwendung „strutspersonne“:

Image

  • Die Datei struts-config.xml wird wie folgt geändert:
<?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>

In der Konfigurationsdatei erstellen wir eine neue URL /form, die vom Struts-Controller verarbeitet wird. Die URL /form.do wird zur Ansicht /views/form.person.jsp weitergeleitet. Die Datei struts-config.xml befindet sich im Ordner WEB-INF.

  • Wir legen die Klasse FormulaireBean in WEB-INF/classes ab:

Image

  • Wir starten Tomcat neu, damit die neue Datei struts-config.xml berücksichtigt wird, und rufen dann die URL http://localhost:8080/strutspersonne/formulaire.do auf:

Image

Das Formular wird korrekt angezeigt. Vielleicht interessiert es uns, wie die im JSP-Code des Formulars verstreuten <html:XX>-Tags „übersetzt“ wurden:

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

Im resultierenden Formular funktionieren die Schaltflächen [Reset] und [Clear]. Die Schaltfläche [Submit] leitet zur URL /strutspersonne/main.do weiter. Gemäß der Datei web.xml der Anwendung wird dies vom Struts-Controller verarbeitet. Gemäß der Datei struts-config.html muss der Controller die Anfrage an die Ansicht /vues/main.html weiterleiten. Probieren wir es aus:

Image

Alles funktioniert wie erwartet. Wir müssen die Formularwerte nun noch tatsächlich verarbeiten, d. h. die Action-Klasse schreiben, die die Formulardaten in ein FormBean-Objekt überträgt.