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] <layout:detail> avec pour contenu une Collection - pattern master/detail ambigue


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut [Struts-Layout] <layout:detail> avec pour contenu une Collection - pattern master/detail ambigue
    Est-ce possible d'afficher (un peu comme pour l'exemple http://struts.improve-technologies.c...de=showAllNews sur le tableau en bas) un détail qui contient une Collection de beans ?
    Merci pour toutes vos contributions.

  2. #2
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Je viens d'implémenter un exemple similaire (master/détail comme ils l'appellent sur leur FAQ) pour mieux comprendre mais je ne saisi vraiment pas le principe
    ça sert pas à grand chose sinon à afficher le contenu d'une colonne dynamiquement. Ou est le détail dans tout ça ?

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Le principe de detail est de limiter le nombre de colonnes de la liste tout en permettant d'en visualiser d'autres.
    En gros, on met les colonnes de recherche/tri dans la partie liste et les autres dans detail.
    Par exemple, dans une liste de personnes, on pourrait mettre le nom, le prénom, le code postal, la ville dans la liste et afficher le numéro de téléphone, son adresse e-mail etc... dans la partie détail

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Ok. C'est un peu plus clair avec l'histoire du tri.
    Mais est ce possible d'adapter pour répondre à mon besoin ?
    On pourrait imaginer que la collection "listEssai" sur laquelle j'itère contient des beans UneLigne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class UneLigne{
    private String prop1;
    private String prop2;
    private ArrayList list;
    ...
    }
    que la liste "list" contient des DetailedBean:
    UneLigne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class DetailedBean{
    private String attrib1;
    private String attrib2;
    ...
    }
    J'aimerai faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM">
    				<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" />
    				<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" />
    				<layout:collectionDetail property="list" />
    			</layout:collection>
    		<layout:pagerStatus key="status.pagination" />
    </layout:pager>
    	<layout:grid cols="3" styleClass="SEARCHBOX">
    		<layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/>
    	</layout:grid>

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je ne crois pas que ça fonctionne, c'est du javascript assez basic derrière, je ne me souviens pas d'avoir vu un traitement pour des listes... mais ça date un peu...

    Le plus simple serait d'essayer...

  6. #6
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Le plus simple serait d'essayer...
    Tout ce que j'arrive à afficher c'est soit "[]" quand c'est une liste soit ça n'affiche rien du tout quand je sors des sentiers battus.

  7. #7
    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
    Peut-être que tu peux combiner un nestedCollection avec un collectionDetail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM">
    	<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" />
    	<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" />
    	<layout:nestedCollection property="list"> 
    		<layout:collectionDetail property="attrib1" />
    	</layout:nestedCollection> 
    </layout:collection>
    <layout:pagerStatus key="status.pagination" />
    </layout:pager>
    <layout:grid cols="3" styleClass="SEARCHBOX">
    	<layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/>
    </layout:grid>
    sans grande conviction que ça puisse fonctionner mais à tester quand même.

    Tout ça combiné avec un pager, tu seras vraiment chanceux si ça fonctionne.

  8. #8
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    ça ne fonctionne pas ou je m'y prend mal.
    p.s:nestedCollection necessite un id pour index

  9. #9
    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
    Ah oui pardon, j'ai oublié l'attribut id.
    Du coup, je doute encore plus que cela puisse fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM">
    	<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" />
    	<layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" />
    	<layout:nestedCollection property="list" id="itemList"> 
    		<layout:collectionDetail name="itemList" property="attrib1" />
    	</layout:nestedCollection> 
    </layout:collection>
    <layout:pagerStatus key="status.pagination" />
    </layout:pager>
    <layout:grid cols="3" styleClass="SEARCHBOX">
    	<layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/>
    </layout:grid>

  10. #10
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    ça donne quoi de votre côté ?
    Chez moi je me prend pas d'exception mais ça prend pas (EL, nestedCollection)
    Je pense que si quelqu'un réussi à faire ça en premier ce ne sera sûrement pas moi

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Dans tous les cas, ça ne fonctionne pas...
    Le javascript associé n'est pas prévu pour cette fonctionnalité, tu auras toujours le dernier élément de la liste dans l'affichage du détail.

    Une option serait de faire un getter spécialisé dans ta classe source (celle que représente le tag <layout:collection> pour obtenir la liste des éléments formatés comme il faut... et encore... il reste le problème que par défaut, c'est un champ <input type="text"> qui est associé à l'affichage du détail...

    Je te propose ceci (à défaut de mieux) pour exposer une solution

    page JSP de test (elle se suffit à elle même)
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    <%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%>
    <%@page import="java.util.List"%>
    <%@page import="java.util.ArrayList"%>
     
    <%!
        public class User
        {
            private String login;
            private String description;
            private List<Role> roles = new ArrayList<Role>();
            public User()
            {
                super();
            }
            public User(String login, String description)
            {
                super();
                this.login = login;
                this.description = description;
            }
            public String getLogin()
            {
                return login;
            }
            public void setLogin(String login)
            {
                this.login = login;
            }
            public String getDescription()
            {
                return description;
            }
            public void setDescription(String description)
            {
                this.description = description;
            }
            public List<Role> getRoles()
            {
                return roles;
            }
            public void setRoles(List<Role> roles)
            {
                this.roles = roles;
            }
     
            public String getListRoles()
            {
                StringBuilder sb = new StringBuilder();
                sb.append("<ul>");
                for (Role role : roles)
                {
                    sb.append("<li>").append(role.name).append(" - ").append(role.description).append("</li>");    
                }
                sb.append("</ul>");
                if (sb.length() > 0) return sb.substring(0, sb.length());
                return "- aucun -";
            }
        }
        public class Role
        {
            private String name;
            private String description;
            public Role(String name, String description)
            {
                super();
                this.name = name;
                this.description = description;
            }
            public String getName()
            {
                return name;
            }
            public void setName(String name)
            {
                this.name = name;
            }
            public String getDescription()
            {
                return description;
            }
            public void setDescription(String description)
            {
                this.description = description;
            }
        }
    %>
    <%
        List<User> list = new ArrayList<User>();
     
        User user = new User("OBU", "Olivier BUTTERLIN");
        List<Role> roles = new ArrayList<Role>();
        roles.add(new Role("MANAG","Manager"));
        roles.add(new Role("USER","Utilisateur"));
        roles.add(new Role("ADMIN","Administrateur"));
        roles.add(new Role("COMPTA","Comptabilité"));
        roles.add(new Role("SECURITY1","Responsable sécurité (niveau 1)"));
        roles.add(new Role("SECURITY2","Responsable sécurité (niveau 2)"));
        roles.add(new Role("SECURITY3","Responsable sécurité (niveau 3)"));
        roles.add(new Role("SECURITY4","Responsable sécurité (niveau 4)"));
        roles.add(new Role("SECURITY5","Responsable sécurité (niveau 5)"));
        user.setRoles(roles);
        list.add(user);    
     
        user = new User("CNVY", "Cendrine");
        roles = new ArrayList<Role>();
        roles.add(new Role("ADMIN","Administrateur"));
        user.setRoles(roles);
        list.add(user);
     
        request.setAttribute("LIST", list);
    %>
     
    <style>
    <!--
    .suppressed{
        display:none;
    }
    .box{
        border-style:solid;
        border-color:#909090;
        border-width:1px;
        vertical-align:top;
    }
    -->
    </style>
     
    <layout:html>
    <form>
    <layout:grid cols="2" width="800" align="left">
        <layout:cell width="200" height="200" align="top" styleClass="box">
            <layout:collection name="LIST" id="user" indexId="r" styleClass="box" width="100%">
                <layout:collectionItem title="Login" name="user" property="login" />
                <layout:collectionItem title="Description" name="user" property="description" />
                <layout:collectionDetail name="user" property="listRoles"/>
            </layout:collection>
            <layout:detail layout="false" property="listRoles" key="Roles" styleClass="suppressed"/>
        </layout:cell>
        <layout:cell align="left" styleClass="box">
            <div id="listRoles" style="width:600px;"></div>
        </layout:cell>
     
        <layout:cell colspan="2">
            un texte en dessous...
        </layout:cell>
    </layout:grid>
    </form>
     
    </layout:html>
    La modification à apporter dans le fichier javascript.js (de struts-layout)
    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
    36
    37
    38
    39
    40
    41
    42
    function showDetail(id, line) 
    {
        // Get the object 
        var object = id[line];
        
        var fields = document.getElementsByTagName("input");
        var field;
        var value;
        
        // Update each property
        for (i in object) 
        {
        
            // find the field tag.
            field = null;
            for (j in fields) 
            {
                if (fields[j].type=="text" && fields[j].name==i) 
                {
                    field = fields[j];
                    break;
                }
            }
            
            if (field) 
            {
                value = object[i];
                field.value = value;
                
                if (document.getElementById(i) != null)
                {
                    field.style.visibility = "hidden";
                    document.getElementById(i).innerHTML = value;
                }
                else
                {
                    field.style.visibility = "visible";
                }
            }
        }
    }

  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
    Je n'ai pas le temps de tester mais comme je te l'ai dit précédemment, je ne suis pas surprise que cela ne fonctionne pas, d'autant plus si le javascript utilisé ne prévoit pas de traiter une liste, comme le signalait OButterlin.

    EDIT : grillée

Discussions similaires

  1. explications pour filtrer une collection avec iterator
    Par touftouf57 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/01/2010, 11h32
  2. [2005] Créer une procédure avec pour paramètre une table
    Par Sergejack dans le forum Contribuez
    Réponses: 2
    Dernier message: 01/10/2009, 15h22
  3. Réponses: 7
    Dernier message: 30/09/2009, 19h50
  4. objMessage.AddAttachment avec pour chemin, une variable
    Par jipechibi dans le forum VBScript
    Réponses: 3
    Dernier message: 07/10/2008, 11h24
  5. GetProperty pour obtenir une collection à partir d'un COM
    Par laurent_diep dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/03/2008, 17h24

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