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 :

Passer un Vector via un DynaValidatorForm


Sujet :

Struts 1 Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Passer un Vector via un DynaValidatorForm
    Bonjour,

    J'ai un problème avec un DynaValidatorForm que je pré-remplis avant d'afficher mon formulaire : Pour les String pas de problème, tout fonctionne. En revanche j'essaye de passer un Vector dedans , et celui-ci se retrouve à null une fois sur la jsp (j'ai fait pas mal de tests). Comme la doc sur les DynaValidatorForm est presque inexistante, je suis pas mal embêté, peut être que les vectors ne sont pas supporté ?

    mon test coté jsp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:define id="test" property="formules" type="java.util.Vector"/>"
    je me prend une erreur du genre : cannot define null bean "test"

    ma property

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            	<form-property 
            		name="formules" 
            		type="java.util.Vector"/>
    mon action.

    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
    public class IndicateurFormCreateDisplay extends Action  {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException{
    		ApplicationIndicateurQualite AIQ = ApplicationIndicateurQualite.lancermetier();	
    		HttpSession session = req.getSession();
     
    		DynaActionForm formulaire = (DynaActionForm) form;
     
    		session.removeAttribute("dbCIndic");
     
    		if (session.getAttribute("dbCIndic")==null){
    			Vector<ObjectifPolitiqueQualite> opqC = AIQ.getObjectifQualite();
    			Vector<DonneeBase> dbC = AIQ.getDonneeBase();
    			session.setAttribute("dbCIndic", dbC);
    			session.setAttribute("opqCIndic", opqC);
     
    			Formule firstFormule = new Formule();
    			Vector<Formule> formules = new Vector<Formule>();
    			formules.add(firstFormule);
    			formulaire.set("formules", formules);
    		}
    		return mapping.findForward("goform");
    	}
    }
    Bien sûr cela fonctionne parfaitement si je met mon Vector en session. De plus, si je fait dans mon action

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			Formule firstFormule = new Formule();
    			Vector<Formule> formules = new Vector<Formule>();
    			formules.add(firstFormule);
    			formulaire.set("formules", formules);
    formules = (Vector<Formule>)formulaire.get("formules");
    System.out.println(formules.size());
    Je print bien "1". Donc c'est bien une fois sur la jsp que je n'ai plus de parametre.

  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
    En codant ceci dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:define id="test" property="formules" type="java.util.Vector"/>
    tu recherches un objet formules de type Vector dans le scope.

    Or, l'objet qui est dans le scope est le form-bean qui a pour propriété formules.

    Donc, si tu veux faire un bean:define, il faut plutôt coder ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:define id="test" name="nomDuFormBean" property="formules" type="java.util.Vector"/>

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci,

    En fait je suis passé avec une autre solution plus limitante mais plus simple. L'idée sous-jacente était de faire un formulaire dynamique. Comme je suis de nouveau confronté à ce besoin, j'ai recommencé à chercher et je suis tombé sur les indexed properties et cet article : http://www.developer.com/java/ejb/article.php/2233591. J'ai plus qu'a vérifier si ça fonctionne correctement avec les DynaValidatorForm.

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Pour ceux que ça peut intéresser, voici comment j'ai procédé pour faire un DynaValidatorForm dynamique (avec un nombre de champs variables).

    Dans mon cas, j'avais besoin de remplir des valeurs d'objectifs mensuels sur un nombre variable d'année. J'ai donc créé un bean simple de "ObjectifsAnnuels" :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    package com.indicateurs.business.beans;
    public class ObjectifsAnnuels {
    	private String janvier = "0";
    	private String fevrier = "0";
    	private String mars = "0";
    	private String avril = "0";
    	private String mai = "0";
    	private String juin = "0";
    	private String juillet = "0";
    	private String aout = "0";
    	private String septembre = "0";
    	private String octobre = "0";
    	private String novembre = "0";
    	private String decembre = "0";
     
    	private String objAn = "0";
    	private String annee = "0";
     
    	public ObjectifsAnnuels(){}
     
    	public String getJanvier() {
    		return janvier;
    	}
     
    	public void setJanvier(String janvier) {
    		this.janvier = janvier;
    	}
     
    	public String getFevrier() {
    		return fevrier;
    	}
     
    	public void setFevrier(String fevrier) {
    		this.fevrier = fevrier;
    	}
     
    	public String getMars() {
    		return mars;
    	}
     
    	public void setMars(String mars) {
    		this.mars = mars;
    	}
     
    	public String getAvril() {
    		return avril;
    	}
     
    	public void setAvril(String avril) {
    		this.avril = avril;
    	}
     
    	public String getMai() {
    		return mai;
    	}
     
    	public void setMai(String mai) {
    		this.mai = mai;
    	}
     
    	public String getJuin() {
    		return juin;
    	}
     
    	public void setJuin(String juin) {
    		this.juin = juin;
    	}
     
    	public String getJuillet() {
    		return juillet;
    	}
     
    	public void setJuillet(String juillet) {
    		this.juillet = juillet;
    	}
     
    	public String getAout() {
    		return aout;
    	}
     
    	public void setAout(String aout) {
    		this.aout = aout;
    	}
     
    	public String getSeptembre() {
    		return septembre;
    	}
     
    	public void setSeptembre(String septembre) {
    		this.septembre = septembre;
    	}
     
    	public String getOctobre() {
    		return octobre;
    	}
     
    	public void setOctobre(String octobre) {
    		this.octobre = octobre;
    	}
     
    	public String getNovembre() {
    		return novembre;
    	}
     
    	public void setNovembre(String novembre) {
    		this.novembre = novembre;
    	}
     
    	public String getDecembre() {
    		return decembre;
    	}
     
    	public void setDecembre(String decembre) {
    		this.decembre = decembre;
    	}
     
    	public String getObjAn() {
    		return objAn;
    	}
     
    	public void setObjAn(String objAn) {
    		this.objAn = objAn;
    	}
     
    	public String getAnnee() {
    		return annee;
    	}
     
    	public void setAnnee(String annee) {
    		this.annee = annee;
    	}
    }
    Dans mon formulaire intitulé "AFObj" je rajoute le champ suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            	<form-property 
            		name="objs" 
            		type="beans.ObjectifsAnnuels[]"/>
    J'ai ensuite 2 action qui vont utiliser ce formulaire : une qui va le préremplir, et l'autre qui va le valider. L'action de préremplissage est très importante car le tableau d'ObjectifsAnnuels, doit avoir une taille définie. De plus le formulaire doit impérativement être en session (dans les 2 actions), car si il est en request, struts va réinstancier un form-bean par ses propres moyen lors du passage du formulaire à l'action suivante, et ne connaissant pas la taille tableau ObjectifsAnnuels[], il va faire n'importe quoi.

    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
    		<action 
           		path="/objcreateformfill"
           		scope="session"
    			type="actions.display.ObjFormFillDisplay"
    			validate="false"
    			name="AFObj">
    				<forward name="goform" path="/vues/tiles/pages/objcreateform.jsp" />
    		</action>
     
    		<action
    			path="/objcreate"
    			scope="session"
    			type="actions.service.ObjCreateAction"
    			validate="true"
    			input="/vues/tiles/pages/objcreateform.jsp"
    			name="AFObj">
            		<forward name="success" redirect="true" path="/objliste.do"/>
            		<forward name="error" path="/vues/tiles/pages/objcreateform.jsp"/>
            </action>
    Ensuite dans mon formulaire je mets les champs suivants :

    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
    			<table>
    				<tr>
    					<td>Année</td>
    					<td>Obj. An.</td>
    					<td>Janv.</td>
    					<td>Fév.</td>
    					<td>Mars</td>
    					<td>Avril</td>
    					<td>Mai</td>
    					<td>Juin</td>
    					<td>Juil.</td>
    					<td>Août</td>
    					<td>Sept.</td>
    					<td>Oct.</td>
    					<td>Nov.</td>
    					<td>Déc.</td>
    				</tr>
    				<logic:iterate id="annee" name="AFIndicateur" property="objs" indexId="ind" >
    				<tr>
    					<td><bean:write name="AFIndicateur" property="objs[${ind}].annee"/></td>
    					<td><html:checkbox value="1" property="objs[${ind}].objAn"/></td>
    					<td><html:text property="objs[${ind}].janvier" size="2"/></td>
    					<td><html:text property="objs[${ind}].fevrier" size="2"/></td>
    					<td><html:text property="objs[${ind}].mars" size="2"/></td>
    					<td><html:text property="objs[${ind}].avril" size="2"/></td>
    					<td><html:text property="objs[${ind}].mai" size="2"/></td>
    					<td><html:text property="objs[${ind}].juin" size="2"/></td>
    					<td><html:text property="objs[${ind}].juillet" size="2"/></td>
    					<td><html:text property="objs[${ind}].aout" size="2"/></td>
    					<td><html:text property="objs[${ind}].septembre" size="2"/></td>
    					<td><html:text property="objs[${ind}].octobre" size="2"/></td>
    					<td><html:text property="objs[${ind}].novembre" size="2"/></td>
    					<td><html:text property="objs[${ind}].decembre" size="2"/></td>
    				</tr>
    				</logic:iterate>
    			</table>
    en mettant le code suivant dans mon action de péparation (j'instancie un tableau à 2 elements par défaut) :
    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 class ObjFormFillDisplay extends Action  {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException{
    		ApplicationIndicateurQualite AIQ = ApplicationIndicateurQualite.lancermetier();	
    		HttpSession session = req.getSession();
     
    		Vector<Formule> formules=null;
    		Formule formule = null;
     
    		DynaActionForm formulaire = (DynaActionForm) form;
     
    		ObjectifsAnnuels objs[] = new ObjectifsAnnuels[2];
    		for (int i = 0; i < objs.length; i++) {
    			objs[i] = new ObjectifsAnnuels();
    		}
     
    		formulaire.set("objs", objs);
     
    		return mapping.findForward("goform");
    	}
    }
    j'obtient le source suivant pour ma 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <table>
    				<tbody><tr>
    					<td>Année</td>
     
    					<td>Obj. An.</td>
    					<td>Janv.</td>
    					<td>Fév.</td>
    					<td>Mars</td>
    					<td>Avril</td>
    					<td>Mai</td>
     
    					<td>Juin</td>
    					<td>Juil.</td>
    					<td>Août</td>
    					<td>Sept.</td>
    					<td>Oct.</td>
    					<td>Nov.</td>
     
    					<td>Déc.</td>
    				</tr>
     
    				<tr>
    					<td>0</td>
    					<td><input name="objs[0].objAn" value="1" type="checkbox"></td>
    					<td><input name="objs[0].janvier" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].fevrier" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].mars" size="2" value="0" type="text"></td>
     
    					<td><input name="objs[0].avril" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].mai" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].juin" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].juillet" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].aout" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].septembre" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].octobre" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].novembre" size="2" value="0" type="text"></td>
    					<td><input name="objs[0].decembre" size="2" value="0" type="text"></td>
     
    				</tr>
     
    				<tr>
    					<td>0</td>
    					<td><input name="objs[1].objAn" value="1" type="checkbox"></td>
    					<td><input name="objs[1].janvier" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].fevrier" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].mars" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].avril" size="2" value="0" type="text"></td>
     
    					<td><input name="objs[1].mai" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].juin" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].juillet" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].aout" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].septembre" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].octobre" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].novembre" size="2" value="0" type="text"></td>
    					<td><input name="objs[1].decembre" size="2" value="0" type="text"></td>
    				</tr>
     
     
    			</tbody></table>
    voila voila.

  5. #5
    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
    Quel règle de validation as-tu activé ? required ?
    Fonctionne-t'elle correctement ?

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je n'ai pas encore géré le problème de la validation.
    voici les différents tuto sur lesquels je me suis appuyé :

    http://www.developer.com/java/ejb/article.php/2233591
    http://www.bartbusschots.ie/blog/?p=262

    Le second lien évoque la validation mais malheureusement sont array est un simple tableau de string, alors qu'il m'interessait plus de mettre des beans "complexes". Cependant il est possible d'acceder aux attributs dans le validator comme j'ai trouvé ici : http://www.strutskickstart.com/Index...Validation.ppt.

    En gros ça donnerait dans mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <form name="AFObj">
         <field
            property="janvier" 
            indexedListProperty="objs"
            depends="required">
                <arg key="xxxxxxxx">
         </field>
    ...
    </form>

  7. #7
    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
    Il faut effectivement utiliser l'attribut indexedListProperty lorsqu'on veut valider des objets indexés via le Validator.

    Je posais la question parce que je trouvais bizarre que tu donnes une solution d'utilisation d'un DynaValidatorForm sans parler de validation.

Discussions similaires

  1. Faire passer des arguments via window.open()
    Par juanqui dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/02/2007, 20h27
  2. Réponses: 8
    Dernier message: 22/12/2006, 23h36
  3. PHP Passer une variable via une liste deroulante
    Par lepierre dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2006, 13h09
  4. [VB]Passer un paramètre via executable et le récupérer
    Par ironik dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/03/2006, 15h36
  5. Volume de données maximum à passer dans Excel via delphi?
    Par batounet dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/03/2006, 21h37

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