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 :

DispatchAction et Validator


Sujet :

Struts 1 Java

  1. #1
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut DispatchAction et Validator
    Bonjour,
    J'ai une page avec un seul formulaire mais avec différentes actions possibles (j'utilise setHidden). J'ai également mis en place la validation coté client avec Validator. J'ai un div avec un champs obligatoire qui est d'abord invisible dans un premier temps. Le problème c'est que des que je fais un submit le Validator me jette en me demandant de remplir ce champs obligatoire, hors il n'est pas encore apparue. Comment contourner ce problème ?

  2. #2
    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
    Tu mets validate à false dans le mapping de l'Action et tu fais appel à la validation dans l'Action au bon endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	// Validation du formulaire
    	ActionMessages errors = form.validate(mapping,request);
    	if ( !errors.isEmpty() )
    	{
    		this.saveErrors(request,errors);
    		return mapping.getInputForward() ;
    	}
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Mon validate est déjà à false dans le struts-config, et je ne rentre pas dans ma classe action car la validation se fait en javascript j'utilise le plug-in Validator pour la validation coté client.

  4. #4
    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
    Faire la validation seulement côté client n'est pas très conseillée car dans le cas où le javascript est désactivée dans le navigateur, il n'y aura pas du tout de validation.
    Il est plutôt conseillé d'activer les deux mais bon, à toi de voir.
    Modératrice Java - Struts, Servlets/JSP, ...

  5. #5
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Je ne te comprends plus, tu me dis plus haut qu'il faut que je mette Validate à false, dans ce cas je désactive la validation coté serveur, non ? Et même si je fais les deux validation coté client et coté serveur, de toute façon c'est la validation client en premier je peux donc pas aller jusqu'à ma classe action.

  6. #6
    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
    Si tu mets validate à false, tu désactives effectivement la validation côté serveur.
    Par contre, en appelant le form.validate dans l'Action, tu réactives la validation côté serveur au moment où tu le souhaites.

    Mais tu as raison, comme la validation côté client se fait en premier, la solution que je t'ai donné ne va pas règler ton problème de champ obligatoire qui est invisible à la première soumission.

    Il faudrait pouvoir exécuter le onsubmit="return validateFormBean(this);" seulement une fois que le champ obligatoire apparaît.

    Qu'est-ce qui conditionne l'affichage de ce champ ?
    Peux-tu montrer le code de la jsp ?
    Modératrice Java - Struts, Servlets/JSP, ...

  7. #7
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Voici le code de la JSP :

    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
    48
    49
     
    <html:javascript formName="gabaritForm" />
    	<html:form action="/gabarits" onsubmit="return validateGabaritForm(this)">
    	<html:hidden styleId="hidden" property="hidden" value="default"/>
    		<fieldset>
    			<legend>Gestion des gabarits</legend>
    			<table class="gab">
    				<tr>
    					<td style="text-align:center;width:50%;">
    					<html:submit value="Rechercher un gabarit" onclick="setHidden('rechercher');" />
    					</td>
    					<td style="text-align:center;width:50%;">
    					<html:submit value="Créer un gabarit" onclick="setHidden('creer');" />
    					</td>
    				</tr>
    			</table>
    		</fieldset>
     
    		<logic:equal property="action" value="rechercher" name="gabaritForm">
    			<div id="rechercher">
    				<fieldset>
    					<legend>Rechercher</legend>
    					<table class="gab">
    					</table>
    				</fieldset>
    			</div>
    		</logic:equal>
     
    		<logic:equal property="action" value="creer" name="gabaritForm">
    			<div id="creer">
    				<fieldset>
    					<legend>Créer</legend>
    					<table class="gab">
    						<tr>
    							<td class="gab" style="width:33%">
    								<span>Entrez un numéro de gabarit : </span>
    							</td>
    							<td style="width:33%; text-align:center;">
    							<html:text property="numGab" name="gabaritForm" value="defaut"></html:text>
    							</td>
    							<td style="width:34%">
    							<html:submit value="Créer" onclick="setHidden('creerGabarit');" />
    							</td>
    						</tr>
    					</table>
    				</fieldset>
    			</div>
    		</logic:equal>
    	</html:form>
    C'est la propriété "action" de mon formBean qui conditionne l'affichage de ce champs avec un logic:equal sur la valeur "creer". Le champs tester par Validator est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text property="numGab" name="gabaritForm" value="defaut">

  8. #8
    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
    Mais qu'est-ce qui provoque la modification de la valeur de cette propriété action ?

    Pour info, il vaut mieux éviter de donner le nom action a une propriété du formulaire car action est par défaut un attribut du formulaire qui correspond à l'attribut du tag form.
    Modératrice Java - Struts, Servlets/JSP, ...

  9. #9
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Voici a quoi ressemble la page :

    quand je clique sur le bouton "créer" je suis mappé vers l'action ci-dessous, et c'est la que j'affiche la div avec le champs à tester avec validator.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public ActionForward creer(ActionMapping mapping,
    		ActionForm form, HttpServletRequest req, HttpServletResponse res)
    		throws Exception {
     
    	ActionForward action = null;
    	GestionGabaritForm gabForm = (GestionGabaritForm) form;
    	gabForm.setAction("creer");
    	action = mapping.findForward("succes");
    	return action;
    }

  10. #10
    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
    Dans ce cas, au lieu de coder le "return validateGabaritForm(this);" dans l'attribut onsubmit du tag html:form, essaie de le coder dans l'attribut onclick du html:submit qui permet de valider la saisie de la propriété numGab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <td style="width:33%; text-align:center;">
       <html:text property="numGab" name="gabaritForm" value="defaut"></html:text>
    </td>
    <td style="width:34%">
       <html:submit value="Créer" onclick="setHidden('creerGabarit');return validateGabaritForm(gabaritForm);" />
    </td>
    A tester.

    EDIT : Attention, dans ce cas particulier, il doit falloir passer le nom du form-bean, soit gabaritForm, en paramètre de la fonction validateGabaritForm.
    Modératrice Java - Struts, Servlets/JSP, ...

  11. #11
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    J'ai déjà essayé ça marche pô ! Aucune validation ne s'effectue dans ce cas.
    S'il n'y a pas de solutions, je peux peut-être contourner le problème en créant plusieurs formulaire de même type sur cette page ?

  12. #12
    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
    Dans l'attribut onclick, tu as bien mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return validateGabaritForm(gabaritForm)
    et non ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return validateGabaritForm(this)
    ?
    Modératrice Java - Struts, Servlets/JSP, ...

  13. #13
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    autant pour moi
    Ça marche nickel,

  14. #14
    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
    De rien.

    Je trouvais ça surprenant que ça ne fonctionne pas pour toi étant donné qu'avant de te répondre hier, j'avais fait le test et que ça fonctionnait très bien.
    Modératrice Java - Struts, Servlets/JSP, ...

  15. #15
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Ah bah oui mais non !!!
    Je te refais le topo, qd je clique sur rechercher je fais apparaitre la partie du formulaire qui me permet de faire un submit pour la recherche. Quand je clique sur créer je fait apparaitre la partie du formulaire qui me permet de remplir d'autre champs et de faire aussi un submit. Donc dans les deux cas, je n'utilise qu'un formulaire et donc qu'un fichier de validation.
    Ça ne marchera jamais mon histoire il va falloir que je créé deux pages indépendantes ou tout du moins deux formulaires indépendants. J'aurai du m'en douté plus tôt, erreur de jeunesse.

  16. #16
    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
    Mais en codant le "return validateGabaritForm(gabaritForm);" seulement dans l'attribut onclick du html:submit pour exécuter la méthode creerGabarit, la validation ne s'exécute que lorsque tu cliques sur ce bouton.

    Ce n'est pas ça que tu voulais faire ???
    Modératrice Java - Struts, Servlets/JSP, ...

  17. #17
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Si mais il me faut aussi une validation donc un return validateGabaritForm(gabaritForm);" dans l'attribut onclick du html:submit pour appeler la méthode rechercherGabarit.

  18. #18
    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
    Dans ce cas, il y aurait peut-être une solution en gardant le même form-bean mais en utilisant une ValidatorActionForm à la place d'une ValidatorForm et une MappingDispatchAction à la place d'une DispatchAction.

    En effet, quand tu utilises une ValidatorActionForm, le nom du form spécifié dans la balise form du fichier validation.xml doit correspondre au path de l'Action spécifié dans l'attribut path de la balise action du struts-config.xml.
    Dans ce cas, la validation est spécifique à chaque action.

    Et dans le cas d'une MappingDispatchAction, tu définis plusieurs path dans le struts-config.xml pour une même Action :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action path="/rechercher" type="nomDuPackage.TaMappingDispatchAction" name="gabaritForm" parameter="rechercher" ...></action>
    <action path="/creer" type="nomDuPackage.TaMappingDispatchAction"  name="gabaritForm" parameter="creer"...></action>
    <action path="/creerGabarits" type="nomDuPackage.TaMappingDispatchAction" name="gabaritForm"  parameter="creerGabarits"...></action>
    Tu pourrais ainsi définir autant de validations dans le fichier validation.xml que de path qui pointe sur la MappingDispatchAction.

    Et dans la MappingDispatchAction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class TaMappingDispatchAction extends MappingDispatchAction
    {
       public ActionForward rechercher(ActionMapping mapping, …) throws Exception {}
       public ActionForward creer(ActionMapping mapping, …) throws Exception {}
       public ActionForward creerGabarits(ActionMapping mapping, …) throws Exception {}
    }
    Et enfin dans la jsp, il faut modifier le path de l'Action en fonction du bouton sur lequel on clique :
    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
    <script>
       function setAction(path)
       {
     	document.forms[0].action=path;
       }
    </script>
    ...
     
    <html:form action="/rechercher" onsubmit="return validateGabaritForm(this);">
    	...	
    	<html:submit onclick="setAction('rechercher')">rechercher</html:submit>
    	<html:submit onclick="setAction('creer')">creer</html:submit>
    	<html:submit onclick="setAction('creerGabarits')">creerGabarits</html:submit>
    	...
    </html:form>
    sans oublier que la classe GabaritForm doit hériter de ValidatorActionForm.

    A tester.
    Modératrice Java - Struts, Servlets/JSP, ...

  19. #19
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Merci pour cette info je pense que ça peut être LA solution, mais je viens juste de voir ta réponse et du coup je suis parti sur une solution à Form multiple. Mais je le garde sous le coude pour plus tard, ça me servira sûrement.

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

Discussions similaires

  1. conflit Validator + DispatchAction
    Par yozine dans le forum Struts 1
    Réponses: 6
    Dernier message: 12/09/2009, 18h14
  2. dispatchAction et Validator
    Par khaoula_14_05 dans le forum Struts 1
    Réponses: 1
    Dernier message: 04/11/2008, 20h38
  3. DispatchAction et Validator
    Par jems dans le forum Struts 1
    Réponses: 5
    Dernier message: 22/05/2008, 18h31
  4. Réponses: 1
    Dernier message: 27/09/2007, 20h36
  5. probleme validator et DispatchAction
    Par khaledirb7 dans le forum Struts 1
    Réponses: 10
    Dernier message: 11/08/2007, 02h00

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