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 :

Raffraichissement update apres suppression row dans datatable


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut Raffraichissement update apres suppression row dans datatable
    Bonjour
    Est ce que quelqu'un peut me donner une piste sur comment puis faire pr raffraichir uniquement un element ?

    J'utilise un dataTable de richfaces. J'affiche des membres de ma BD puis je supprime selon la ligne selectionné.

    Pour l'instant ca ne fait que le travail côté serveur, ca supprime ds ma base et ca ne se raffraichit pas sur la partie graphique. J'ai essayé de le faire mais sans succé. Je vous met mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <rich:dataTable value="#{MemberController.memberName}" var="dataItem" binding="#{MemberController.dataTable}">
    .....
    <h:commandButton id="dataTable" value="Supprimer">
                                <a4j:support event="onclick" action="#{MemberController.deleteMember}" immediate="true" reRender="dataTable"/>
     </h:commandButton>
    Cela supprime bien ma ligne mais ca ne se raffraichit pas. J'ai utilisé richfaces pour justement les requête ajax et éviter de tout recharger.

    Peux t'on me donner les pistes svp ?
    Je me demande si je dois créer un nouvelle méthode "update" qui va de nouveau lire ma base mais ds ce cas, je perds l'avantage d'ajax.

    Je maitrise mal les balises "a4j:support". Avant j'utilisé "a4j:commandButton" mais sans succé

    Merci de votre aide

  2. #2
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Le composant a rafraichir est le datatable.
    donc vous devez donner un id au datatable et faire un reRender depuis <a4j:event>

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Tout d'abord Merci pour ton aide

    C'est ce que j'avais fait au debut de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <rich:dataTable value="#{MemberController.memberName}" var="dataItem" id="dataTable"..
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <a4j:commandButton value="Supprimer" 
             action="#{MemberController.deleteMember}" reRender="dataTable">
    </a4j:commandButton>
    Mais ca ne marche pas

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    J'ai testé ca aussi mais cela fait comme un raffraichissement de ma page (comme f5 en visuel) mais ma ligne supprimé est toujours à l'écran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h:commandButton id="dataTable" value="Supprimer">
         <a4j:support event="onclick" action="#{MemberController.deleteMember}" immediate="true" reRender="dataTable"/>
    </h:commandButton>
    ???

  5. #5
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    ok , lorsque tu fais un reRender pour le dataTable en effet tu fais un appel pour la méthode MemberController.getMemberName() . c'est la liste qui alimente ton dataTable.
    il faut que tu actualise cette liste .
    par exemple dans cette méthode tu peux faire une requête a ta base de donnée pour qu'elle te renvoie la liste des nouveaux membres

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Je ne suis pas sur de comprendre la methode. Tu me conseils de refaire une requête pr actualiser ma nouvelle base de donnée.

    Ce que je ne saisie pas trop, c'est ou la mettre. Je voulais la mettre dans ma methode delete mais cela ne fonctionne pas.

    Si je comprends ce que tu me dis, tu me conseils de mettre une requête dans ma methode ou se situe ma liste "memberName" ??

    Car je fais djà une requete select avec mon datamodel dessus...

  7. #7
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    je m'explique encore plus :
    si t'as bien fait le reRender sur ton datatable et malgres ceci elle ne s'actualise pas donc ceci signifie que l'élément que te l'as supprimé de ta base de donnée se trouve encore dans ta liste qui alimente le datatable
    c'est pour ça que je t'ai conseillé de refaire ta requete select apres la suppression

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Il doit avoir quelque chose qui m'échape car je ne comprends pas comment puis refaire une requête select étant donné que mon composant "dataDatble" utilise une dataModel unique qui requête dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      <rich:dataTable value="#{manageBeanMember.memberList}"....
    Je n'ai aucun moyen pour raffraiichir mon dataTable avec une autre requête select ?? Sauf si elle peut prendre après "action" peut prendre plusieurs apel...

    Je vous met mon code si vous voyez quelque chose (comme pourquoi le rendered de mon bouton ne fonctionne pas à me mettre à jour mon dataTable apres la suppression de ma ligne ???????????????? °


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     <rich:dataTable value="#{manageBeanMember.memberList}" var="dataItem"
                                       width="100%" binding="#{manageBeanMember.dataTable}">
    ...
    <h:commandButton id="dataTable" value="Supprimer">
                                        <a4j:support event="onclick" action="#{manageBeanMember.deleteMember}" immediate="true" reRender="dataTable"/>
    </h:commandButton>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //methode delete de l'instance de classe manageBeanMember
        public void deleteMember() {
            Member memb = (Member) dataTable.getRowData();
            helper.deleteQuery(memb);
        }
    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
     
    public void deleteQuery(Member memb) {
            List<Member> memberList = null;
            try {
                this.session = HibernateUtil.getSessionFactory().openSession();
                Transaction tx = session.beginTransaction();
                session.delete(memb);
                tx.commit();
                System.out.println("Delete successfully!");
            } catch (HibernateException e) {
                System.out.println(e.getMessage());
            } finally{
                //session.close();
            }
        }
    J'arrive à ne pas faire marcher mon rendered ou a trouver un moyen de raffrachir par une autre requete selcte mon dataTable.

    Merci pour le coup de pousse

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    N'utilise pas immediate,

    tu peux utiliser simplement a4j:commandButto et faire le reRender sur la table pas le commandButton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <rich:dataTable:id="table"
    .....
     
     
    <a4j:commandButton  value="Supprimer" action="#{manageBeanMember.deleteMember}"  reRender="table" />
    en debug, met un point d'arrêt sur la fonction supprimer pour voir s'il le traitement a bien été fait. tu peux aussi afficher les logs des phases JSF (voir faq).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Merci pr la reponse
    Cela ne marche tjs pas.

    J'ai remis comme tu me l'as dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <a4j:commandButton value="Supprimer"
                                            action="#{manageBeanMember.deleteMember}" reRender="dataTable">
    </a4j:commandButton>
    Avec mon enteted de ma dataTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <rich:dataTable value="#{manageBeanMember.memberList}" var="dataItem"
                                       rowClasses="row1, row2" id="dataTable" rows="4"
                                       width="100%" binding="#{manageBeanMember.table}">
    Je me pose la question si le binding n'est pas en cause.
    Pour le debug, le traitement se fait bien...

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 68
    Par défaut
    essaye de re-récuperer la liste de ta dataTable

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Je pense avoir trouver la cause mais j'arrive pas à trouver une solution au probleme.

    Quand je j'initialise mon dataModel, j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public DataModel getMemberList() {
            if (memberList == null) {
                memberList = new ListDataModel(helper.initQuery());
            }
            return memberList;
        }
    donc quand je supprime une ligne et que mon rendered souhaite se mettre à jour avec cette méthode (si j'ai bien compris le fonctionnement), il ne rentre pas ds le if vu que mon dataModel n'est pas "null".

    Si c'est bien ça, si j'essaye d'enlever le "null" ca marche pas. Ca ne fait que charger sans afficher la page.

    Est ce que ça serait ça selon vous ?

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Déjà pourquoi tu utilise le binding? je pense que tu n'en a pas besoin, ça risque que de te créer des soucis.
    et pourquoi tu utilise un dataModel, si tu n'en a pas un besoin particulier, utilise seulement une liste d'objets.
    Ensuite, ton bean est il bien dans un scope session? ou en request avec keepAlive?
    Vérifie bien que l'action de suppression s'exécute bien..
    Enfin, n'oublie pas d'entourer ta dataTable et ton commandbutton d'un h:form.

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Je viens de remarque que tu supprime la ligne de base, mais, tu ne la supprime pas du bean, il faut à la fin mettre al liste à null pour la recalculer à partir de la base.

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 68
    Par défaut
    Citation Envoyé par raimus88 Voir le message
    Je pense avoir trouver la cause mais j'arrive pas à trouver une solution au probleme.

    Quand je j'initialise mon dataModel, j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public DataModel getMemberList() {
            if (memberList == null) {
                memberList = new ListDataModel(helper.initQuery());
            }
            return memberList;
        }
    donc quand je supprime une ligne et que mon rendered souhaite se mettre à jour avec cette méthode (si j'ai bien compris le fonctionnement), il ne rentre pas ds le if vu que mon dataModel n'est pas "null".

    Si c'est bien ça, si j'essaye d'enlever le "null" ca marche pas. Ca ne fait que charger sans afficher la page.

    Est ce que ça serait ça selon vous ?
    ou i c'est tout à fait à cause de ça.
    Ce que tu peux faire, c'est soit mettre ta liste à null comme te l'a suggéré Sniper sinon tu peu créer un booléen eu tu mets à true qd tu exécutes ta méthode de suppression et quand tu remplis ta liste tu le mets à false et ainsi t'auras comme condition
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    if(memberList == null && isBoolean())

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Merci beaucoup ca marche, encore debutant d'ou ce genre de maladresse

    Je suis en scope session et justement je me posais la questions si il était necessaire que j'ouvre et je ferme une session pour chacune de mes requete. Je ne sais pas si c'est deux choses differentes ou peut etre que ce n'est pas la peine de le faire ???

    J'ai mis le binding car je pensais qu'il était necessaire au composant. D'apres ce que j'ai vu, le binding met en relation le composant à mon bean. J'ai essayé de l'enlever, met j'obtiens un "NullPointerException". En faite je l'utilise un peu partout ds mon bean avec getRowCount() etc...

    La derniere (qui est bizarre), c'est que si j'entoure mon a4j:commandButton d'un h:form, cela ne marche pas ?

    Merci en tt cas de votre aide ( a ts les 2)

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par raimus88 Voir le message
    Merci beaucoup ca marche, encore debutant d'ou ce genre de maladresse

    Je suis en scope session et justement je me posais la questions si il était necessaire que j'ouvre et je ferme une session pour chacune de mes requete. Je ne sais pas si c'est deux choses differentes ou peut etre que ce n'est pas la peine de le faire ???

    J'ai mis le binding car je pensais qu'il était necessaire au composant. D'apres ce que j'ai vu, le binding met en relation le composant à mon bean. J'ai essayé de l'enlever, met j'obtiens un "NullPointerException". En faite je l'utilise un peu partout ds mon bean avec getRowCount() etc...

    La derniere (qui est bizarre), c'est que si j'entoure mon a4j:commandButton d'un h:form, cela ne marche pas ?

    Merci en tt cas de votre aide ( a ts les 2)
    pour le scope session, à toi de voir, le mieux est d'utiliser keepAlive, pour garder le bean actif que pendant les requetes ajax pour ne pas surcharger la session.
    Pour le binding, fait attention , la spécification JSF oblige de mettre le composant du binding dans un scope request, tu risque d'avoir des problèmes type: double id for component...
    et pour le h:form, a4j:commandButton ou h:commandbutton ne peux pas fonctionner s'il n'est pas inclus dans un form, mais il faut mettre des form imbriqué..un en début de la vue qui contient tous les inputs/commands est suffisant.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Ah ok, tres interessant.

    il faut donc mieux que j'essaye d'enlever le binding. Mais comment relier ma variable (que je me sert dans mon bean pour recuperer ma ligne active par exemple) avec mon composant.

    Car je le faisait avec le binding
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binding="#{manageBeanMember.table}"
    ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Pardon je viens de te relire, le scope est soit en session, soit en request avec keepAlive.

    Je vais me documenter sur request et keepalive pour voir savoir comment parametrer et comment il fonctionne. (et surout la differnce entre les deux pr le code si cela change quelque chose)

    merci

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    si tu utilise le binding juste pour récupérer la ligne de la dataTable, ce n'est pas utilise le garder, tu trouvera dans la faq d'autres solutions pour ça..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Suppression Row dans une DataGridView avec click droit
    Par didou038 dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/01/2015, 17h37
  2. Réponses: 0
    Dernier message: 24/05/2010, 22h02
  3. Réponses: 7
    Dernier message: 16/09/2009, 16h27
  4. Réponses: 36
    Dernier message: 26/11/2008, 16h55
  5. Problème de taille après suppression de lignes dans un recordset...
    Par nikko_54 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2006, 22h18

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