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

JSF Java Discussion :

Clé en paramètre avec un commandlink et datatable


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut Clé en paramètre avec un commandlink et datatable
    Bonjour à tous,

    Dans le cadre d'un projet scolaire, je désire développer un petit forum très simple. Mon professeur nous a introduit un peu au JSF et ça m'a semblé un choix idéal pour mon projet.

    J'ai une simple architecture comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Catégories
             |--> Sujets
    		|--> Messages
    J'ai choisi d'afficher les différents choix de catégories et de sujets avec le composante datatable. Les données proviennent d'une bean qui appelle une base de données Mysql.

    Lorsque je clique sur une catégorie, je dois transmettre à ma bean une clé qui correspond à la clé de la catégorie à afficher.

    J'aimerais savoir comment transmettre un paramètre à ma bean lorsque je clic sur mon commandlink.


    OutAffichage est une bean qui possède une méthode qui retourne une List:
    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
     
    public java.util.List getCategorie()
        {
            ResultSet rs = null;
            boolean boucle = true;
            objAffichage obj;
     
            String sql = "SELECT IDCategorie, NomCategorie , COUNT(s.IDSujet) AS NB " +
                         "FROM Categorie c " +
                         "left join Sujet s on c.IDCategorie = s.IDCategorie " +
                         "GROUP BY NomCategorie";
     
            try
            {
                m_SqlBean.OuvertureConnexion();
                rs = m_SqlBean.ExecSelect(sql);
     
                categorie.clear();
     
                // Crée la liste à partir du ResultSet
                rs.first();
     
                while ( boucle )
                {
                    if ( rs.isLast() )
                        boucle = false;
     
                    obj = new objAffichage();
                    obj.setCle(rs.getString("IDCategorie"));
                    obj.setNom(rs.getString("NomCategorie") );
                    obj.setNbPost( rs.getString("NB") );
     
                    categorie.add(obj);
     
                    rs.next();
                }
     
     
                m_SqlBean.FermerConnexion();
     
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
     
            return categorie; 
        }
    Voici mon code de datatable présentement:
    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
     
    <h:dataTable value="#{OutAffichage.categorie}" var="objAffichage" border="1" 
                                                bgcolor="#bec18e" cellspacing="2" width="800">
     
                        <h:column>
                            <c:facet name="header">
                                <h:outputText value="Nom des catégories" />
                            </c:facet>
                            <h:commandLink action="#{OutAffichage.setTest}" value="#{objAffichage.nom}" >
                                <c:param name="test" value="#{objAffichage.cle}" />
                            </h:commandLink>
                        </h:column>
     
     
                        <h:column>
                            <c:facet name="header">
                                <h:outputText value="Nombre de Sujets" />
                            </c:facet>
                            <h:outputText value="#{objAffichage.nbPost}" />
                        </h:column>
     
                        </h:dataTable>
    J'ai tenté avec <c:param .../> mais je ne sais pas trop comment le récupérer. J'ai créer une méthode setTest(String pParam) mais ça fonctionne pas.
    J'ai cherché sur le forum mais il existe beaucoup de technos différentes ( tomahaw?, Struts) et je suis un peu perdu dans tout ça.

    Merci de votre aide.

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Comme expliqué dans un autre post, l'objet DataTable propose une méthode qu'elle est bien : getRowData().
    Quand tu cliques sur un lien se trouvant dans une ligne du tableau, cette méthode te permet, dans ton bean, de retrouver l'instance de l'objet affiché sur cette ligne.
    En récupérant cet objet, tu peux récupérer (par le getter correspondant) l'identifiant de la catégorie que l'utilisateur a sélectionnée.

    N'hésite pas à poser d'autres questions si ce n'est pas très clair pour toi.

    Autre chose : Je te conseille fortement de diviser ton application en couches (concept MVC) :
    • Une couche DAO, qui va se charger des accès base de données.
    • Une couche service, qui propose les services du genre "récupérer la liste des catégorie", "sauvegarder un nouveau message", etc.
    • Une couche présentation (les beans par exemple).
    Ce qui permettrait d'avoir un peu ce genre d'aller retour :
    Page JSF -> Bean -> Service -> DAO -> B.D. -> DAO -> Service -> Bean -> Page JSF.

    C'est plus long que d'écrire directement le code SQL dans ton bean, c'est vrai, mais c'est 1000 fois plus propre, pratique et maintenable.
    Tu peux trouver plein de discussions sur ce sujet dans ce forum et les autres forums Java...
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Bonjour romaintaz

    Citation Envoyé par romaintaz Voir le message
    Comme expliqué dans un autre post, l'objet DataTable propose une méthode qu'elle est bien : getRowData().
    J'avais vu ce poste mais il y a quelque chose que je ne comprend pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bidule selectedElement = (Bidule) myDataTable.getRowData();
    Ce code je le place dans la méthode appellée par l'action de mon commandlink. Par contre, qu'est-ce que myDatatable?
    Dans l'explication, il est dit:
    L'objet myDataTable est le composant lié à ma datatable dans la page JSF.
    Dans mon cas, la datatable est créée partir d'une List retournée par ma fonction. Ma list est membre de ma bean mais elle ne possede pas de méthode .getRowData();


    Citation Envoyé par romaintaz Voir le message
    Page JSF -> Bean -> Service -> DAO -> B.D. -> DAO -> Service -> Bean -> Page JSF.
    J'ai déja prévu ca dans mon code:
    Page JSF -> OutAffichage -> SqlBean -> BD

    J'ai mis la string sql dans outaffichage afin de couper les coins ronds pour faire mon poste. Je vais me renseigner sur MVC.



  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour.
    La façon la plus clean et simple que j'ai trouvé pour récupérer la ligne sélectionné dans une dataTable est la suivante:
    Dans le managed bean, je déclares:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import javax.faces.model.DataModel;
    import javax.faces.model.ListDataModel;
     
    :
    :
    :
     
    private List<T> entityList = new ArrayList<T>();
    private DataModel entityModel = new ListDataModel();
    quand je récupère mes données de la couche DAO (ou Service pour des applications plus complexes), je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    entityList=entotyDao.findAll();
    entityModel.setWrappedData(entityList);
    Je fais aussi un getter sur le dataModel, pas sur liste.

    Dans les vues, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <h:dataTable value="#{monBean.entityModel}" var="x" >
    :
    :
    :
    </h:dataTable>
    Voilou. ensuite, si on clique sur un commandLink ou un commandButton sur une ligne, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T c = (T) entityModel.getRowData();
    Et là, je récupère dans c l'objet représentée par la ligne activée.

    Bonne chance.

  5. #5
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Chaque composant présent dans tes pages JSF est "représenté" du côté serveur par une classe Java.
    Dans le cas d'un composant <h:datatable>, c'est un objet de classe HtmlDataTable.

    Pour récupérer la datatable, 2 solutions :

    #1. Récupération via l'arbre des composants JSF:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monComponent = (HtmlDataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("idDuComposant");
    A noter que l'ID du composant doit être son ID complète, c'est-à-dire préfixée par les ID de tous les composants implémentant l'interface NamingContainer et séparés par des ":".
    Par exemple, dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <h:form id="myForm">
        <h:dataTable id="myTable" ...>
    l'id en question sera "myForm:myTable".

    #2. Par l'évènement JSF:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void selectionneElement(ActionEvent evt) {
        // On récupère la datatable.
        HtmlDataTable table = (HtmlDataTable) evt.getSource();
        ...
    }
    où tu auras mis "selectionneElement" comme valeur de l'attribut actionListener du lien présent dans la ligne de ton tableau.
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Merci à vous deux pour ces précieuses informations.
    Je teste tous ça demain et je reviens vous donnez du feedback

  7. #7
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Tout fonctionne merveille.

    Merci de votre aide.

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

Discussions similaires

  1. Déterminer une requête paramétrée avec LIKE
    Par priest69 dans le forum Access
    Réponses: 4
    Dernier message: 24/10/2005, 19h29
  2. [Tableaux] passer un paramètre avec un popup
    Par lnikolanta dans le forum Langage
    Réponses: 6
    Dernier message: 11/10/2005, 16h36
  3. Réponses: 2
    Dernier message: 12/09/2005, 15h33
  4. Date nulle dans une requete paramétrée avec TParameter
    Par denrette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/06/2004, 08h37
  5. Récupération des paramètres avec une procedure stockée
    Par samlerouge dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/03/2004, 22h00

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