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 2 Java Discussion :

Checkbox et Objet complexe


Sujet :

Struts 2 Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut Checkbox et Objet complexe
    Bonjour à vous!

    Voici mon soucis: Je développe une application Web utilisant Struts 2 (jusqu'ici je crois donc être au bon endroit ).

    J'ai une page (JSP) qui affiche 3 listes d'objet sous forme de tableau. Chaque ligne du tableau correspond à un objet et on en affiche certaines données dans cette ligne.
    Devant chacune de mes lignes j'ai une checkbox et en bas de chaque tableau j'ai des boutons déclenchant des actions Struts. Certaines de ces actions nécessite de récupérer la liste des objets sélectionné (ie. la checkbox devant la ligne a été cochée) d'un tableau.

    Une solution a été adopté jusqu'ici, mais elle me déplait: Le pojo (celui que l'on affiche) comporte un champ "selected" qui est mappé à l'état de la checkbox. Mais je trouve ca maladroit et je voudrais retirer ce champ du pojo.

    J'ai remarqué que Struts 2 pouvait gérer la selection d'objet et renvoyer la liste des objets sélectionnés grâce à checkboxlist ... malheureusement dans mon cas, je ne peux pas utilisé directement la balise <s:checkboxlist ...> à moins de réécrire un fichier .ftl correspondant aux graphisme que l'on veut obtenir en définitif et en plus cela risque d'être très compliqué (on affiche pas tout le temps les même champs en fonction du tableau).

    Donc j'ai essayer de reproduire le mécanisme de la checkboxlist en l'écrivant directement sous forme (X)Html. Ca donne un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <s:iterator value="list">
        (...)
        <input type="checkbox" name="nodes" value="<s:property />" />
        (...)
    </s:iterator>
    et côté java j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (...)
    private List<MyNode> nodes;
    (...)
    public List<MyNode> getNodes() {
        return nodes;
    }
     
    public void setNodes(List<MyNode> nodes) {
        this.nodes = nodes;
    }
    (...)
    Le problème c'est que je me retrouve avec un "Invalid field value for field nodes" au moment du lancement d'une action. Cette manière d'écrire les checkbox stocke la référence de l'objet en tant que valeur (comme le fait le checkboxlist) et je crois que struts tente de faire entrer une string (la référence) dans ma liste au lieu de l'objet y correspondant ...

    Quelqu'un peut-il m'aider à trouver une voie pour résoudre ce problème?
    Tous les exemple que j'ai vu traite de la selection dans une list de String du coup je comprends que cela fonctionne mais moi c'est mon objet que je veux récupérer.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 30
    Par défaut
    Bonjour,

    J'ai eu le même problème que toi recemment, et la solution que j'ai trouvé est d'utiliser les TypeConverter : http://struts.apache.org/2.x/docs/type-conversion.html
    Et notamment la méthode convertFromString(...).

    Bon courage

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut
    Et bien je me suis aventurer vers cette voie mais je n'ai pas trouver d'exemple concret m'expliquant comment faire.

    Je ne savais pas trop si je devais ajouter mon type converter sur mon action, ou ma classe. Et je ne savais pas non plus trop quoi faire avec cette référence en main...

    Vous auriez ca sous la main?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 30
    Par défaut
    Je n'ai pas de code précis sous la main, seulement ce soir.
    Mais en gros il faut créer un type converter pour ton objet.

    Struts te retourne l'identifiant que tu as spécifié sous forme de string. Personnellement je l'ai utilisé pour un select : J'avais donc spécifié un listKey="id" et id est un attribut unique de l'objet, bref classique.

    Je récupère donc une string de l'id tout simplement, et struts 2 appelle mon converter fromString pour la conversion avant d'entrer dans mon setObjet(Objet objet).

    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
     
    public class MyConverter extends StrutsTypeConverter {
        public Object convertFromString(Map context, String[] values, Class toClass) {
           // récupérer l'id
           try {
               Integer id = Integer.decode(values[0]);
           } catch(Exception e) { .... return null; }
     
           // récupérer l'objet correspondant à partir de la base
           Objet objet = MonManager().getInstance().getById(id);
     
           return objet;
        }
     
        public String convertToString(Map context, Object o) {
           // Le chemin dans l'autre sens
        }
     }
    Et ensuite l'objet retourné est bien setté.

    J'espère que j'ai été clair dans mes explications. Il y'a terriblement peu de doc sur ce sujet donc je ne sais pas du tout si c'est la bonne manière de faire. En tout cas ça fonctionne.

    Lukas

    Edit : Et il faut spécifier la conversion dans un fichier properties "xxx-conversion.properties", soit au niveau de ta classe, soit de l'action, soit dans un properties global à toute l'appli.

Discussions similaires

  1. Objet complexe et sérialization
    Par alncool dans le forum C#
    Réponses: 2
    Dernier message: 13/04/2007, 18h37
  2. Stockage d'objet complexe
    Par cathar_rhythm dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 14h09
  3. Travailler / Créer des objets complexes
    Par Ekinoks dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2005, 14h38
  4. texture sous opengl : objets complexes
    Par pouleriguen dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/11/2004, 19h47
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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