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 :

Affichage Formulaire : Collections


Sujet :

Struts 1 Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut Affichage Formulaire : Collections
    Bonjour,

    J'ai un petit souci avec Struts et je ne trouve aucune réponse nul part...
    En fait je suis bloqué a l'affichage d'un collections dont chaque élement possède une collection...

    J'ai un ActionForm qui contient des paramètres simple ainsi qu'une collection de Type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private String id;
    	private Integer filter;
    	private Set<Type> types;
    ...
    J'affiche facilement l'id ainsi que le filtre sélectionné parmis l'ensemble des filtres disponibles.

    Chaque type a des paramètres simple ainsi qu'une collection d'états :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Type {
     
    	private int id;
    	private String name;
    	private State startState;
    	private State endState;
    	private int delay;
    	private String unit;
    	private Set<State> states;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class State {
     
    	private String id;
    	private String name;
    	private String step;
    	private boolean cs;
    ...
    Mon objectif est d'afficher un tableau de types (1 ligne par type) en dessous de des choix de filtres et autres :


    Start est la valeur de startState parmis l'ensemble des states du type
    End est la valeur de endState parmis l'ensemble des states du type
    States est l'ensemble des states du type accompagné d'un checkbox qui correspond au boolean cs

    Est-il possible de le faire ? Si oui comment
    Cela fait quelques jours que je suis dessus et n'y arrive pas du tout

    Merci à celles et ceux qui pourront me donner un coup de pouce

  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
    Pour pouvoir mettre à jour une sous-liste, il faut indexer toi-même les propriétés.
    Il faut donc remplacer les Set par des List car les Set n'ont pas de getter indexé.

    Dans la jsp, il faudrait coder quelque chose du style :
    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
    <table border="1">
     
    <nested:iterate property="types" id="type" indexId="idType">
    <tr>
    	<td><nested:write property="name"/></td>
    	<td>
      	   <nested:select property="startState.id">
    		<nested:optionsCollection property="states" value="id" label="name"/>
    	   </nested:select>
    	</td>
    	<td>
    	   <nested:select property="endState.id">
    		<nested:optionsCollection property="states" value="id" label="name"/>
    	   </nested:select>
    	</td>
    	<td><nested:text property="delay"/></td>
    	<td>
    	   <table>
    	      <nested:iterate property="states" id="state" indexId="idState">
    	         <tr>
    		    <td>
    			<html:checkbox name="nomDuFormBean" property="types[${idType}].states[${idState}].cs">
           			   <bean:write name="state" property="name"/>
    			</html:checkbox>
         		    </td>
    		 </tr>
    	      </nested:iterate>
    	   </table>
    	</td>
    </tr>
    </nested:iterate>
     
    </table>

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Merci pour cette réponse

    J'ai encore un souci car il n'y a une exception lors de l'accès au un state pour le checkbox :

    javax.servlet.ServletException: Invalid argument looking up property: "types[${idType}].states[${idState}].cs" of bean: "testForm"
    J'ai utilisé le même bean que celui que j'utilise pour le reste du formulaire... normal

    Je sais pas trop comment régler ce problème, ce sont peut être les ${} qui sont mal pris en compte ?

    Sinon dans mon Action je récupérerai toutes les valeurs modifiée directement dans mon bean ou faudra t'il faire un traitement spécifique (je pense aux checkbox)

  4. #4
    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
    Les EL ne sont pas interprétées.

    Tu peux utiliser la tld struts-html-el.tld à la place de struts-html.tld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html-el:checkbox name="nomDuFormBean" property="types[${idType}].states[${idState}].cs">
       <bean:write name="state" property="name"/>
    </html-el:checkbox>
    sans oublier d'ajouter au début de la jsp la directive taglib qui pointe sur cette tld.

    Normalement, via cette méthode, l'objet sera directement mis à jour.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    En effet c'est tout de suite mieux

    En tout cas, un grand merci car je sors la tête de l'eau enfin !!
    J'espere que ce sera par trop dur de sauvegarder et mettre a jour avec tout ca...

    Je te tiens au courant sur ce topic dans l'apres midi ou demain

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    (doublon à supprimer)

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Les principaux problèmes liés à la sauvegarde :

    1. startState et endState[
    2. checkbox


    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <nested:select property="startState.id" errorStyleClass="CSError">
       <nested:optionsCollection property="states" value="id" label="name"/>
    </nested:select>
    Je modifie l'id du l'etat de départ au lieu de modifier la référence vers l'etat de départ. En mettant seulement startState en property ca ne marche pas forcément

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:checkbox name="testForm" property="types[${idType}].states[${idState}].cs">
       <bean:write name="state" property="name"/>
    </html:checkbox>
    Je récupère la bonne valeur quand le checkbox passe de
    • true à true
    • false à true
    • false à false

    mais pas qd il passe de
    • true à false


    Les checkbox semblent ne pas retourner les éléments non cochés...
    Quelle est la meilleures façon et où enregistrer ces éléments ?

    Je reflechis à une solution mais le plus dur est d'en fait rester dans le form bean afin de garder les informations enregistrées quelque part en cas d'erreur (ce serait dommage que l'on perde tout le tableau si on a oublié de renseigner un champ...)

  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
    1. C'est normal car le select ne renvoie que l'id sélecté et non l'objet de type State.

    2. En html, une checkbox ne renvoie une valeur que si elle est cochée.

    En Struts, pour pallier à ce problème, comme la méthode reset de l'ActionForm est appelée avant les setters lors du submit du formulaire, on réinitialise toutes les valeurs des checkbox à false dans cette méthode reset.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    1. C'est normal car le select ne renvoie que l'id sélecté et non l'objet de type State.

    2. En html, une checkbox ne renvoie une valeur que si elle est cochée.

    En Struts, pour pallier à ce problème, comme la méthode reset de l'ActionForm est appelée avant les setters lors du submit du formulaire, on réinitialise toutes les valeurs des checkbox à false dans cette méthode reset.
    1. Oui le select ne renvoie que l'id, il me faut donc faire un traitement mais à quel endroit ?
    Le problème est que si je retrouve bien mon nouvel objet State grace à l'id l'ancien à déja eu son id modifié

    2. Pour les checkbox je vois comment faire

    Par contre j'utilisais la méthode reset pour initialiser le formulaire avec les valeurs que je récupère en base.

    J'ai vu qu'il était possible d'initialiser le form bean via une action mais je ne sais pas pourquoi impossible d'appeller une action avant mon formualire...
    (c'est avec un <html:link />, simple action struts faisant un forward que j'arrive sur le formualire)
    Lorsque je remplace ce forward par une action, celle ci n'est jamais appellée, (System.out.println en debut de méthode jamais affiché)

  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
    1. Peut-être que la meilleure solution serait de définir deux tableaux de String dans l'ActionForm qui contiendront respectivement l'id de l'état de début et l'id de l'état de fin sélectés de chacun des types, et remplacer les propriétés spécifiés dans l'attribut property des tags nested:select en conséquence.

    Tu pourras ainsi les récupérer dans l'Action qui s'exécute au submit du formulaire et mettre à jour les objets startState et endState de chacun des objets Type en conséquence.

    2. Concernant l'Action qui initialise le formulaire, si la méthode execute n'est jamais appelée, c'est sans doute parce que tu n'as pas mis l'attribut validate à false dans le mapping de cette Action.
    Du coup, à l'appel de cette Action, il exécute la méthode validate et comme aucun élément n'a encore été saisi dans le formulaire, il y a des erreurs de validation et il n'exécute pas l'Action.

    Ajoute donc l'attribut validate="false" dans le mapping de cette Action d'initialisation.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Ca me bloque pas mal de faire cette application sans vraiment bien connaitre struts... tout le monde a bien commencé un jour mais quand même ! En tout cas merci beaucoup pour ton aide précieuse

    Sinon effectivement avec le validate a false ça passe mieux, seulement lors de l'affichage du form bean. J'avais des soucis avec le redirect et le scope mais en le mettant à false/session ça marche.

    Sinon pour les tableau d'id j'ai essayé comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <nested:iterate property="types" id="type" indexId="idType">
         <nested:select name="testForm" property="startIds[${idType}]" errorStyleClass="CSError">
              <nested:optionsCollection property="states" value="id" label="name"/>
         </nested:select>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private List<Integer> startIds;
    Le problème c'est que j'ai une erreur du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid indexed property 'startIds[${idType}]'
    J'ai du mal m'y prendre non ?
    Tu parlais en effet d'un tableau de String...

  12. #12
    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 définir startIds de type Integer[].

    Sinon, pour que l'EL ${idType} soit interprétée, il faut utiliser la tld struts-html-el.tld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         <html-el:select name="testForm" property="startIds[${idType}]" errorStyleClass="CSError">
              <nested:optionsCollection property="states" value="id" label="name"/>
         </html-el:select>

  13. #13
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Je me suis enfin sorti de ce formulaire
    Je te remercie pour ton aide ainsi que ta rapidité de réponses.

    Je vais encore développer un peu avec Struts, si jamais j'ai un soucis je viendrai par ici (je vais commencer a traiter des dates et j'avais lu, si je me souviens bien, qu'il fallait faire un traitement spécifique)

    Si j'ai le temps j'essayerai de capitaliser ce que j'ai pu voir dans un document que je t'enverrai à l'occasion, ça pourra peut être aider d'autre personnes je pense...

  14. #14
    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
    De rien.

    Si tu penses avoir des éléments pouvant être utile à d'autres, tu peux contribuer à la FAQ Struts en les postant dans cette discussion sous forme de questions/réponses.

  15. #15
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Re bonjour

    Je suis encore sur la même application et cette fois c'est un autre problème, toujours lié aux collections !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <layout:collection name="issues" styleClass="CSDashboardTable" >
    	<layout:collectionItem title="issue.key" property="key"/>
    	<layout:collectionItem title="issue.type" property="type"/>
    	...
    </layout:collection>
    Comment définir le style d'une ligne en fonction du type par exemple ?

    Autre question
    Est-il possible de faire un converter en struts ?
    j'ai un long mais je souhaite qu'il soit converti à l'affichage... comment faire (à part créer une nouvelle propriété qui ferai la conversion dans le getter)

Discussions similaires

  1. [2.x] probleme d'affichage de collection dans un formulaire
    Par rafleboss dans le forum Symfony
    Réponses: 12
    Dernier message: 05/08/2011, 08h11
  2. affichage formulaire
    Par legsfr dans le forum IHM
    Réponses: 2
    Dernier message: 19/01/2007, 10h58
  3. [WinForms]Lenteur d'affichage formulaire avec image de fond
    Par olixelle dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/09/2006, 14h06
  4. Problème d'affichage de Collection
    Par youdev dans le forum Hibernate
    Réponses: 7
    Dernier message: 28/07/2006, 12h22
  5. Pb affichage formulaire dans balise div
    Par zut94 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/07/2006, 10h19

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