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 1] : collection vide suite à la soumission d'un formulaire


Sujet :

Struts 1 Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [Struts 1] : collection vide suite à la soumission d'un formulaire
    Bonjour,

    Je suis sur une application Struts 1
    Je fais deux actions :
    - Une recherche qui ramène une collection non vide "myCollection".
    - je lance une deuxième action qui fait "soumettre" le formulaire. Je récupère les champs de mon formulaire, mais je n'ai plus les éléments de ma collection "myCollection", elle est "null".

    Voici le code.

    Merci d'avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action path="/myAction"
    		type="fr.MyClassAction"
    		parameter="method"
    		scope="request"
    		validate="false"
    		name="myForm">
    	<forward name="recherche"
    		path="/WEB-INF/jsp/myPage.jsp" contextRelative="true" redirect="false"/>
    </action>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form-bean name="myForm" type="org.apache.struts.validator.DynaValidatorForm">
    	<form-property name="myCollection" type="java.util.List" />
    </form-bean>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <html:form styleId="myForm" action="myAction.do?method=myMethod">
    	<logic:iterate name="myForm" property="myCollection" id="elt" indexId="index">
    		<tr>
    			<td><html:text name="elt" property="date" /></td>
    			<td>
    				<html:text name="elt" property="commentaire" />
    			</td>
    		</tr>
    	</logic:iterate>
    </html:form>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public ActionForward myMethod(ActionMapping pMapping, ActionForm form,
                    HttpServletRequest pRequest, HttpServletResponse pResponse)
                throws Exception {
            // en mode debug, myCollection dans dynaform est null. Alors que les autres champs sont bien renseigné
            DynaValidatorForm dynaForm = (DynaValidatorForm) form;
     
            String autreChamp = String.valueOf(dynaForm.get("autreChamp"));
     
            // list est null
            List list = (List) dynaForm.get("myCollection");
     
    }

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Evidemment, avant de poster ma question, j'ai cherché dans les forums et j'ai essayé nested comme solution. Mais la liste est toujours NULL et je me trouve dans une impasse
    Si besoin de plus d'infos, je suis dispo.

  3. #3
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    mai 2020
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : mai 2020
    Messages : 321
    Points : 431
    Points
    431
    Par défaut
    Je n'ai pas fait beaucoup de Struts et ça remonte à longtemps.

    Mais, il me semble que myCollection n'est pas un paramètre/input de votre formulaire. Vous ne faites que l'afficher.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gervais.b Voir le message
    Je n'ai pas fait beaucoup de Struts et ça remonte à longtemps.

    Mais, il me semble que myCollection n'est pas un paramètre/input de votre formulaire. Vous ne faites que l'afficher.
    Il y a des champs de la collection qui sont des inputs. Je ne sais pas ce qu'il faut faire pour rendre la collection paramètre/input du formulaire !!

  5. #5
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    mai 2020
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : mai 2020
    Messages : 321
    Points : 431
    Points
    431
    Par défaut
    Est-ce que vous pourriez nous donner le code HTML généré par struts pour le formulaire ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Voici un extrait du code HTML généré :
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="fr-FR" xml:lang="fr-FR">
     
    <head>
    	<title>[V100] - Mon projet</title>
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Pragma" content="no-cache"/>
        <meta http-equiv="Cache-Control" content="no-cache"/>
        <meta http-equiv="Expires" content="0"/>
    	<script language="JavaScript" type="text/javascript" charset="ISO-8859-1">	
    		// <![CDATA[	
    	</script>
    </head>
    <body>    
     
    	<form name="myForm" method="post" action="/myAction.do?method=print" id="myForm">
    		<table border="1" style="width:%;">
    			<tr>
    				<td class="">Tranche</td>
    				<td>
    					<select name="tranche"><option value=""></option>
    						<option value="val1">VAL1</option>
    						<option value="val2">VAL2</option>
    					</select>
    				</td>  
    				<td style="width:120px;" class="">Date de fin</td>
    				<td style="width:150px;"><input type="text" name="dateAu" maxlength="20" size="20" value="31/03/2022" id="idDateAu" /></td>
    			</tr>
    		</table>                                    
    	</form>
     
    </body>
    </html>
    Mais aucune trace de ma collection "myCollection" dans le code généré !
    Pourtant lorsque je lance la recherche, je récupère la liste et je l'affiche avec l'itérator (indiqué dans le code plus haut) !!
    Ce serait une bonne piste de savoir la cause de l'absence de la collection dans le code html généré.

    Que faut-il faire pour soumettre la collection et l'attacher au formulaire ?

  7. #7
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    mai 2020
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : mai 2020
    Messages : 321
    Points : 431
    Points
    431
    Par défaut
    Je suppose que le code HTML correspond au troisième extrait de votre question initiale.. Je dirais qui si la collection est vide, il n'y a rien sur lequel itérer et, donc, rien dans le HTML.

    Pour plus de clarté, est-ce que vous pourriez nous mettre en séquence,

    + pour la recherche: les extraits du template, du code de l'action et son implémentation (le code java), et le HTML génèré
    + la redirection vers la deuxième action

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gervais.b Voir le message
    Je suppose que le code HTML correspond au troisième extrait de votre question initiale.. Je dirais qui si la collection est vide, il n'y a rien sur lequel itérer et, donc, rien dans le HTML.

    Pour plus de clarté, est-ce que vous pourriez nous mettre en séquence,

    + pour la recherche: les extraits du template, du code de l'action et son implémentation (le code java), et le HTML génèré
    + la redirection vers la deuxième action
    myCollection est une liste d'objet "Tranche", et finalement je trouve la liste dans le code source sous forme d'un tableau exemple "Tranche[0].date".
    dans la template, on a deux action :
    - rechercher : lanche la recherche et on obtient une collection non vide myCollecion
    - print : on arrive dans la méthode mais la collection est null

    Le code du template :
    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
     
    <script type="text/javascript">
     
                function print() {
                    var form = document.forms[0];
                    form.action = '/sPrint.do';
                    form.method = "post";
                    form.submit();
                }
                function rechercher() {
                    var form = document.forms[0];
                    form.action = '/sRechercher.do';
                    form.method = "post";
                    form.submit();
                }
    </script>
     
     
    <html:form styleId="myForm" action="myAction.do?method=myMethod">
    	<logic:iterate name="myForm" property="myCollection" id="elt" indexId="index">
    		<tr>
    			<td><html:text name="elt" property="date" /></td>
    			<td>
    				<html:text name="elt" property="commentaire" />
    			</td>
    		</tr>
    	</logic:iterate>
     
    	<a href="javascript:rechercher();"><img src="/images/btn_rechercher.gif" /></a>
     
    	<a href="javascript:print();"><img src="/images/btn_lancer.gif" /></a>
    </html:form>
    Voici html généré :
    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
     
    <head>
    	<title>[V100] - Mon projet</title>
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Pragma" content="no-cache"/>
        <meta http-equiv="Cache-Control" content="no-cache"/>
        <meta http-equiv="Expires" content="0"/>
    	<script language="JavaScript" type="text/javascript" charset="ISO-8859-1">	
     
    		function rechercher() {
    			var form = document.forms[0];
    			form.action = '/sRechercher.do';
    			form.method = "post";
    			form.submit();
    		}	
    		 function print() {
    			var form = document.forms[0];
    			form.action = '/sPrint.do';
    			form.method = "post";
    			form.submit();
    		}
    	</script>
    </head>
    <body>    
     
    	<form name="myForm" method="post" action="/myAction.do?method=print" id="myForm">
    		<table border="1" style="width:%;">
    			<tr>
    				<td class="">Tranche</td>
    				<td>
    					<select name="tranche"><option value=""></option>
    						<option value="val1">VAL1</option>
    						<option value="val2">VAL2</option>
    					</select>
    				</td>
    				<td>
    					 <table>
    						<tr>
    							<td><input type="text" name="Tranche[0].date" value="11/03/22 16:00" /></td>
    							<td>
    								<input type="text" name="Tranche[0].cmt" value="INJECTION" />
    							</td>
    						</tr>
     
    						<tr>
    							<td><input type="text" name="Tranche[1].date" value="11/03/22 22:15" /></td>
    							<td>
    								<input type="text" name="Tranche[1].cmt" value="CHARGE" />
    							</td>
    						</tr>
    					</table>																																
    				</td>
    				<td>
    					<a id="boutonRechercher" href="javascript:rechercher();"><img src="/images/btn_rechercher.gif" /></a>
    				</td>
     
    				<td style="width:120px;" class="">Date de fin</td>
    				<td style="width:150px;"><input type="text" name="dateAu" maxlength="20" size="20" value="31/03/2022" id="idDateAu" /></td>
     
    				<td>
    					  <a href="javascript:print();"><img src="/images/btn_lancer.gif" /></a>
    				</td>
    			</tr>
    		</table>                                    
    	</form>
     
    </body>
    </html>
    Le code de l'action et des deux meth. rechercher et print :
    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
     
    public ActionForward rechercher(ActionMapping pMapping, ActionForm form,
                                   HttpServletRequest pRequest, HttpServletResponse pResponse)
    		throws Exception {
     
    	DynaValidatorForm dynaForm = (DynaValidatorForm) form;
     
    	// myCollection n'est pas nulle et contient une liste d'élément
    	List<Tranche> myCollection = getCollection();
     
    	// je renseigne la collection dans form, ce qui s'affiche avec logic:iterate
    	dynaForm.set("myCollection", trancheList);
     
    	return pMapping.findForward("rechercher");
    }
     
     
    public ActionForward print(ActionMapping pMapping, ActionForm form,
    			HttpServletRequest pRequest, HttpServletResponse pResponse)
    		throws Exception {
     
    	DynaValidatorForm dynaForm = (DynaValidatorForm) form;
     
    	// ici, la collection est nulle
    	List myCollection = (List) dynaForm.get("myCollection");
     
    	// Suite d'actions où j'ai besoin de la myCollection, mais elle est toujouts nulle
     
    	return null;
    }
    Et finalement la redirection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <action path="/sRechercher" forward="/myAction.do?method=rechercher" validate="false" name="myForm"/>
    <action path="/sPrint" forward="/myAction.do?method=print" validate="false" name="myForm"/>

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 298
    Points : 9 509
    Points
    9 509
    Billets dans le blog
    1
    Par défaut
    Je suis over rouillé en Struts 1 mais bon, il y a un truc qui me parait douteux (ou alors je n'ai pas compris).

    Ce que je comprends :


    1. Tu appelles la méthode de recherche qui récupère une liste de Tranche et tu affiches (j'imagine) la liste dans une page.
    2. De là, tu appelles la méthode d'impression pour imprimer la liste récupérée en 1.


    Sauf que le scope de myAction est "request", du coup, les données n'existent plus dans ton formulaire lors de ta demande d'impression.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Je suis over rouillé en Struts 1 mais bon, il y a un truc qui me parait douteux (ou alors je n'ai pas compris).

    Ce que je comprends :


    1. Tu appelles la méthode de recherche qui récupère une liste de Tranche et tu affiches (j'imagine) la liste dans une page.
    2. De là, tu appelles la méthode d'impression pour imprimer la liste récupérée en 1.


    Sauf que le scope de myAction est "request", du coup, les données n'existent plus dans ton formulaire lors de ta demande d'impression.
    Merci pour votre réponse.

    Effectivement, changer le scope de request à session permet d'avoir la liste complète lors de l'impression.
    Mais, cela crée deux problèmes dans mon cas :
    - j'ai des checkbox, si je change l'état par défaut (checké => unchecker), lors du lancement de la recherche la checkbox garde (revient) à l'état initial (en request, le comportement est bon).
    - Suite à la recherche, je peux supprimer des éléments de la collection (il y a un bouton de suppression pour chaque élément). Ce qui change le nombre d'éléments retournés par la recherche. Lors de l'impression, je me trouve avec la liste en session complète.

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 298
    Points : 9 509
    Points
    9 509
    Billets dans le blog
    1
    Par défaut
    Dans tous les cas, si dans la page de recherche les éléments sélectionnés ne sont pas transmis au serveur dans un scope qui survit au request/response, l'information sera perdue.
    Vu ce que je comprends du programme, le scope session semble le meilleur... mais il y aurait d'autres solutions bien sûr qui fonctionnerait avec request.

    Ce qu'il faudrait faire en gardant le scope session et donc les éléments déjà extraits :

    - ajouter un boolean dans le bean représentant l'élément de la liste
    - dans la page, lorsqu'on coche ou décoche la ligne il faut mettre ce boolean à la valeur correspondante dans la liste côté serveur
    - dans l'impression (ou autre traitement), on ne prend en compte que les éléments dont le boolean est true

    J'espère avoir été assez clair
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    septembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2023
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci, c'est très clair. Je vais implémenter la solution.
    Reste le mauvais comportement des checkbox. J'ai des radiobox qui se comportent bien que ce soit avec request ou session, mais les checkbox gardent l'état initial avec le scope session ! ce qui est un comportement bizarre. Alors qu'avec le scope request tout est ok !

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 298
    Points : 9 509
    Points
    9 509
    Billets dans le blog
    1
    Par défaut
    J'imagine que ton problème est lié au fait qu'une checkbox n'envoie de donnée que quand elle est cochée (rien décochée).

    C'est comme ça que ça fonctionne mais ce n'est pas forcément gênant.
    Par exemple, si dans ta page tu as quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        <form>
            <input type="checkbox" name="cb" value="0"/> Valeur 1<br/>
            <input type="checkbox" name="cb" value="1"/> Valeur 2<br/>
            <input type="checkbox" name="cb" value="2"/> Valeur 3<br/>
            <input type="checkbox" name="cb" value="3"/> Valeur 4<br/>
     
            <input type="submit" value="Envoyer">
        </form>
    où value représenterait l'index de l'élément dans la liste.
    On peut donc côté serveur faire un request.getParameterValues("cb") pour récupérer ces identifiants et récupérer dans la liste le bean correspondant par sa position.

    Dans l'exemple, si tu cochais la checkbox 1 et 3, tu récupérerais donc les index 0 et 2, ce qui te permettrait de récupérer les bean par list.get(idx).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<BeanClass> maListeDesBeans = ... // liste construite au préalable pour l'affichage de la page de sélection
     
    for (String index : request.getParameterValues("cb"))
    {
       BeanClass monBean = maListeDesBeans.get(Integer.valueOf(index));
       ...
       // on fait un traitement ici sur un élément sélectionné
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2015, 08h22
  2. [STRUTS] Jsp -> Collection DynaActionForm
    Par zphemg dans le forum Struts 1
    Réponses: 2
    Dernier message: 16/04/2008, 17h01
  3. [STRUTS/TAGS/COLLECTIONS] affichage d une liste
    Par hinanui dans le forum Struts 1
    Réponses: 22
    Dernier message: 04/07/2005, 14h03
  4. [STRUTS][LOGIC][COLLECTION]
    Par pi2r dans le forum Struts 1
    Réponses: 5
    Dernier message: 13/12/2004, 19h39
  5. [struts][tomcat]erreur 404 suite à un forward
    Par minique dans le forum Struts 1
    Réponses: 3
    Dernier message: 06/09/2004, 10h11

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