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 :

[Validator] utilisation du "validwhen" ? [FAQ]


Sujet :

Struts 1 Java

  1. #21
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Heu ... nan tu n'as pas besoin de vacances !

    Effectivement, il faut bien que ces propriétés commencent toutes par une minuscule, mais mes variables commencent toutes par le nom du projet ... confidentiel ... pour lequel ce code est destiné, donc c'est pour ça que j'ai du renommer toutes mes données en "X..." !

    Désolé !


    Sinon :
    Citation Envoyé par c_nvy
    Peux-tu faire un test en modifiant l'attribut input dans le mapping de ton Action comme ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<action
    			name="formChoixX"
    			path="/FormChoixX"
    			scope="session"
    			validate="true"
    			input="/vues/choixX.jsp"
    			type="com.mycompany.myproject.ChoixXAction"
    		>
    		<forward name="succes" path="/vues/choixX.jsp"/>
    		<forward name="echec" path="/vues/choixX.jsp"/>
    	</action>
    J'ai l'impression qu'il y a du mieux, mais je n'arrive pas à faire mon contrôle, car je me suis rendu compte que je suis obligé de faire un contrôle qui est triple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((XSav1 == null) and (XSav2 == null)) or (*this* != null))
    J'ai cru lire quelque part que c'était impossible, non ?

  2. #22
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Citation Envoyé par ghohm
    J'ai cru lire quelque part que c'était impossible, non ?
    http://struts.apache.org/1.2.4/userG...validator.html

    http://struts.apache.org/1.3.8/faqs/validator.html

    Designing Complex Validations with validwhen:

    [...]

    A few quick notes on the grammer.
    • All comparisons must be enclosed in parens.
    • Only two items may be joined with and or or
    • If both items to be compared are convertable to ints, a numeric comparison is done, otherwise a string comparison is done.

  3. #23
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Struts fonctionne bien si et seulement si tu respectes les conventions de nommage Java.

    Si tu ne renommes pas les propriétés comme je te l'ai indiqué précédemment, les getters et setters ne seront jamais appelés et la validation ne se fera pas.

    Fais le test et tu verras.

    Bon, désolée mais je vais t'abandonner parce qu'il fait beau et comme je suis déjà en week-end , je vais aller me ballader dans Paname.
    Tiens-moi au courant quand même.

    @ + peut-être.

  4. #24
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Excuse moi d'insister mais je crois que l'on ne s'est pas bien compris.

    Je connais les conventions de nommage et je les respecte. J'ai simplement mis un "X" pour masquer le nom réel de mes variables et autres méthodes, car ils contiennent tous le nom CONFIDENTIEL du projet pour lequel ce code est destiné !

    J'édite tous mes posts et je mets un "x" minuscule si tu préfères, mais de mon côté ... n'ayant pas ce "X", ni même un "x", mais le nom du projet en minuscule : "blablaSav1", "getBlablaSav1", etc ... mon problème ne vient donc pas de là !

  5. #25
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Citation Envoyé par ghohm
    Excuse moi d'insister mais je crois que l'on ne s'est pas bien compris.
    Autant pour moi. Je n'avais effectivement pas compris.

    Il y avait plusieurs choses qui clochait. Il me semble qu'on les a toutes corrigées. Je ne vois donc toujours pas ce qui cloche.

    J'ai pourtant fait un test de validwhen chez moi sur deux variables et ça fonctionne très bien.
    Tu n'as vraiment aucun message qui s'affiche dans la jsp et aucun message d'erreur dans la console ou la log du serveur ?

  6. #26
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Non, je n'ai rien dans les logs du serveur, car ça fonctionne ... mais seulement en comparant 2 champs, pas avec plus.

    C'est apparemment une limitation de cet outil !

  7. #27
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Avec le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((XSav1 == null) and (XSav2 == null)) or (*this* != null))
    cela signifie qu'il n'y aura pas d'erreur de validation à partir du moment où le champ *this* n'est pas null, ou dans le cas où XSav1 et XSav2 sont null.
    Donc, si aucun des champs n'est renseigné, il n'y a pas d'erreur de validation.
    Je ne pense pas que ce soit ce que tu souhaites.

    EDIT : peux-tu préciser quelle règle de validation tu veux appliquer ?

  8. #28
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Effectivement ce n'est pas ce que je veux ... mais à force d'essayer on finit par faire n'importe quoi !
    Citation Envoyé par c_nvy
    EDIT : peux-tu préciser quelle règle de validation tu veux appliquer ?
    J'ai 4 champs au sein d'un même formulaire (je ne peux pas diviser l'IHM en 2 ...), ils fonctionnent par paire, donc l'utilisateur doit compléter les 2 premiers, soit les 2 autres.

    Si le formulaire est validé avec les 4 champs à vide ou uniquement avec 1 seul champ, alors ça doit générer une erreur comme quoi la saisie est incomplète.

    Je pense donc que ce type de contrôle est impossible à mettre en oeuvre via un "simple" validwhen.

    Le seul moyen est de redéfinir la méthode validate dans mon ActionForm comme cela est dit dans la FAQ, non ?

  9. #29
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Effectivement, je ne pense pas que cette validation soit possible avec le validwhen.

    Tu as donc le choix entre redéfinir la méthode validate comme indiqué dans la FAQ ou créer ton propre validator.

  10. #30
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Si ca dérange personne ... je vais ouvrir un nouveau post pour ... redéfinir la méthode validate !

    Merci pour tout c_nvy !

  11. #31
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Citation Envoyé par ghohm
    Si ca dérange personne ... je vais ouvrir un nouveau post pour ... redéfinir la méthode validate !
    Bonne idée.
    Citation Envoyé par ghohm
    Merci pour tout c_nvy !
    De rien.

  12. #32
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Voici une solution à ton problème en créant ton propre validator.

    Tu crées la classe suivante :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package tonPackage ;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.apache.commons.validator.Field;
    import org.apache.commons.validator.ValidatorAction;
    import org.apache.commons.validator.util.ValidatorUtils;
    import org.apache.struts.action.ActionMessages;
    import org.apache.struts.validator.Resources;
     
    public class ValidMultiFields
    {
    	public static boolean validateMultiFields(Object bean,ValidatorAction validatorAction,Field field,ActionMessages errors,HttpServletRequest request)
    	{
    		boolean isValid = true;
    		// Récupération des valeurs des champs du formulaire
    		String field4 = ValidatorUtils.getValueAsString(bean, field.getProperty());
    		String field1 = ValidatorUtils.getValueAsString(bean, "XFab1");
    		String field2 = ValidatorUtils.getValueAsString(bean, "XFab2");
    		String field3 = ValidatorUtils.getValueAsString(bean, "XSav1");
    		// Règles de validation
    		if 	( 	(field1 != null && field1.length() != 0 )
    			& 	(field2 != null && field2.length() != 0 )
    			&	(field3 == null || field3.length() == 0 )
    			&	(field4 == null || field4.length() == 0 )
    			)
    		{
    			isValid=true;
    		}
    		else if	( 	(field3 != null && field3.length() != 0 )
    			& 	(field4 != null && field4.length() != 0 )
    			&	(field1 == null || field1.length() == 0 )
    			&	(field2 == null || field2.length() == 0 )
    			)
    		{
    			isValid=true ;
    		}
    		else
    		{
    			// Erreur de validation
    			isValid=false;
    			validatorAction.setMsg("errors.validMultiFields");
    			errors.add("XSav2", Resources.getActionMessage(request, validatorAction, field));
    		}
    		return isValid;
    	}
    }
    Dans le fichier properties, tu ajoutes une clé, celle que j'ai appelé errors.validMultiFields, avec le libellé que tu souhaites voir apparaître dans la jsp en cas d'erreur de validation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    errors.validMultiFields=erreur de validation
    Tu crées un fichier myValidator-rules.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
    <!DOCTYPE form-validation PUBLIC
              "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
              "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
    <form-validation>
     
       <global>
          <validator name="validMultiFields"
                classname="tonPackage.ValidMultiFields"
                   method="validateMultiFields"
             methodParams="java.lang.Object,
                           org.apache.commons.validator.ValidatorAction,
                           org.apache.commons.validator.Field,
                           org.apache.struts.action.ActionMessages,
                           javax.servlet.http.HttpServletRequest"
                      msg="errors.validMultiFields"/>
       </global>
    </form-validation>
    Tu l'ajoutes dans la déclaration du plugin du Validator dans le struts-config.xml :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    	<set-property property="pathnames"
    		 value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml,/WEB-INF/myValidator-rules.xml"/>	
    </plug-in>
    Tu ajoutes le validMultiFields sur le champ XSav2 dans 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
    <field property="XSav2" depends="integer,mask,minlength,validMultiFields">
    		<arg position="0" key="error.XSav2" />
    		<arg position="1" key="error.XSav2.mini" />
    		<var>
    			<var-name>mask</var-name>
    			<var-value>^[1-9][0-9]{5}$</var-value>
    		</var>
    		<var>
    			<var-name>minlength</var-name>
    			<var-value>6</var-value>
    		</var>
    </field>
    En espérant n'avoir rien oublié.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2006, 18h00

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