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 de certains éléments d'une Map (ou d'un tableau)


Sujet :

Struts 1 Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 14
    Points
    14
    Par défaut Affichage de certains éléments d'une Map (ou d'un tableau)
    Bonjour.

    J'ai un souci pour afficher certains éléments d'une map.
    Sur ma page JSP, je récupère un bean qui contient une map, et j'aimerais afficher certains élements de cette map. Je n'ai pas trouvé de solution simple pour y arriver, peut être que quelqu'un aura une idée.

    Pour être précis, j'ai un bean qui contient des produits. Ces produits sont matérialisés sous la forme d'une List, et chaque produit est une Map contenant un certain nombre d'éléments.
    L'itération sur la liste des produits se fait correctement, mais je voudrais afficher certains éléments précis de mes produits. Je ne veux donc pas itérer sur la Map parce que j'aurais trop d'infos (et pas forcément dans l'ordre que je veux).
    Vous me direz que je peux creer un objet "Produit" et comme ça je pourrais afficher sans effort les objets que je veux. C'est vrai, mais je préfèrerais éviter d'alourdir encore le code avec un objet supplémentaire.
    Dans la doc, j'ai trouvé qu'on pouvait donner des paramêtres justement pour accéder à des index de tableaux ou des clés de Map, mais pour ça, il faut donner un nom de fonction, et je n'en ai pas puisque mon objet est directement une Map.
    J'ai donc essayé sans, mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <logic:iterate id="product" name="productList">
        <bean:write name="product"/>
        <bean:write name="product" property="[name]"/>
        <bean:write name="product" property="['name']"/>
    </logic:iterate>
    Avec ça, la première ligne m'affiche le toString de la Map, donc, l'objet est bien trouvé, mais les deux autres lignes n'affichent rien du tout.

    Est ce possible d'afficher des données spécifiques d'un tableau ou d'une map ?

  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
    Je ne suis pas certaine d'avoir bien compris.

    productList est une List de Map ? et la Map a pour valeurs des beans Produit ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Oui, productList est une List de Map ?

    Et la Map représente un produit. Elle contient les différentes infos du produit : nom, identifiant, prix, etc... A l'intérieur, les données varient, mais ce ne sont pas des beans, plutôt des String, Integer et autres objets simples.

  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
    Mais pourquoi ne pas avoir créé une List de beans Produit ?

    Enfin, dans ton cas, si tu veux afficher seulement certains éléments de la Map, il faut itérer sur la List puis sur la Map et tester chaque valeur de clé.

    Imaginons que tu veuilles seulement afficher le nom des produits, il faut faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <logic:iterate name="productList" id="product">
       <logic:iterate name="product" id="itemMap">
          <logic:equal name="itemMap" property="key" value="nom">
             <bean:write name="itemMap" property="value"/>
          </logic:equal>
       </logic:iterate>
    </logic:iterate>
    Avec une List de beans Produit, c'est beaucoup plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate name="productList" id="product">
       <bean:write name="product" property="nom"/>
    </logic:iterate>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    J'ai pas mal cherché depuis hier.
    Je ne voulais justement pas créer un objet supplémentaire et alourdir le code juste pour le de l'affichage. La map que j'utilise n'est là que pour afficher des données, il n'est pas possible de les modifier, alors créer un objet spécifique avec des set et des get alors que j'ai une map toute prête me semblait un peu lourd.

    Bref, j'ai cherché, tatonné, et voila le résultat de mes recherches :

    J'ai décortiqué le code de struts, et notamment la classe PropertyUtils et sa méthode getNestedProperty qui sert justement à analyser le champ property du tag struts.
    Il est possible d'utiliser des crochets pour accéder à des éléments itératifs (tableau, list, etc...), et il est possible d'utiliser des parenthèses pour afficher des éléments mappés.

    Si j'ai un bean qui contient une map, je peux accéder aux éléments de ma map de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:write name="monBean" property="maMap(monElement)">
    Ca, ça marche très bien, à partir du moment où j'ai un bean qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MonBean {
        Map maMap;
     
        public Map getMaMap() {
            return maMap;
        }
    }
    Il décompose la property, récupère l'objet Map, et fait un get dessus avec le paramêtre entre parenthèse.

    Maintenant, si je fais quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <bean:define id="maMap" name="monBean" property="maMap">
    <bean:write name="maMap" property="(monElement)">
    Pour moi, c'était censé revenir au même. Avec le define, je récupère la Map, et dans le write, je lui passe en paramêtre la clé. En réalité, même si aucune erreur n'est levée, ça ne donne rien.
    Explication : On est ici dans un cas particulier. Quand la méthode getNestedProperty analyse la valeur, elle trouve que l'objet bean est de type Map et lui attribue un traitement spécial, celui d'exécuter la méthode get avec le paramêtre trouvé. Conclusion, je me suis évertué à lui mettre des parenthèses pour bien lui préciser que je voulais utiliser une map, alors qu'il le détecte de lui même et fait le travail approprié sans me demander mon avis.

    Il faudrait donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <bean:define id="maMap" name="monBean" property="maMap">
    <bean:write name="maMap" property="monElement">
    Et là, ça marche.

    Voila, j'espère que mes laborieuses recherches pourront servir à d'autres.

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

Discussions similaires

  1. [Thread] Synchroniser tous les éléments d'une map
    Par Monorom dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 02/04/2007, 12h33
  2. Réponses: 2
    Dernier message: 29/03/2007, 10h18
  3. Réponses: 5
    Dernier message: 12/02/2007, 01h19
  4. Réponses: 5
    Dernier message: 26/04/2006, 16h36

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