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 :

Comment trier une collection avant de l'afficher ?


Sujet :

Struts 1 Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut Comment trier une collection avant de l'afficher ?
    Bonjour,

    J'affiche une collection dans une page JSP, de la manière suivante (merci à c_nvy ) :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <c:forEach items="${user.functions}" var="item" varStatus="status">
      <c:choose>
        <c:when test="${status.last}">
          <c:set var="sep" value=""/>
        </c:when>
        <c:otherwise>
          <c:set var="sep" value=", "/>
        </c:otherwise>
      </c:choose>
      <c:out value="${item.name}"/><c:out value="${sep}"/>
    </c:forEach>

    Contexte :
    J'ai une collection de User. Un User possède divers attributs (nom, prénom, etc.) et aussi des fonctions. Je tente ici de lister mes User dans un tableau.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    +-----------+----------+-----------------+
    | Firstname | Lastname | Functions       |
    +-----------+----------+-----------------+
    | Julien    | DURAND   | engineer, admin |
    +-----------+----------+-----------------+
    |           |          |                 |
    Le problème, c'est que je me suis rendu compte que les Functions n'étaient pas retournées toujours dans le même ordre par hibernate.

    Quelle est la logique du site (workflow) ?

    1) Le navigateur demande l'URL listUsers.do
    2) Struts envoie vers une Action que j'ai codée. Grâce à Hibernate, tout ce que j'ai à faire (en gros), c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    List<User> maListe = getAllUsers();
     
    request.setAttribute("listUsers", maListe);
     
    return mapping.findForward("success");
    Le bean listUsers est envoyé à la page JSP (Vue).

    3) La page listUsers.jsp itère sur la collection de Users, mais quand elle arrive sur le listing des Function d'un User, ces Function ne sont pas encore récupérées de la base de données. Cela déclenche un requêtage "implicite" par Hibernate pour récupérer ces Function.

    Je n'ai donc pas de contrôle sur la requête pour faire un tri.

    Ma question :
    Comment faire pour trier ces valeurs ? Est-ce que Struts permet cela ? Comment est-ce que vous feriez ?

    piloupy

  2. #2
    Membre habitué Avatar de faico
    Inscrit en
    Août 2005
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 242
    Points : 179
    Points
    179
    Par défaut
    Salam,

    Et si tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<User> maListe = getAllUsers();
     
    Collection.sort(maListe);
    request.setAttribute("listUsers", maListe);
     
    return mapping.findForward("success");
    mais ta classe User doit implémenter l'interface comparable.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Désolé, je faisais le pont

    En fait, ce n'est pas la liste de Users que je veux trier, mais la liste des Functions.

    Le requêtage est implicite (je ne l'écris nulle part) : c'est DANS la page JSP, au moment où j'invoque user.getFunctions() qu'Hibernate déclenche la requête pour moi.

    piloupy

  4. #4
    Membre habitué Avatar de faico
    Inscrit en
    Août 2005
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 242
    Points : 179
    Points
    179
    Par défaut
    Salam,

    De même tu peux utiliser la methode static Collection.sort() pour la liste des fonctions rertournées par hibernate.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 64
    Points
    64
    Par défaut
    tout à fait,

    je pense que tu peux appliquer la fonction sort() à la collection générée

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Ca ne répond pas vraiment à mon besoin. Mon problème, c'est que je ne déclenche pas vraiment la requête d'Hibernate. C'est dans la page JSP que la requête se déclenche. A la ligne :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:forEach items="${user.functions}" var="item" varStatus="status">

    Bien sûr, je pourrais tenter de faire ce que vous dites, dans ma page JSP, à savoir :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <c:forEach items="${user.functions}" var="item" varStatus="status">
    <% Collections.sort(user.getFunctions()); %>

    J'ai bien écrit "tenter", car je ne crois pas que ça marche... Ces listes sont mappées avec la base de données. Si Hibernate voit qu'elles ont été modifiées, il va réagir par des updates à mon avis.

    Mais à supposer que ça marche, je ne veux pas faire ça, car l'usage de scriptlet dans une page JSP est une chose que je veux éviter dans la mesure du possible. C'est souvent ces bouts de code qui rendent le site immaintenable, et qui va à l'encontre du modèle MVC préconisé par Struts.

    Bien sûr, vous me répondriez de créer mes propres taglibs pour faire ce tri, mais je crois que mon besoin est suffisamment commun pour avoir une solution d'une manière ou d'une autre sans que je doive coder des fonctions de tri.

    piloupy

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Voici une solution que j'ai trouvée, mais je ne l'aime pas vraiment.

    1) Changer le type des Functions dans le User bean.
    User.java :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class User {
     
      ...
      private SortedSet<Function> functions = new TreeSet<Function>();
     
      ...
    }

    2) Ajouter l'attribut sort dans le mapping User.hbm.xml :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="functions" table="USER_FUNCTION" sort="natural" lazy="false">
      <key column="USER_ID" />
      <many-to-many column="FUNCTION_ID" class="beans.Function" />
    </set>

    Dans la classe Java, SortedSet<Function> indique que mes fonctions vont être triées selon les critères propres de comparaison de la classe Function qui implémente Comparable. Le tri que j'ai mis se fait sur le nom de la Function.

    Je le précise également à Hibernate via le fichier de mapping.

    Et voilà, quand je demande les Functions d'un User, il va me les donner dans l'ordre alphabétique. C'est bien, mais si je veux avoir les Functions dans l'ordre alphabétique inverse, je ne sais pas faire ; ou même trier selon un autre ordre.

    C'est pour ça que je n'aime pas cette solution. Je me sens "emprisonné" dedans.

    piloupy

  8. #8
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 234
    Points : 1 897
    Points
    1 897
    Par défaut
    Citation Envoyé par piloupy
    Bonjour,

    J'affiche une collection dans une page JSP, de la manière suivante (merci à c_nvy ) :

    piloupy
    Quel galant (GAG ).

  9. #9
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 234
    Points : 1 897
    Points
    1 897
    Par défaut
    Citation Envoyé par piloupy
    Voici une solution que j'ai trouvée, mais je ne l'aime pas vraiment.
    ... Ajouter l'attribut sort dans le mapping User.hbm.xml :
    piloupy
    Mais pourquoi ne demandes-tu pas ce tri en même temps que la requête ?

    A+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 69
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par piloupy
    Mon problème, c'est que je ne déclenche pas vraiment la requête d'Hibernate. C'est dans la page JSP que la requête se déclenche. A la ligne :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:forEach items="${user.functions}" var="item" varStatus="status">
    piloupy

  11. #11
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 234
    Points : 1 897
    Points
    1 897
    Par défaut
    Tu affiches dans la JSP le contenu d'une liste : si celle-ci n'est pas préalablement triée, l'affichage ne sera pas trié.

    Il te faut donc trier la liste lors de son initialisation et une méthode pour cela est de demander ce tri lors de la requête.

    Salut.

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

Discussions similaires

  1. [C#]Comment trier une collection?
    Par Cube55 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/06/2006, 19h18
  2. Comment fermer une Tform avant meme qu'elle s'affiche??
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 17/05/2006, 11h34
  3. Réponses: 7
    Dernier message: 10/05/2006, 11h15
  4. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18
  5. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20

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