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 :

Probleme formulaire + ActionErrors validate


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Par défaut Probleme formulaire + ActionErrors validate
    Bonjour à tous


    Voila je suis débutant dans le monde de Struts et j'ai un petit souçis que je ne sais comment résoudre pour créer un formulaire faisant appel à des données stockées en base.

    En fait lorsque je clique sur un lien de mon menu principal je dois attérir sur un formulaire qui contient une liste déroulante <option> remplie par des valeurs contenues en base et deux autres champs texte à remplir par l'utilisateur.

    Mon probleme est le suivant : lorsque j'utilise la méthode validate dans mon ActionForm pour tester les entrées utilisateur et que je retourne des erreurs l'ActionForm fait un retour direct à la jsp. Or cette jsp n'est plus en mesure de remplir la liste déroulante car elle ne trouve plus le bean (ce qui est logique car celui est géneré dans l'Action).


    Voila ma classe Action qui est appellé à partir du menu principal de mon appli et qui permet de génerer ma liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class ModifyDrinkAction extends Action {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
     
    		Drinks dao = new Drinks();
    		Collection<Drink> DrinkList = dao.ListDrink();
    		dao.closeDB();
     
    		request.setAttribute("liste", DrinkList);
     
    		return mapping.findForward("modifylist");
    	}
    }

    La page jsp de mon formulaire :

    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
     
    <html:form action="ModifyDrinkSubmit">
     
    	<table width="75%" border="0">
     
    		<tr>
    			<td width="15%"><bean:message key="name" /></td>
    			<td><html:select property="drinkName">
    				<html:options collection="liste" property="drinkName"
    					labelProperty="drinkName" />
    			</html:select></td>
    		<tr>
    		<tr>
    			<td><bean:message key="price" /></td>
    			<td><html:text property="drinkPrice" /></td>
    			<td><html:errors property="price" /></td>
    		</tr>
    		<tr>
    			<td><bean:message key="description" /></td>
    			<td><html:text property="drinkDescription" /></td>
    			<td><html:errors property="description" /></td>
    		</tr>
     
    	</table>
     
    	<p><strong><font size="4"></font></strong></p>
    	<html:submit>
    		<bean:message key="modify_button" />
    	</html:submit>
    </html:form>

    Ma classe ActionForm avec la methode validate :

    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
     
    public class DrinkFormModify extends ActionForm {
    	private static final long serialVersionUID = 1L;
    	String drinkName;
    	String drinkDescription;
    	String drinkPrice;
     
    	public String getDrinkDescription() {
    		return drinkDescription;
    	}
    	public void setDrinkDescription(String drinkDescription) {
    		this.drinkDescription = drinkDescription;
    	}
    	....
     
    	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
     
    		ActionErrors errors = new ActionErrors();
     
    		if(drinkDescription.equals("")){
    			errors.add("description", new ActionMessage("errors.description"));
    		}
     
    		if(drinkPrice.equals("")){
    			errors.add("price", new ActionMessage("errors.priceempty"));
    		}
     
    		try{
    			new Integer(drinkPrice);
    		}
    		catch(NumberFormatException e){
    			errors.add("price", new ActionMessage("errors.price"));
    		}
    		System.out.println("aaaa");
    		return errors;
    	}
    }

    J'ai essayé différentes choses mais rien ne marche, peut etre que l'utilisation du plugin Validator changerai qqchose ?

    Au passage j'utilise Java 1.5 + Struts 1.2

    Si qqun à une idée qu'il ne se prive pas

    Merci d'avance
    Bon week end

  2. #2
    Membre éclairé Avatar de anayathefirst
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 326
    Par défaut
    salut,
    moi aussi je suis débutant, alors je ne sais pas si ma remarque va vraiment t'être util .
    bon, en espérant que ton fichier struts-config.xml soit bien formé et tout et tout, j'ai eu un problème de ce type, et j'ai du mettre comme action pour mon formulaire :au lieu de . ceci dit, c'est pas sûr que ça march pour toi
    sinon, pour la validation, il existe une autre méthode avec des fichier xml, ( http://struts.apache.org/1.2.4/userG...validator.html pour plus de détail) ce qui te permet la réutilisabilité des méthode de validation et des méthodes déjà fourni (verification de validité d'un mail par exemple). mais bon, pour l'instant j'ai des problèmes à le faire marcher
    bon courage,
    +

  3. #3
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Ton probleme vient du faite que comme tu le dis si bien ta liste déroulante est défini dans l'action appelant ta page. Mais que lrosque tu valides ton formulaire et qu'li y a des erreurs il revient sur la page, donc forcement la liste déroulante n'est plus présente.


    Il y a de mon point de vue 2 méthodes.

    Lorsque tu crées ta liste dans ton action, ne pas stocker ta liste en session (un peu sale je trouve)
    Ou peut-etre mieux, que ta liste soit present dans ton bean (formulaire).

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Et bien le plus simple est d'avoir une propriété dans ton ActionForm et de l'initialiser dans le constructeur de la classe.

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonjour,
    d'apres ce que j'ai pu comprendre je pense que ton action struts est defini dans ton struts-config a validate="true", il faudrait que tu mettes validate="false".

    Apres, ca te permetes d'appeler dans ton code Java la methode validate et si il y a une erreur de rappeler ta methode qui recharge ta liste.

    Moi j'utilise les DispatchAction. J'ai tente d'explique ce cas de gestion dans mon projet sur
    http://gestcv.sourceforge.net/fr/arc...re/struts.html

    Angelo

  6. #6
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Par défaut
    Citation Envoyé par OButterlin
    Et bien le plus simple est d'avoir une propriété dans ton ActionForm et de l'initialiser dans le constructeur de la classe.

    A+
    Merci pour vos réponses, j'ai ajouté un constructeur sur mon ActionForm qui initialise une propriété de type collection (résulat de ma requete en base de données).

    Voila ma classe ActionForm :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    public class DrinkFormModify extends ActionForm {
     
    	private static final long serialVersionUID = 1L;
     
    	String drinkName;
    	String drinkDescription;
    	String drinkPrice;
    	Collection<Drink> DrinkList;
     
     
     
    	public DrinkFormModify(){
    		try {
    			Drinks dao = new Drinks();
    			DrinkList = dao.ListDrink();
    			dao.closeDB();
     
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}	
    	}
     
     
    	public String getDrinkDescription() {
    		return drinkDescription;
    	}
    	public void setDrinkDescription(String drinkDescription) {
    		this.drinkDescription = drinkDescription;
    	}
    	public String getDrinkName() {
    		return drinkName;
    	}
    	public void setDrinkName(String drinkName) {
    		this.drinkName = drinkName;
    	}
    	public String getDrinkPrice() {
    		return drinkPrice;
    	}
    	public void setDrinkPrice(String drinkPrice) {
    		this.drinkPrice = drinkPrice;
    	}
     
     
    	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
     
    		ActionErrors errors = new ActionErrors();
     
    		if(drinkDescription.equals("")){
    			errors.add("description", new ActionMessage("errors.description"));
    		}
     
    		if(drinkPrice.equals("")){
    			errors.add("price", new ActionMessage("errors.priceempty"));
    		}
     
    		try{
    			new Integer(drinkPrice);
    		}
    		catch(NumberFormatException e){
    			errors.add("price", new ActionMessage("errors.price"));
    		}
    		return errors;
    	}
    }
    Maintenant mon probleme viens du fait que j'arrive pas à mettre les bons éléments pour remplir mon <html:options> car mon bean liste n'existe plus du coup...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <td><html:select property="drinkName">
    		<html:options collection="liste" property="drinkName"
    			labelProperty="drinkName" />
    </html:select></td>
    Merci pour votre aide

  7. #7
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Par défaut
    Citation Envoyé par azerr
    Bonjour,
    d'apres ce que j'ai pu comprendre je pense que ton action struts est defini dans ton struts-config a validate="true", il faudrait que tu mettes validate="false".

    Apres, ca te permetes d'appeler dans ton code Java la methode validate et si il y a une erreur de rappeler ta methode qui recharge ta liste.

    Moi j'utilise les DispatchAction. J'ai tente d'explique ce cas de gestion dans mon projet sur
    http://gestcv.sourceforge.net/fr/arc...re/struts.html

    Angelo
    Merci, j'ai effectivement regardé du coté des DispatchAction, mon probleme viens du fait que effectivement lorsque la méthode validate me renvoie une erreur je me retrouve directement sur la page jsp sans repasser par ma classe Action.
    J'ai lu ce que tu as fait dans ton projet, cependant d'après ce que j'ai vu tu utilises le plugin validator. Je voudrais éviter si possible de passer le paramètre validate à false et d'appeller moi meme cette méthode par la suite. Peut etre que je me trompe (je suis débutant ) mais je ne trouve pas cela forcement tres propre... à moins qu'il n'y ait une autre solution

  8. #8
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonjour,
    le fait de mettre validate="false" dans la definition de tes actions dans le struts config n'est pas lie au plugin validator. Le plugin validator te permet de definir des regles de validations dans un fichier XML et de les executer lors de l'appel de la methode validate de ton formulaire.

    En gros ca evite de coder tes validation dans la methode validate. En fait pour moi il y a 2 niveaux de validation :
    =>validation simple (champs requis, type (date)....=> ca tu peux le faire avec le plugin validator (mais t'es pas oblige))
    => validation metier, la il faut implementer la methode validate.

    Si tu ne mets pas validate="false" dans ton struts-config, struts va appeler la methode validate avant d'appeler la methode execute (et ca n'a rien avoir avec le plugi validator). Cette solution n'est pas pratique, car des que tu accedes a ta page, il y a une validation qui s'effectue alors que tu veux simplement afficher ta page. En ce qui me conrne je prefere appeler le validate dans l'Action struts, car ca te permet :
    1. de maitriser le declenchement du validate.
    2. de pouvoir appeler une methode qui te regharge ta liste puis qui route vers ta jsp (voir mon explication avec le dispatch display de gestcv)

    Angelo

    Cette methode validate

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

Discussions similaires

  1. [1.x] Probleme dans la validation d'un formulaire
    Par phpiste dans le forum Symfony
    Réponses: 4
    Dernier message: 17/06/2008, 11h23
  2. Réponses: 2
    Dernier message: 06/07/2006, 08h22
  3. [castor][SOAP] Probleme avec la validation du message SOAP
    Par VinceFromBcn dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/09/2005, 14h12
  4. Réponses: 2
    Dernier message: 20/08/2005, 19h23
  5. Problemes formulaires web
    Par mdma64 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/08/2005, 10h09

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