Introduction à STRUTS2 par l'exemple


précédentsommairesuivant

XV. Exemple 12 - Conversions et validations diverses

La nouvelle application présente la saisie de divers éléments disposant de validateurs Struts :

Image non disponible
  • en [1], le formulaire de saisie
  • en [2], la confirmation des saisies

L'application a un fonctionnement similaire aux précédentes aussi ne commenterons-nous que les points qui diffèrent.

XV-A. Le projet Netbeans

Le projet Netbeans est le suivant :

Image non disponible

  • en [1], les vues de l'application
    • [Accueil.jsp] : la page d'accueil
    • [FormDivers.jsp] : le formulaire de saisie
    • [ConfirmationFormDivers.jsp] : la page de confirmation
  • en [2], le fichier des messages [messages.properties] et le fichier de configuration principal de Struts
  • en [3] :
    • [FormDivers.java] : l'action qui affiche et traite le formulaire
    • [FormDivers-validation.xml] : les règles de validation de l'action [FormDivers]. Ce fichier délègue ces validations au modèle.
    • [FormDiversModel] : le modèle de l'action [FormDivers]
    • [ FormDiversModel-validation.xml] : les règles de validation du modèle
    • [FormDiversModel.properties] : le fichier des messages du modèle
    • [example.xml] : fichier de configuration secondaire de Struts

XV-B. La configuration du projet

Le projet est principalement configuré par le fichier [example.xml] suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <package name="example" namespace="/example" extends="struts-default">
    <action name="Accueil">
      <result name="success">/example/Accueil.jsp</result>
    </action>
    <action name="FormDivers" class="example.FormDivers">
      <result name="input">/example/FormDivers.jsp</result>
      <result name="cancel" type="redirect">/example/Accueil.jsp</result>
      <result name="success">/example/ConfirmationFormDivers.jsp</result>
    </action>
  </package>
</struts>

Il est analogue à celui qui a été étudié dans les version précédentes.

XV-C. Les fichiers des messages

Le fichier [messages.properties] est le suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Accueil.titre=Accueil
Accueil.message=Struts 2 - Conversions et validations
Accueil.FormDivers=Saisies diverses (email, url, chaine de caract\u00e8res avec contr\u00f4le du nombre de caract\u00e8res)
Form.titre=Conversions et validations
FormDivers.message=Struts 2 - Conversions et validations de types divers
Form.submitText=Valider
Form.cancelText=Annuler
Form.clearModel=Raz mod\u00e8le
Confirmation.titre=Confirmation
Confirmation.message=Confirmation des valeurs saisies
Confirmation.champ=champ
Confirmation.valeur=valeur
Confirmation.lien=Formulaire de test
xwork.default.invalid.fieldvalue=Valeur invalide pour le champ "{0}".

Le fichier [FormDiversModel.properties] est le suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
email.prompt=1-Tapez une adresse \u00E9lectronique (x@y.z)
email.error=Format invalide
url.prompt=2-Tapez une url (http://www.ibm.com)
url.error=Format invalide
chaine.prompt=3-Tapez une chaine de 5 caract\u00E8res
chaine.error=Format invalide

XV-D. Le formulaire de saisie

La vue [FormDivers.jsp] est la suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Form.titre"/></title>
    <s:head/>
  </head>

  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="FormDivers.message"/></h2>
    <s:form name="formulaire" action="FormDivers">
      <s:textfield name="email" key="email.prompt" size="30"/>
      <s:textfield name="url1" key="url.prompt" size="30"/>
      <s:textfield name="chaine" key="chaine.prompt" size="10"/>
      <s:submit key="Form.submitText" method="execute"/>
    </s:form>
    <br/>
    <s:url id="url" action="FormDivers" method="cancel"/>
    <s:a href="%{url}"><s:text name="Form.cancelText"/></s:a>
      <br/>
    <s:url id="url" action="FormDivers" method="clearModel"/>
    <s:a href="%{url}"><s:text name="Form.clearModel"/></s:a>
  </body>
</html>

Les lignes 12 à 14 sont les trois zones de saisie.

XV-E. La vue de confirmation

La vue de confirmation [ConfirmationFormDivers.jsp] est la suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Confirmation.titre"/></title>
    <s:head/>
  </head>

  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="Confirmation.message"/></h2>
    <table border="1">
      <tr>
        <th><s:text name="Confirmation.champ"/></th>
        <th><s:text name="Confirmation.valeur"/></th>
      </tr>
      <tr>
        <td><s:text name="email.prompt"/></td>
        <td><s:text name="email"/></td>
      </tr>
      <tr>
        <td><s:text name="url.prompt"/></td>
        <td><s:text name="url1"/></td>
      </tr>
      <tr>
        <td><s:text name="chaine.prompt"/></td>
        <td><s:text name="chaine"/></td>
      </tr>
     </table>
    <br/>
    <s:url id="url" action="FormDivers!input"/>
    <s:a href="%{url}"><s:text name="Confirmation.lien"/></s:a>
  </body>
</html>

XV-F. Le modèle [FormDiversModel]

Les champs de saisie du formulaire [FormDivers.jsp] sont injectés dans le modèle [FormDiversModel] suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package example;

public class FormDiversModel {

  // constructeur sans paramètre
  public FormDiversModel() {
  }
  
  // champs
  private String email;
  private String url1 ;
  private String chaine;

    // raz modèle
  public void clearModel() {
    email = null;
    url1 = null;
    chaine = null;
  }

  // getters et setters
   ...
}

XV-G. La validation du modèle

La validation du modèle est contrôlée par deux fichiers : [FormDivers-validation.xml] et [FormDiversModel-validation.xml].

Le fichier [FormDivers-validation.xml] délègue les validations au fichier [FormDiversModel-validation.xml] suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/exemple-10/example/xwork-validator-1.0.2.dtd">

<validators>
  <field name="model" >
    <field-validator type="visitor">
      <param name="appendPrefix">false</param>
      <message/>
    </field-validator>
  </field>
</validators>

Nous avons déjà rencontré ce fichier.

Le fichier [FormDateModel-validation.xml] contient les règles de validation suivantes :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/exemple-12/example/xwork-validator-1.0.2.dtd">

<validators>

  <field name="email" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="email.error"/>
    </field-validator>
    <field-validator type="email" short-circuit="true">
      <message key="email.error"/>
    </field-validator>
  </field>

  <field name="url1" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="url.error"/>
    </field-validator>
    <field-validator type="url" short-circuit="true">
      <message key="url.error"/>
    </field-validator>
  </field>

  <field name="chaine" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="chaine.error"/>
    </field-validator>
    <field-validator type="stringlength" short-circuit="true">
      <param name="minLength">5</param>
      <param name="maxLength">5</param>
      <message key="chaine.error"/>
    </field-validator>
  </field>

</validators>
  • lignes 11-18 : vérifient la validité du champ email
  • lignes 15-17 : vérifient que la chaîne email est une adresse électronique valide
  • lignes 20-27 : vérifient la validité du champ url1
  • lignes 24-26 : vérifient que la chaîne url1 est une Url valide
  • lignes 29-38 : vérifient la validité du champ chaine
  • lignes 33-37 : vérifient que la chaîne chaine a 5 caractères exactement.

XV-H. L'action [FormDivers]

L'action [FormDivers] est la suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package example;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;

public class FormDivers extends ActionSupport implements ModelDriven, SessionAware {

  // constructeur sans paramètre
  public FormDivers() {
  }

  // modèle de l'action
  public Object getModel() {
    if (session.get("model") == null) {
      session.put("model", new FormDiversModel());
    }
    return session.get("model");
  }

  @SkipValidation
  public String clearModel() {
    // raz du modèle
    ((FormDiversModel) getModel()).clearModel();
    // résultat
    return INPUT;
  }

  public String cancel() {
    // on nettoie le modèle
    ((FormDiversModel) getModel()).clearModel();
    // résultat
    return "cancel";
  }

  // SessionAware
  Map<String, Object> session;

  public void setSession(Map<String, Object> session) {
    this.session = session;
  }
}

L'action [FormDivers] est bâtie sur le même modèle que les actions étudiées précédemment. Ici, il n'y a simplement pas de méthode validate pour compléter la validation faite par le fichier [FormDiversModel-validation.xml].


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2012 Serge Tahe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.