IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

Struts - plugin Validator


Sujet :

Struts 1 Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut Struts - plugin Validator
    Bonjour à tous,

    J'ai fait fonctionné une application basée sur Struts avec une validation des données coté serveur par la methode validate() de ExempleForm.
    Je suis en train de regarder pour effectuer un controle de surface coté client avec le plugin Validator.
    Comment gère t-on le problème de la première connexion avec Validator? Avant j'utilisais un attribut caché dans le formulaire et je vérifais la présence de cet attrbut dans le validate(). Mais maintenant que la gestion des erreurs est effectuée par la classe DynValidatorForm, l'application me redirige directement vers la page d'erreur sans passer par le formulaire.

    Merci pour votre aide

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 139
    Points : 86
    Points
    86
    Par défaut
    je n'est pas trop compris ce que tu voulais faire.

    Si tu veut controler les donnée d'un formulaire avec un validator, tu dois tout d'abord créer ton validator (class java).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public final class PasswordCheck {
     
    	private PasswordCheck(){
    	/**
            * Utility classes should not have a public or default constructor.
            */
    	}
     
    	public static boolean PassOK(Object bean, Field field,
    			ActionMessages messages, HttpServletRequest request) {
     
     
    		if ()
    		{
                            ........
    			return false;
    		}
     
    		return true;
    	}
    }
    Ensuite dans le fichier validation.xml tu declare le formulaire sur lequel tu veut effectuer le controle et le champ concerné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form name="AdminEditForm">
            <field property="password1" depends="passvalide">
            	<arg key="admin.detail.pass"/>
            </field>
    et dans le fichier validator-rules.xml tu declare ton validator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <validator name="passvalide"
    	msg="errors.passvalide"
            classname="com.monappli.PasswordCheck"
            method="PassOK"
            methodParams="java.lang.Object,
            org.apache.commons.validator.Field,
            org.apache.struts.action.ActionMessages,
            javax.servlet.http.HttpServletRequest"/>
    voila, tu doit également preciser dans struts-config que tu active le validator sur ton action avec le validate = true:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     <action path="/adminEditValid"
           	type="com.darty.redbox.action.administration.AdminValidAction"
           	name="AdminEditForm"
           	input="/adminEdit.do"
           	scope="request"
           	validate="true">
        <forward name="success" path="/administrationForward.do"></forward>	
     </action>
    Voila je sais pas si ça repond a ta question...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Je ne suis pas sûr d'avoir compris ton problème non plus, mais je vais donner une réponse qui, je l'espère, t'aidera. Je suppose que tu connais un peu l'usage du plugin Validator, mais si tu as des questions sur pourquoi on ajoute ceci ou cela, n'hésite pas.

    Pour créer un Formulaire Dynamique avec Validator

    0) Mettons le plugin en place :
    Dans le fichier struts-config.xml, ajoute :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    <message-resources parameter="MessageResources"/>
     
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
      <set-property property="pathnames"
        value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" />
    </plug-in>
    ...

    1) Commençons par créer le formulaire dynamique :
    Dans le fichier struts-config.xml, ajoute :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    <form-beans>
     
      <form-bean name="monFormulaire" type="org.apache.struts.validator.DynaValidatorForm">
        <form-property name="firstname" type="java.lang.String" initial="" />
        <form-property name="lastname" type="java.lang.String" initial="" />
      </form-bean>
     
    </form-beans>
    ...

    J'ai donc un formulaire qui s'appelle monFormulaire, avec 2 éléments : firstname et lastname.

    On cherche maintenant à mettre des contraintes sur ces 2 données.

    Dans le fichier validator.xml, ajoute :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <form-validation>
     
      <global>
      </global>
     
      <formset>
     
        <form name="monFormulaire">
          <field property="firstname" depends="required">
            <arg key="form.firstname" />
          </field>
          <field property="lastname" depends="required">
            <arg key="form.lastname" />
          </field>
        </form>
     
      </formset>
     
    </form-validation>

    Ca déclare un formulaire du nom de monFormulaire, en spécifiant que firstname et lastname sont des attributs requis. Cette contrainte (required) est rattachée à la clé errors.required dans le fichier MessageResources.properties.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    errors.required={0} is required.
    Comme tu peux le voir, il y a un paramètre à donner. C'est ce qu'on donne dans le fichier validation.xml dans la balise <arg>. Mais on donne en fait, une clé pour traduire les attributs firstname et lastname.

    Résultat sur le fichier MessageResources.properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    errors.required={0} is required.
    ...
    form.firstname=Prénom
    form.lastname=Nom de famille
    ...
    Et quand tu auras une erreur de validation, ça écrira par exemple : Prénom is required. (c'est pas très esthétique mais l'idée est là )

    ---

    A ce niveau, notre modèle de données est terminé. Il faut interfacer ces données, donc s'occuper de la partie Contrôleur et de la Vue.

    2) Contrôleur et Vue
    Pour le Contrôleur, dans le fichier struts-config.xml, ajoute :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <action path="/formulaire" forward="/mon_formulaire.jsp" />

    Ca dit que l'URL /formulaire.do pointera vers la page JSP qui est à /mon_formulaire.jsp

    La Vue (page JSP) devra avoir en gros ce contenu :
    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ...
    <html:errors />
    ...
    <html:form method="POST" action="/formulaireProcess" onsubmit="return validateMonFormulaire(this)">
      <html:text property="firstname" size="30" />
      <html:text property="firstname" size="30" />
     
      <html:submit />
      <html:reset />
      <html:cancel />
    </html:form>
     
    <html:javascript formName="monFormulaire" />
    ...

    Tu présentes comme tu le veux ton formulaire, avec les 2 champs firstname et lastname. Dans la déclaration du formulaire, tu dois donner l'action qui va traiter les données rentrées dans le formulaire par l'utilisateur (/formulaireProcess ici), et pour qu'il y ait validation, tu dois ajouter onsubmit. Respecte bien le nom de la méthode : validateMonFormulaire(this) parce que ton formulaire s'appelle monFormulaire. Et n'oublie pas de rajouter (moi, je le mets à la fin) le code Javascript pour faire la validation côté client, en précisant encore une fois le nom de ton formulaire.

    ---

    Il faut maintenant s'occuper de l'action (/formulaireProcess) qui va recevoir ce formulaire.
    Dans le fichier struts-config.xml, ajoute :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <action path="/formulaireProcess"
        type="mesformulaires.FormulaireProcess"
        name="monFormulaire"
        cancellable="true" validate="true" input="/formulaire.do"
        scope="request">
      <forward name="cancelled" path="/index.jsp" />
      <forward name="success" path="/formulaireResults.jsp" />
    </action>

    Ca dit :
    - Cette action a pour URL /formulaireProcess.do
    - Elle va faire appel à l'action struts mesformulaires.formulaireProcess.java
    - Elle reçoit un formulaire de "type" monFormulaire
    - Le formulaire est annulable (redirection vers une page d'accueil par ex).
    - Le formulaire doit être validé.
    - En cas d'erreur côté serveur, renvoyer vers une page d'erreur (attribut input). Ce qu'on fait généralement, c'est renvoyer vers la page du formulaire pour que le client puisse modifier les données et corriger sa saisie.

    Dans ta classe Java (mesformulaires.FormulaireProcess.java), tout ce que tu as à écrire, c'est :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package mesformulaires;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    public class FormulaireProcess extends Action {
     
      public ActionForward execute(ActionMapping mapping, ActionForm form,
          HttpServletRequest request, HttpServletResponse response)
          throws Exception {
     
        if (isCancelled(request)) {
          return mapping.findForward("cancelled");
        }
     
        ...
        String firstname = request.getParameter("firstname");
        String lastname = request.getParameter("lastname");
        /* fais ce que tu veux avec ces données */
        ...
     
        return mapping.findForward("success");
      }
     
    }

    Et crée ton fichier /formulaireResults.jsp pour présenter les données :
    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <bean:write name="monFormulaire" property="firstname" />
    <bean:write name="monFormulaire" property="lastname" />

    ---

    Résumé des fichiers utilisés :

    /WEB-INF/struts-config.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <struts-config>
      <form-beans>
     
        <form-bean name="monFormulaire" type="org.apache.struts.validator.DynaValidatorForm">
          <form-property name="firstname" type="java.lang.String" initial="" />
          <form-property name="lastname" type="java.lang.String" initial="" />
        </form-bean>
     
      </form-beans>
    ...
      <action-mappings>
     
        <action path="/formulaire" forward="/mon_formulaire.jsp" />
        <action path="/formulaireProcess"
            type="mesformulaires.FormulaireProcess"
            name="monFormulaire"
            cancellable="true" validate="true" input="/formulaire.do"
            scope="request">
          <forward name="cancelled" path="/index.jsp" />
          <forward name="success" path="/formulaireResults.jsp" />
        </action>
     
      </action-mappings>
    ...
      <message-resources parameter="MessageResources"/>
     
      <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
          value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" />
      </plug-in>
    ...
    </struts-config>

    /WEB-INF/validation.xml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <form-validation>
     
      <global>
      </global>
     
      <formset>
     
        <form name="monFormulaire">
          <field property="firstname" depends="required">
            <arg key="form.firstname" />
          </field>
          <field property="lastname" depends="required">
            <arg key="form.lastname" />
          </field>
        </form>
     
      </formset>
     
    </form-validation>

    /formulaire.jsp

    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ...
    <html:errors />
    ...
    <html:form method="POST" action="/formulaireProcess" onsubmit="return validateMonFormulaire(this)">
      <html:text property="firstname" size="30" />
      <html:text property="firstname" size="30" />
     
      <html:submit />
      <html:reset />
      <html:cancel />
    </html:form>
     
    <html:javascript formName="monFormulaire" />
    ...

    /WEB-INF/src/mesformulaires/FormulaireProcess.java

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package mesformulaires;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    public class FormulaireProcess extends Action {
     
      public ActionForward execute(ActionMapping mapping, ActionForm form,
          HttpServletRequest request, HttpServletResponse response)
          throws Exception {
     
        if (isCancelled(request)) {
          return mapping.findForward("cancelled");
        }
     
        ...
        String firstname = request.getParameter("firstname");
        String lastname = request.getParameter("lastname");
        /* fais ce que tu veux avec ces données */
        ...
     
        return mapping.findForward("success");
      }
     
    }

    /formulaireResults.jsp

    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <bean:write name="monFormulaire" property="firstname" />
    <bean:write name="monFormulaire" property="lastname" />

    ---

    Sachant cela, tu peux tout à fait déclarer un attribut dans ton formulaire (dans le fichier struts-config.xml), et le mettre en champs caché dans ton fichier /formulaire.jsp (balise <html:hidden />).

    Désolé, je me suis un peu emporté, je pensais pas écrire autant... ^^;

    piloupy

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup pour ces explications detaillées.
    C'est à peu de choses près ce que j'ai fait.
    En fait mon problème initial venait du fait que lorsque j'appellais l'URL /exemple.do qui est censé m'afficher un formulaire de saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <action path="/exemple"
        		name="valForm"
        		validate="true"
        		input="/error.do"
        		scope="request"
        		parameter="/WEB-INF/jsp/exemple/formulaire1.jsp"
        		type="package.DynExempleAction"
    >
    me renvoyait directement vers la page d'erreur puisque les données étaient vérifiées au niveau de mon ActionForm.On peut s'en sortir avec un autre <action path="/main"> par exemple mais moi je le faisais en passant une variable cachée dans le formulaire. Je vérifais la présence de cette variable pour distinguer le cas ou on avait appuyer sur le boutton submit et le cas ou on avait chargé pour la premiere fois la page. J'espère que je suis clair
    J'utilise en fait toujours cette méthode.

    Maintenant j'essaie de gérer les messages d'erreur. Je n'arrive pas utiliser la balise arg0 dans <formset> au niveau du validation.xml. Je vais essayer avec la balise simple arg.

    Merci pour vos réponses.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Vu la qualité des réponses, je me permet de poser d'autres questions.
    Lorqu'on utilise le plugin Validator comme tu l'as décrit avec la classe DynaValidatorForm, tu effectue un controle des données au niveau du client avec du javascript généré par struts et au niveau du serveur. Ce controle est exactement le meme des 2 cotés puisqu'il est induit par les fichiers validation.xml et validate-rules.xml. Est ce que cette affirmation est juste?
    Si au lieu d'utiliser directement la classe DynaValidatorForm on implémente une classe qui hérite de DynaValidatorForm, et qu'on surcharge la méthode validate(), est ce qu'on peut faire d'autres controles au niveau du serveur? est ce que les controles du plugin Validator sont effectués? (en appellant la methode mere? super.validate() )
    J'espère etre encore assez clair.

    Merci.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Désolé pour le retard de réponse, j'étais occupé avec du boulot.

    Avant tout, juste une remarque : je te conseille de structurer tes actions dans ton fichier struts-config.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <action path="/formulaireProcess"
        type="mesformulaires.FormulaireProcess" parameter="toto"
        name="monFormulaire"
        cancellable="true" validate="true" input="/formulaire.do"
        scope="request">
      <forward name="cancelled" path="/index.jsp" />
      <forward name="success" path="/formulaireResults.jsp" />
    </action>
    La logique, c'est :
    - path : chemin d'accès.
    - type : vers quoi je map ce chemin d'accès ?
    (- parameter : paramètre optionnel pour l'Action)
    - name : après avoir lu le type, je sais que je suis en train de traiter un formulaire, alors j'indique le nom du formulaire.
    - cancellable, validate, input : c'est des "attributs" du formulaire. est-ce que je peux faire cancel ? est-ce qu'on doit valider les données ? vers où je redirige si j'ai des erreurs ?
    - scope : paramètre divers (miscellaneaous) de cette <action>.
    - <forward /> : les forwards pour mon Action.

    C'est juste pour rendre son travail plus lisible suivant ta propre logique de raisonnement.

    Pour te répondre, maintenant :

    Citation Envoyé par alexandre7
    Ce controle est exactement le meme des 2 cotés puisqu'il est induit par les fichiers validation.xml et validate-rules.xml.
    En gros : oui.
    En détail : non.

    Je te prends un exemple : tu as un formulaire qui demande une adresse email. Le code Javascript va tester que la chaîne corresponde à ça :
    xxxx@xxxx.xxxx

    Alors que le serveur va chercher un peu plus loin. Le serveur va refuser cette adresse email par exemple :
    toto@company.dudu

    parce que l'extension de fin (dudu) n'est pas correct. Je sais pas bien quel quels sont les suffixes qu'il vérifie, mais voilà un contre-exemple.

    Comme c'est mineur comme différence, j'ai dit qu'en gros, tu as raison. En détail pour être absolument exact, non

    Pour te répondre après, je n'ai pas encore testé les contrôles avancés côté serveur. La philosophie, c'est de faire les tests de surface côté client (syntaxe), et les tests sémantiques, cohérences, etc. côté serveur (typiquement, des accès à la base de données pour dire des choses du genre : cet utilisateur existe déjà). C'est des tests qu'on ne pourra jamais faire du côté client ça.

    Une bonne solution, ce serait effectivement de faire un héritage de DynaValidatorForm, mais je ne m'y connais plus là.

    J'ai appris les Servlets, JSP, Struts il n'y a pas très longtemps (en février), je débute en fait...

    Et pour les <arg0> <arg1>..., il ne faut plus utiliser ça. Il faut utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <arg key="form.firstname" position="0" />
    Et merci pour les compliments

    piloupy

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse. Je m'y retrouve mieux.
    DynaValidatorForm c'est une classe de struts qu'on utilise a la place de ActionForm pour pouvoir utiliser le Plugin Validator et pour pouvoir utiliser des formulaires dynamiques definis au niveau de struts-config.xml, et donc pour lesquels on a pas besoin de definir de getters et de setters pour chaque attribut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Struts 1.3.8] Utilisation du Plugin Validator ?!
    Par ghohm dans le forum Struts 1
    Réponses: 12
    Dernier message: 30/10/2009, 10h39
  2. probleme avec plugin validator struts
    Par you.baddi dans le forum Struts 1
    Réponses: 4
    Dernier message: 19/03/2009, 15h44
  3. Réponses: 1
    Dernier message: 21/05/2007, 19h57
  4. Plugin Validator pour Struts
    Par k2vin dans le forum Struts 1
    Réponses: 8
    Dernier message: 30/01/2007, 18h02
  5. [ Struts ] pb Validator
    Par voodoo_mg dans le forum Struts 1
    Réponses: 7
    Dernier message: 01/07/2004, 08h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo