Skip to content

2. L'application strutspersonne

Nous avons traité par la méthode classique, servlet et pages JSP, une application personne. Nous nous proposons d'introduire Struts avec cette même application.

2.1. Le fonctionnement de l'application

Rappelons ici le fonctionnement de l'application personne que nous avons développée. Elle est composée :

  • d'une servlet main. C'est elle qui assure toute la logique de l'application.
  • de trois pages JSP : formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp

Le fonctionnement de l'application est le suivant. Elle est accessible via l'URL http://localhost:8080/personne/main. A cette url, on obtient un formulaire fourni par la page formulaire.personne.jsp :

Image

L'utilisateur remplit le formulaire et appuie sur le bouton [Envoyer] de type submit. Le bouton [Rétablir] est de type reset, c.a.d. qu'il remet le document dans l'état où il a été reçu. Le bouton [Effacer] est de type button. L'utilisateur doit fournir un nom et un âge valides. Si ce n'est pas le cas, une page d'erreurs lui est envoyée au moyen de la page JSP erreurs.personne.jsp. Voici des exemples :

Echange n° 1

demande
réponse

Si on suit le lien [Retour au formulaire] on retrouve celui-ci dans l'état où on l'a laissé :

Echange n° 2

demande
réponse

Si l'utilisateur envoie des données correctes, l'application lui envoie une réponse au moyen de la page JSP reponse.personne.jsp.

Echange n° 1

demande
réponse

Si on suit le lien [Retour au formulaire] on retrouve celui-ci dans l'état où on l'a laissé :

Echange n° 2

demande
réponse

2.2. L'architecture Struts de l'application

Nous adopterons l'architecture Struts suivante :

  • il y aura trois vues
  • le contrôleur sera celui fourni par Struts
  • FormulaireBean est la classe chargée de mémoriser les valeurs du formulaire présenté par la vue formulaire.personne.jsp
  • FormulaireAction est la classe chargée de traiter les valeurs de FormulaireBean et d'indiquer la page réponse à envoyer :
    • la vue erreurs.personne.jsp si les données du formulaire sont erronées
    • la vue reponse.personne.jsp sinon

Pour le développeur, le travaille consiste à écrire le code :

  • des trois vues
  • du bean FormulaireBean associé au formulaire
  • de la classe FormulaireAction chargée de traiter le formulaire

2.3. Compiler les classes nécessaires à l'application Struts

Pour compiler les classes nécessaires à notre application, nous utiliserons Jbuilder. Celui-ci travaille avec un JDK dans lequel ne se trouvent pas les classes nécessaires aux applications Struts. On pourra configurer Jbuilder de la façon suivante :

  • option Tools (Outils) /Configure JDKs (Configurer les JDK)

Image

  • on utiliser le bouton [Add/Ajouter] pour ajouter aux archives de classes de JBuilder, les .jar amenés par Struts. Si on a décompressé l'archive Struts sur le disque, on pourra ajouter à Jbuilder tous les .jar du dossier <struts>/lib :

Image

On peut ajouter aux archives de Jbuilder tous les .jar ci-dessus. Nous avons déjà vu que Tomcat a lui aussi besoin d'avoir accès aux archives de Struts. Pour Tomcat 4.x, on peut mettre les .jar de Struts dans <tomcat4>\common\lib. Pour Tomcat 5.x, on pourra les placer dans <tomcat5>\shared\lib. On peut décider ensuite que Jbuilder trouvera les .jar de Struts au même endroit que Tomcat. C'est ce qui a été fait dans la copie d'écran montrant un peu plus haut les .jar de Jbuilder. Ils ont été pris dans <tomcat5>\shared\lib.

Si donc, lors de la compilation d'une classe, Jbuilder signale qu'il ne trouve pas une classe Struts, vérifiez deux choses :

  • l'orthographe de la classe
  • les .jar utilisés par Jbuilder. Tous les .jar de Struts doivent en faire partie.

2.4. Les vues de l'application strutspersonne

Les trois vues de l'application sont les suivantes :

  • formulaire.personne.jsp : affiche le formulaire de saisie des nom et âge d'une personne
  • reponse.personne.jsp : affiche les valeurs saisies si elles sont valides
  • erreurs.personne.jsp : affiche les erreurs s'il y en a

2.4.1. La vue erreurs.personne.jsp

Cette vue qui affiche une liste d'erreurs sera définie comme suit :

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

Il y a deux nouveautés dans ce code :

  1. la présence de balisee <html:XX/> qui ne sont pas des balise HTML. On peut en effet créer des bibiothèques de balises JSP qui lors de la transformation de la page JSP en servlet sont transformées en code Java.
  2. la page JSP doit déclarer les bibliothèques de balises qu'elle utilise. Elle le fait ici avec la ligne
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

Cette ligne donne deux informations :

  • uri : l'emplacement du fichier régissant les règles d'utilisation de la bibliothèque. Le fichier struts-html.tld est fourni dans la distribution de Struts. On le placera, dans l'exemple ci-dessus, dans le dossier WEB-INF.
  • prefix : l'identificateur utilisé dans le code pour préfixer les balises de la bibliothèque. Cela permet d'éviter les conflits de noms qui pourraient survenir lors de l'utilisation simultanée de plusieurs bibliothèques de balises. Il serait possible de trouver deux balises de même nom dans deux bibliothèques différentes. En donnant un préfixe différent à chaque bibliothèque, on supprime toute ambiguïté.
  • la balise <html:errors> affiche la liste d'erreurs que le contrôleur Struts lui tansmet.
  • la balise <html:link> génère un lien pointant sur /C/page
    • C est le contexte de l'application
    • page est l'URL indiquée dans l'attribut page de la balise

Le balise

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

génèrera le code HTML suivant :

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

C est le contexte de l'application

2.4.2. Test de la vue erreurs.personne.jsp

  • le fichier erreurs.personne.jsp est placé dans le dossier vues de l'application strutspersonne :

Image

  • le fichier struts-html.tld est pris dans la distribution struts (<struts>/lib) et placé dans WEB-INF :

Image

  • le fichier struts-config.xml est modifié de la façon suivante :
<?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>

Nous créons dans le fichier de configuration une nouvelle URL /erreurs destinée à être traitée par le contrôleur struts. L'URL /erreurs.do sera redirigée vers la vue /vues/erreurs.personne.jsp. Le fichier struts-config.xml est placé dans le dossier WEB-INF.

  • nous relançons Tomcat pour que le nouveau fichier struts-config.xml soit pris en compte, puis nous demandons l'url http://localhost:8080/strutspersonne/erreurs.do :

Image

La balise <html:errors/> n'a rien produit. C'est normal, l'action ForwardAction n'a pas généré la liste d'erreurs attendue par la balise. Néanmoins, la réponse ci-dessus montre que notre vue JSP est au moins syntaxiquement correcte sinon nous aurions obtenu une page d'erreurs. Vérifions le code HTML reçu par le navigateur (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>

On notera le lien produit par la balise <html:link>. Le contexte /strutspersonne a été automatiquement inclus dans le lien. Cela permet de déplacer l'application d'un contexte à un autre (changement de machine par exemple) sans avoir à changer les liens générés par <html:link>.

2.4.3. La vue reponse.personne.jsp

Cette vue qui confirme les valeurs saisies dans le formulaire est la suivante :

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

La page affiche deux informations [nom] et [age] qui lui seront passées par le contrôleur dans l'objet prédéfini request. Ici, nous faisons un test où le contrôleur n'aura pas l'occasion de fixer les valeurs de [nom] et [age]. Aussi initialisons-nous ces deux informations avec des valeurs arbitraires. Par ailleurs, ici également le lien de retour vers le formulaire est généré par une balise <html:link>.

2.4.4. Test de la vue reponse.personne.jsp

  • le fichier reponse.personne.jsp est placé dans le dossier vues de l'application strutspersonne :

Image

  • le fichier struts-config.xml est modifié de la façon suivante :
<?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>

Nous créons dans le fichier de configuration une nouvelle URL /reponse destinée à être traitée par le contrôleur struts. L'URL /reponse.do sera redirigée vers la vue /vues/reponse.personne.jsp. Le fichier struts-config.xml est placé dans le dossier WEB-INF.

  • nous relançons Tomcat pour que le nouveau fichier struts-config.xml soit pris en compte, puis nous demandons l'url http://localhost:8080/strutspersonne/erreurs.do :

Image

Nous obtenons bien ce qui était attendu.

2.4.5. La vue formulaire.personne.jsp

Cette vue présente le formulaire de saisie des nom et âge de l'utilisateur. Son code JSP est le suivant :

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

Nous retrouvons la bibliothèque de balises struts-html.tld utilisée dans la vue erreurs. De nouvelles balises apparaissent :

html:form

sert à la fois à générer la balise HTML <form> et à donner des informations au contrôleur qui aura à traiter ce formulaire :

action

url où seront envoyées les valeurs du formulaire

name

nom du formulaire HTML. C'est aussi le nom du bean qui mémorisera les valeurs de celui-ci

type

nom de la classe qui devra être instanciée pour obtenir le bean de stockage du formulaire

On remarquera que la méthode d'envoi des paramètres du formulaire (GET/POST) au contrôleur n'est pas précisée. On pourrait le faire avec l'attribut method. En l'absence de celui-ci, c'est la méthode POST qui est utilisée par défaut.

html:text

sert à générer la balise <input type="text" value="..."> :

propertynom du champ du bean du formulaire qui sera associé à la zone de saisie. A l'envoi du formulaire au serveur (client -> serveur), le champ du bean prendra la valeur du champ de saisie. A l'affichage du formulaire (serveur -> client), la valeur contenue dans le champ du bean est affichée dans la zone de saisie.

html:submit

sert à générer la balise HTML <input type="submit"...>

html:reset

sert à générer la balise HTML <input type="reset"...>

html:button

sert à générer la balise HTML <input type="button"...>

2.4.6. Le bean associé au formulaire formulaire.personne.jsp

  • Avec Struts, tout formulaire doit être associé à un bean chargé de mémoriser les valeurs du formulaire et de conserver celles-ci dans la session courante. Un bean est une classe Java qui doit respecter une syntaxe particulière. Le bean associé à un formulaire doit dériver de la classe ActionForm définie dans les bibliothèque de Struts :
public class FormulaireBean extends ActionForm {
  • les noms des attributs du bean doivent correspondre aux champs du formulaire (attributs property des balises html:text du formulaire). D'après le code du formulaire précédent, le bean doit donc avoir deux champs appelés nom et age.
  • pour chaque champ XX du formulaire, le bean doit définir deux méthodes :
    • public void setXX(Type valeur) : pour affecter une valeur à l'attribut XX
    • Type getXX() : pour obtenir la valeur du champ XX

Le bean associé au formulaire précédent pourrait être le suivant :

package istia.st.struts.personne;

import org.apache.struts.action.ActionForm;

public class FormulaireBean extends ActionForm {
  // nom
  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;
  }
}

On compilera cette classes avec Jbuilder.

2.4.7. Test de la vue formulaire.personne.jsp

le fichier formulaire.personne.jsp est placé dans le dossier vues de l'application strutspersonne :

Image

  • le fichier struts-config.xml est modifié de la façon suivante :
<?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>

Nous créons dans le fichier de configuration une nouvelle URL /formulaire destinée à être traitée par le contrôleur struts. L'URL /formulaire.do sera redirigée vers la vue /vues/formulaire.personne.jsp. Le fichier struts-config.xml est placé dans le dossier WEB-INF.

  • nous plaçons la classe FormulaireBean dans WEB-INF/classes :

Image

  • nous relançons Tomcat pour que le nouveau fichier struts-config.xml soit pris en compte, puis nous demandons l'url http://localhost:8080/strutspersonne/formulaire.do :

Image

Nous obtenons bien le formulaire. Nous pouvons avoir la curiosité de regarder comment ont été "traduites" les balises <html:XX> qui parsemaient le code JSP du formulaire :

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

Dans le formulaire obtenu, les boutons |Rétablir] et [Effacer] fonctionnent. Le bouton [Envoyer] de type submit renvoie à l'URL /strutspersonne/main.do. D'après le fichier web.xml de l'application, le contrôleur Struts va la prendre en charge. D'après le fichier struts-config.html, le contrôleur doit rediriger la requête vers la vue /vues/main.html. Essayons :

Image

Tout se passe comme attendu. Il nous reste à traiter véritablement les valeurs du formulaire, c.a.d. écrire la classe de type Action qui va recevoir les données du formulaire dans un objet FormulaireBean.