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-Layout] affichage d'une collection sur X colonnes


Sujet :

Struts 1 Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 32
    Points : 15
    Points
    15
    Par défaut [Struts-Layout] affichage d'une collection sur X colonnes
    bonjour à tous,

    j'ai repris un site web qui en gros affiche dans un formulaire, une collection de photos (auxquelles sont adjoints un label et un champs d'input)

    pour pouvoir afficher ces photos sur deux colonnes, mon prédécesseur avait construit un bean qui contient deux photos, une gauche et une droite...

    ça marche bien quand le nombre de photos est pair ce qui était le cas jusqu'à maintenant, mais à présent que la collection est impaire, j'ai un erreur quand il s'agit d'afficher le bean qui n'a pas de photo de droite (ni de label ou de champs input pour cette photo)

    j'ai donc refait la collection pour qu'elle ne fonctionne plus par paire de photos et j'ai une belle colonne unique. Mais comment faire pour afficher ma collection sur deux colonnes comme avant?

    avez vous des idées

  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
    Avec la première solution, tu aurais pu t'en sortir en ajoutant un tag logic:notEmpty pour conditionner l'affichage de la deuxième photo.
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    merci pour cette piste,

    maintenant je n'arrive pas à me servir de ce tag <logic:notEmpty> avec la collection, les indexes et tout ça

    j'ai essayé de nombreuses syntaxe et celle qui me semble la plus probable ne fonctionne pas :

    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
    <layout:row>
    	<layout:column>
    		<%-- Saisie des observations pour les espèces de papillons de la brochure --%>
    		<layout:cell styleClass="decoCellSurveyBourdons">
    			<%-- Parcours de la collection d'espèces de papillons de la brochure --%>
    			<layout:collection property="speciesGroups4SurveyBrochure" id="speciesGroups4SurveyBrochure" indexId="keycoll" width="100%" align="center" >
    			<%-- Pour chaque paire --%>
    				<%-- Dans la colonne de gauche --%>
    				<%-- Un champ de saisie --%>
    				<layout:collectionInput formProperty="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyLeft.abundance" title="" maxlength="2" size="2" styleClass="decoValueSurvey"></layout:collectionInput>
    				<%-- Une espèce de papillons --%>
    				<layout:collectionItem property="speciesGroupGauche" styleClass="decoCellSurveyBrochure" style="text-align: left ; border-style: none">							
    					<%-- Son nom --%>
    					<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyLeft.groupName"></layout:write>
    					<layout:space />
    					<%-- Son image --%>
    					<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyLeft.img" filter="false"></layout:write>
    				</layout:collectionItem>
    				<%-- Dans la colonne de droite --%>
    				<%-- Un champ de saisie --%>
    				<logic:notEmpty name="speciesGroups4SurveyBrochure" property="speciesGroupSurveyRight">
    				<layout:collectionInput formProperty="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.abundance" title="" maxlength="2" size="2" styleClass="decoValueSurvey"></layout:collectionInput>
    				<%-- Une espèce de papillons --%>
    				<layout:collectionItem property="speciesGroupDroite" styleClass="decoCellSurveyBrochure" style="text-align: left ; border-style: none">
    					<%-- Son nom --%>
    					<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.groupName" ></layout:write>
    					<layout:space />
    					<%-- Son image --%>
    					<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.img" filter="false"></layout:write>									
    				</layout:collectionItem>
    				</logic:notEmpty>
    			</layout:collection>
    		</layout:cell>
    	</layout:column>
    </layout:row>
    voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    javax.servlet.jsp.JspException: Cannot find bean speciesGroups4SurveyBrochure in any scope
    	at org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:938)
    	at org.apache.struts.taglib.logic.EmptyTag.condition(EmptyTag.java:123)
    	at org.apache.struts.taglib.logic.NotEmptyTag.condition(NotEmptyTag.java:94)
    le vecteur de beans est contenu dans un objet de type SurveyForm situé dans la session il me semble.

    merci beaucoup,

    Olivier

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    hum, j'ai exploré la solution <logic: en reprenant tout l'affichage de cette collection avec cette nouvelle approche, ce qui me donne le code suivant :

    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
    <layout:row>
    	<layout:column>
    <logic:iterate name="surveyForm" property="speciesGroups4SurveyBrochure" id="data">
    <bean:write name="data" property="speciesGroupSurveyLeft.groupName" />
    <html:text name="data" property="speciesGroupSurveyLeft.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    <bean:write name="data" property="speciesGroupSurveyLeft.img" filter="false"/>
    <logic:notEmpty name="data" property="speciesGroupSurveyRight">				
    <bean:write name="data" property="speciesGroupSurveyRight.groupName" />
    <html:text name="data" property="speciesGroupSurveyRight.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    <bean:write name="data" property="speciesGroupSurveyRight.img" filter="false"/>
    </logic:notEmpty>	
    <br />
    </logic:iterate>
     
    	</layout:column>
    </layout:row>
    bon alors actuellement tout fonctionne au niveau affichage à part que mon <html:text ne rempli pas mon bean, il veut bien afficher le contenu de la propriété abundance de speciesGroupSurveyRight (par exemple) mais quand je clique sur submit il n'a pas stocké la valeur que j'ai entré dans abundance...
    alors que cela fonctionnait parfaitement quand tout était géré par struts-layout.

    Avez vous une idée d'où j'ai pu fauter?

    si j'arrive à m'en sortir avec <logic: je serai ravi car je n'aimais pas le fait de ne pas bien maîtriser ce que struts-layout produisait automatiquement en terme de balises html

    merci,

    Olivier

  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
    Pour les tags layout:write dans le tag layout:collectionItem, tu dois pouvoir faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <layout:collectionItem property="speciesGroupDroite" styleClass="decoCellSurveyBrochure" style="text-align: left ; border-style: none">
       <logic:notEmpty name="speciesGroups4SurveyBrochure" property="speciesGroupSurveyRight">
    	<%-- Son nom --%>
    	<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.groupName" ></layout:write>
    	<layout:space />
    	<%-- Son image --%>
    	<layout:write property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.img" filter="false"></layout:write>								
       </logic:notEmpty>
    </layout:collectionItem>
    Pour pouvoir faire la même chose avec le champ de saisie, il faudrait remplacer le tag layout:collectionInput par un tag layout:text dans un tag layout:collectionItem (en suivant le même principe que les tag layout:write dans le tag layout:collectionItem).
    Modératrice Java - Struts, Servlets/JSP, ...

  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
    On a posté en même temps.

    Si tu veux une solution purement Struts, pour que la mise à jour des champs saisis fonctionne, il faut coder les tags html:text en utilisant l'index, sur le même principe que les tags layout:write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    Ne pas oublier d'ajouter l'attribut indexId="keycoll" dans le tag logic:iterate.

    Autre solution plus propre : utiliser les tags nested.
    Modératrice Java - Struts, Servlets/JSP, ...

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    oui c'est rigolo, on va y arriver cela dit !

    alors bon dans ta dernière syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <logic:iterate name="surveyForm" property="speciesGroups4SurveyBrochure" id="data" indexId="keycoll">
    <bean:write name="data" property="speciesGroupSurveyLeft.groupName" />
    <html:text name="data" property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyLeft.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    <bean:write name="data" property="speciesGroupSurveyLeft.img" filter="false"/>
    <logic:notEmpty name="data" property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight">				
    <bean:write name="data" property="speciesGroupSurveyRight.groupName" />
    <html:text name="data" property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    <bean:write name="data" property="speciesGroupSurveyRight.img" filter="false"/>
    </logic:notEmpty>	
    <br />
    </logic:iterate>
    il doit y avoir un truc qui cloche car j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.IllegalArgumentException: Invalid indexed property 'speciesGroups4SurveyBrochure[${keycoll}]'


    du coup j'ai essayé pas mal de combinaisons du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="data" property="speciesGroups4SurveyBrochure(${keycoll}).speciesGroupSurveyLeft.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No getter method for property speciesGroups4SurveyBrochure(${keycoll}).speciesGroupSurveyLeft.abundance of bean data
    ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text      property="speciesGroups4SurveyBrochure(${keycoll}).speciesGroupSurveyLeft.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.IllegalArgumentException: Null property value for 'speciesGroups4SurveyBrochure(${keycoll})'
    alors elle est où l'embrouille? :-)

    au fait struts logic marche aussi avec les radio et checkboxes, tout quoi?

    Olivier

  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
    Désolée, j'ai fait un copier/coller de ton tag html:text, j'ai modifié la valeur de l'attribut property mais j'ai oublié d'enlever l'attribut name :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text property="speciesGroups4SurveyBrochure[${keycoll}].speciesGroupSurveyRight.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    Modératrice Java - Struts, Servlets/JSP, ...

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    Suite et fin :

    j'avais encore une erreur, alors je me suis mis à nested et là tout fonctionne

    voici le code :
    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
    <layout:row>
    	<layout:column>
    <nested:root name="surveyForm">
    	<nested:iterate property="speciesGroups4SurveyBrochure">
    		<nested:write property="speciesGroupSurveyLeft.groupName" />
    		<nested:text property="speciesGroupSurveyLeft.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    		<nested:write property="speciesGroupSurveyLeft.img" filter="false"/>
    		<logic:notEmpty name="speciesGroups4SurveyBrochure" property="speciesGroupSurveyRight">
    		<nested:write property="speciesGroupSurveyRight.groupName" />
    		<nested:text property="speciesGroupSurveyRight.abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    		<nested:write property="speciesGroupSurveyRight.img" filter="false"/>						
    		</logic:notEmpty>
    	</nested:iterate>
    </nested:root>
    	</layout:column>
    </layout:row>
    maintenant je n'ai plus qu'à styler tout ceci

    merci beaucoup pour ton aide en tous les cas

    Olivier

  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
    Pour info, le tag nested:root n'est pas utile à partir du moment où le tag nested:iterate est dans un tag nested:form.

    Sinon, tu peux aussi utiliser le tag nested:nest pour plus de clarté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <nested:iterate property="speciesGroups4SurveyBrochure">
    	<nested:nest property="speciesGroupSurveyLeft">
    		<nested:write property="groupName" />
    		<nested:text property="abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    		<nested:write property="img" filter="false"/>
    	<logic:notEmpty name="speciesGroups4SurveyBrochure" property="speciesGroupSurveyRight">
    	     <nested:nested property="speciesGroupSurveyRight">
    		<nested:write property="groupName" />
    		<nested:text property="abundance" maxlength="2" size="2" styleClass="decoValueSurvey"/>
    		<nested:write property="img" filter="false"/>
    	     </nested:nest>
    	</logic:notEmpty>
    </nested:iterate>
    Modératrice Java - Struts, Servlets/JSP, ...

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

Discussions similaires

  1. [Struts-Layout] Affichage de collection
    Par valkeke dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/02/2010, 15h45
  2. [Struts-Layout] Affichage d'une collection
    Par s-ehtp dans le forum Struts 1
    Réponses: 3
    Dernier message: 28/07/2009, 09h32
  3. Réponses: 0
    Dernier message: 10/04/2009, 15h40
  4. [Struts-Layout] Pagination de l'affichage d'une collection
    Par spidereck dans le forum Struts 1
    Réponses: 7
    Dernier message: 15/05/2007, 11h24
  5. Réponses: 2
    Dernier message: 31/05/2006, 09h47

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