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 :

iterate avec html:radio = problème de name


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut iterate avec html:radio = problème de name
    Salut les gens !

    j'ai un questionnaire : des questions, et des listes de choix pour chaque question.
    1 bean Question
    1 bean QuestionChoices
    Le bean Question, contient 1 List<QuestionChoices> choices.

    donc j'ai une boucle pour afficher les questions, et une boucle pour afficher les réponses possibles (nommées choix).
    tout ça est OK, l'affichage est correct.

    les réponses sont affichés avec un bouton radio.
    et là horreur, ils ont tous les mêmes name : "choices".

    donc pas possible de les diférencier ..

    l'attribut indexed="true" ne résout pas mon prb car du coup chaque premiere reponse le meme name (name = "question[0].choices")

    J'ai du rater qqch, merci de m'aiguiller.


    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
     
    <logic:iterate name="gameForm" id="question" property="questions" indexId="count">
     	<div class="questionFieldName quizz">
     		<bean:write name="count"/> - <bean:write name="question" property="libelle"/>
     	</div>
    	<div class="choicesFieldName quizz">
    		<logic:iterate name="question" id="choice" property="choices" indexId="countRadio" >
    			<label for="radio_<bean:write name='count'/>_<bean:write name='countRadio'/>">
    				<html:radio property="choices" name="question" value="id" idName="question" indexed="true">
    					<bean:write name="choice" property="libelle"/>
    				</html:radio>
    			</label>
    		<br />	
    		</logic:iterate>
    	</div>
    <br />
    </logic:iterate>
    et ici le résultat 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
     
    <div class="questionFieldName quizz">  0 - Question 1 ? </div>
    <div class="choicesFieldName quizz">
    	<label for="radio_0_0">
    	<input type="radio" value="1" name="question[0].choices"/>
    	réponse 1.1
    	</label>
    	<br/>
    	<label for="radio_0_1">
    	<input type="radio" value="1" name="question[1].choices"/>
    	réponse 1.2
    	</label>
    	<br/>
    	<label for="radio_0_2">
    	<input type="radio" value="1" name="question[2].choices"/>
    	réponse 1.3
    	</label>
    	<br/>
    </div>
    <br/>
    <div class="questionFieldName quizz"> 1 - Question 2 ? </div>
    <div class="choicesFieldName quizz">
    	<label for="radio_1_0">
    	<input type="radio" value="2" name="question[0].choices"/>
    	réponse 2.1
    	</label>
    	<br/>
    	<label for="radio_1_1">
    	<input type="radio" value="2" name="question[1].choices"/>
    	réponse 2.2
    	</label>
    	<br/>
    	<label for="radio_1_2">
    	<input type="radio" value="2" name="question[2].choices"/>
    	réponse 2.3
    	</label>
    	<br/>
    </div>
    merci de votre aide

  2. #2
    Expert confirmé

    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
    Par défaut
    Dans le cas d'iterate imbriqués, il vaut mieux indexer soi-même.

    Par contre, d'après ton code, tu as une List questions d'objets de type Question ayant pour propriété une List choices d'objets de type QuestionChoices ayant pour propriété choices.
    Tu as donné le même nom à la List et à la propriété du bouton radio.
    C'est bien cela ?

    Si oui, essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio property="questions[${count}].choices[${countRadio}].choices" value="id" idName="question">
    en espérant que tu es bien en J2EE 1.4 (Servlet 2.4/JSP 2.0) ou plus afin que les EL soient interprétées.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut
    Merci pour cette réponse plus que rapide :-)

    Je suis bien en java > 1.4 (1.6.0.14).

    Effectivement, ma List et mon bouton radio ont le même nom !
    Est-ce bien ? A éviter ? Sans importance ?
    N'est-ce pas imposer par l'utilisation de l'ActionForm ?

    avec votre bout de code j'ai cette jolie erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No getter method available for property questions[0].choices[0].choices for bean under name org.apache.struts.taglib.html.BEAN
    donc j'y réchéflie ....


    Mais je suis en train de revoir ma copie, car à aucun moment je n'utilise/ne récupère l'id de mes Choix (ceux correspondants à ma BD).
    Et je pense que mon traitement ultérieur en serait facilité.

    a suivre ...

  4. #4
    Expert confirmé

    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
    Par défaut
    Je ne faisais pas allusion à la version du jdk mais à celle de J2EE, soit plus précisément la version des servlets et JSP.
    Mais bon, on voit bien dans le message d'erreur que les EL sont interprétées vu qu'il les a remplacé par 0.
    Tu dois donc bien être au minimum en J2EE 1.4.

    Le fait que la List et le bouton radio aient le même nom n'a pas vraiment d'importance.
    C'est juste que ce n'est pas très logique et moins facile de s'y retrouver.
    Mais bon, ça devrait fonctionner quand même.

    Sinon, le logic:iterate est-il bien dans un tag html:form ?

    Enfin, pour éviter l'erreur, ajoute l'attribut name="gameForm" dans le tag html:radio :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="questions[${count}].choices[${countRadio}].choices" value="id" idName="question">
    Concernant l'id, tel que tu l'as codé, tu vas récupérer l'id de la question.
    Si tu as un id pour le choix, modifie la valeur de l'attribut idName en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="questions[${count}].choices[${countRadio}].choices" value="id" idName="choice">
    La propriété choices correspondant au bouton radio est bien une propriété de l'objet QuestionChoices ?

  5. #5
    Expert confirmé

    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
    Par défaut
    En fait, après réflexion, la valeur sélectionnée via le bouton radio étant liée à la question, il vaudrait mieux ajouter une propriété choice dans l'objet Question et coder le tag html:radio comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="questions[${count}].choice" value="id" idName="choice">
    ainsi, la propriété choice de chaque objet Question de la List questions aura pour valeur l'id du choix sélectionné.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut
    ouha, je suis impressionné par votre réactivité ! bravo


    version servlet 2.5 (getServletContext().getMajorVersion()/getMinorVersion().
    j'ai bon ?

    la propriété "choices" (au pluriel) (List<QuestionChoices> choices) fait partie de l'objet Question, mais pas de l'objet QuestionChoices.
    Ai-je aussi besoin de la propriété "choice" (singulier) (QuestionChoices choice ?) dans l'objet Question ?

    Avec le dernier code (post de 15h00) que vous m'avez suggérer, j'ai ce type d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No getter method available for property questions[0].choice for bean under name gameForm
    je ne comprends pas car, je n'aurai jamais de propriété nommé questions[i].choice ....
    et je ne peux pas déclaré questions[0].choice, questions[1].choice, ....



    je résumé ce que j'ai compris :
    - j'ai un bean Question, un bean QuestionChoices.
    - Question contient une liste de QuestionChoices nommée choices.
    - un Form gameForm qu icontient une liste de questions et une listes de choices.

    ça ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="choices" value="id" idName="choice">
    la property "choices" est récupéré dans le gameForm (et correspond a List<QuestionChoices> choices) et existe, contrairement à questions[i].choice ....


    A quel moment je fais la connexion entre question et choices, a part dans le bean Question ?
    y'a encore un truc que je n'ai pas dû saisir ....
    qu'est ce qui cloche (chez moi ou dans mon code) ?


    Merci de votre attention

  7. #7
    Expert confirmé

    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
    Par défaut
    Tu me dis que le code suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="choices" value="id" idName="choice">
    cela signifie que tu as défini une propriété choices dans l'ActionForm.
    De quel type est cette propriété choices dans l'ActionForm ? List ? ça ne va pas fonctionner.
    Et même si ça fonctionnait, au submit du formulaire, choices contiendrait l'id des choix sélectionnés mais tu ne saurais pas pour quelle question.

    C'est pour cela que je te suggérais d'ajouter une propriété choice dans le bean Question.

    Et en codant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:radio name="gameForm" property="questions[${count}].choice" value="id" idName="choice">
    tu mettrais à jour la propriété choice de chaque objet de type Question contenu dans la List questions du form-bean gameForm avec l'id du choix sélectionné.

    Donc, dans l'Action qui s'exécutera au submit du formulaire, tu pourras récupérer la List questions, d'objet de type Question, modifiée avec l'id du choix sélectionné dans le champ choice de chaque objet Question.

    Est-ce plus clair ?

  8. #8
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut
    Oui dans l'Actionform, choices est de type List.

    Et même si ça fonctionnait, au submit du formulaire, choices contiendrait l'id des choix sélectionnés mais tu ne saurais pas pour quelle question.
    J'en étais arrivé à la même conclusion.

    Est-ce plus clair ?
    oui :-)

    j'essaie de mettre tout ça en pratique.

    Ne vous inquiétez pas, vous aurez rapidement de mes nouvelles ;-)

  9. #9
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par xoubidur Voir le message
    j'essaie de mettre tout ça en pratique.

    Ne vous inquiétez pas, vous aurez rapidement de mes nouvelles ;-)
    Pas de problème.

    Bon courage.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut
    j'suis presque étonné car ça marche terriblement bien ^^

    en fait c'est tellement simple quand c'est bien expliqué ;-)

    juste je reviens sur la propriété "choice" dans le bean Question :
    son utilité est bien de pouvoir associer un choix à une question ?

    plus qu'à récupérer et traiter les valeurs saisies, et c'est le pied !!

    encore merci pour votre disponibilité.

    ps : j'arrange mon code, j'en fais une copie ici, pour les prochains et je check résolu ;-)

  11. #11
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par xoubidur Voir le message
    juste je reviens sur la propriété "choice" dans le bean Question :
    son utilité est bien de pouvoir associer un choix à une question ?
    Tout à fait.
    Il y a sans doute d'autres solutions mais c'est celle-là qui m'est venue à l'esprit et elle ne me semble pas trop compliquée à mettre en oeuvre.

    Citation Envoyé par xoubidur Voir le message
    encore merci pour votre disponibilité.
    De rien.

    Citation Envoyé par xoubidur Voir le message
    ps : j'arrange mon code, j'en fais une copie ici, pour les prochains et je check résolu ;-)
    Tu as raison, ça peut servir à d'autres.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 4
    Par défaut
    pouvez vous déposer le code arrangé,s il vous plait car j'ai presque le meme probleme que vous avez,mais avec des checkbox.
    merci de me repondre

  13. #13
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Par défaut
    oups, j'vous avais oublié :-S

    Voici le code utilisé :

    fichier.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
    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
    <c:choose>
    	<c:when test="${hasAlreadyParticipated}">
    		<div class="alreadyParticipated">
    			Vous avez déjà*participé à ce jeu concours
    		</div>								
    	</c:when>
    </c:choose>
    <form id="gameForm" action="AddGameUserResponses" method="post">
     
    	<div class="questionBox npBox">
    		<div class="npBoxTop"></div>
    		<div class="npBoxBody">	
    			<div class="questionsContent">
    			<logic:iterate name="gameForm" id="question" property="questions" indexId="numQ">
    				<div class="questionFieldName">
    					${numQ+1} - <bean:write name="question" property="libelle"/>
    				</div>
    				<logic:iterate name="question" id="choice" property="choices" indexId="numC" >
    					<div class="choicesFieldName">
    						<label for="radio_<bean:write name='numQ'/>_<bean:write name='numC'/>">
    							<logic:equal value="checkbox" name="question" property="type">
    								<c:set var="checkRequired" value=""/>
    								<c:if test="${numC == 0}">
    									<c:set var="checkRequired" value="validate['~validQuestionCheck']"/>
    								</c:if>
     
    								<c:choose>
    									<c:when test="${hasAlreadyParticipated}">
    										<html:multibox name="gameForm" property="responses[${numQ}]"  styleId="radio_${numQ}_${numC}"  styleClass="CheckBox ${checkRequired}" disabled="true">
    											<bean:write name="choice" property="id"/>
    										</html:multibox>
    									</c:when>
    									<c:otherwise>
    										<html:multibox name="gameForm" property="responses[${numQ}]"  styleId="radio_${numQ}_${numC}"  styleClass="CheckBox ${checkRequired}">
    											<bean:write name="choice" property="id"/>
    										</html:multibox>
    									</c:otherwise>
    								</c:choose>
    								<bean:write name="choice" property="libelle"/>
    							</logic:equal>
    							<logic:equal value="radio" name="question" property="type">
    								<c:set var="radioRequired" value=""/>
    								<c:if test="${numC == 0}">
    									<c:set var="radioRequired" value="validate['required']"/>
    								</c:if>
     
    								<c:choose>
    									<c:when test="${hasAlreadyParticipated}">
    										<html:radio name="gameForm" property="responses[${numQ}]" value="id" idName="choice" styleId="radio_${numQ}_${numC}" styleClass="${radioRequired} radio" disabled="true">
    											<bean:write name="choice" property="libelle"/>
    										</html:radio>
    									</c:when>
     
    									<c:otherwise>
    										<html:radio name="gameForm" property="responses[${numQ}]" value="id" idName="choice" styleId="radio_${numQ}_${numC}" styleClass="${radioRequired} radio">
    											<bean:write name="choice" property="libelle"/>
    										</html:radio>
    									</c:otherwise>
    								</c:choose>
    							</logic:equal>
    						</label>
    					</div>
    				</logic:iterate>
    				<br />
    			</logic:iterate>
    			</div>
    		</div>
    		<div class="npBoxBottom"></div>
    	</div>
     
    	<div class='gameButton candidateButtons'>
    		<c:choose>
    			<c:when test="${not empty user}">
    				<c:set var="class" value="validate['submit'] validateGame" />
    				<c:if test="${hasAlreadyParticipated}"><c:set var="class" value="validateGame disable" /></c:if>	
    				<img id="submitButton" class="${class}" src="${blankImgURL}" alt="Valider" />
    			</c:when>
    			<c:otherwise>
    				<img id="submitButton" class="validateGame" src="${blankImgURL}" alt="Valider" onclick="displayConnect();" />
    			</c:otherwise>
    		</c:choose>
    	<br/><br/>
    		<a rel="shadowbox[reglement];width=800;height=596;options={modal:false, displayNav:true};" title="Règlement" href="#reglement" class="contact">
    			Règlement du jeu
    		</a>	
    	</div>
     
    </form>

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/03/2007, 13h32
  2. Problème avec html:radio
    Par cipotesi dans le forum Struts 1
    Réponses: 16
    Dernier message: 31/05/2006, 01h28
  3. [html+css] problème menu avec liens display:block
    Par Cypselos dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 28/08/2005, 09h39
  4. [HTML][Encodage] Problèmes avec les accents...
    Par eraim dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/05/2004, 10h11
  5. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05

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