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 :

Richfaces: Optimisation des reRender


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut Richfaces: Optimisation des reRender
    Bonjour à tous !

    J'ai actuellement 2 soucis non bloquant mais assez génant, je voudrai savoir si d'autres personnes on déjà eu ces problèmes. Visiblement, je n'ai pas trouvé de problème similaire dans le forum. Je précise que mes solutions fonctionnent mais sont loin d'être élégantes


    1er soucis :
    Tout d'abord, j'ai un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a4j:commandButton value="Ajouter" action="#{monController.ajouter}" reRender="ajoutPanel">
    </a4j:commandButton>   ----> Ce bouton modifie le boolean "monController.visible"
    Pourquoi suis-je obligé de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <a4j:outputPanel id="ajoutPanel">
        <a4j:outputPanel rendered="#{monController.visible}">
        ...
    </a4j:outputPanel>
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <a4j:outputPanel id="ajoutPanel" rendered="#{monController.visible}">
        ...
    </a4j:outputPanel>
    pour que le click sur mon bouton fasse apparaitre le panel ?


    2eme soucis dans la continuité du 1er :

    j'ai une rich:datatable dans un panel, un bouton et des champs dans un autre panel.
    Pourquoi est ce que lorsque je fait un rerender sur le panel contenant mes champs et mon bouton, ma datatable est également rechargé ?
    Au final, ça fonctionne bien entendu... Mais le nombre de requete sur la base est grandement augmenté.
    J'aimerai que SEUL mon panel avec mes champs et mon bouton soit rafraichis.
    J'espère être assez clair dans mes explications. Si tel n'est pas le cas, j'ai trouvé quelqu'un ayant un problème similaire, il explique peut être mieux que moi:
    http://www.seamframework.org/41028.lace

    Merci d'avance à ceux qui prendrons le temps de m'aider.

    David

  2. #2
    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 davidovitch Voir le message
    Bonjour à tous !


    Pourquoi suis-je obligé de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <a4j:outputPanel id="ajoutPanel">
        <a4j:outputPanel rendered="#{monController.visible}">
        ...
    </a4j:outputPanel>
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <a4j:outputPanel id="ajoutPanel" rendered="#{monController.visible}">
        ...
    </a4j:outputPanel>
    pour que le click sur mon bouton fasse apparaitre le panel ?
    C'est normal, tu ne peux pas faire un reRender sur un composant qui n'est pas présent dans le DOM, c'est pour celà que il faut faire le reRender sur le composant parent.


    Citation Envoyé par davidovitch Voir le message

    2eme soucis dans la continuité du 1er :
    peux tu nous montrer le code?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Merci beaucoup pour ton aide !

    C'est pas sur le composant "enfant" que tu voulais dire ?

    Voila le code (simplifié du 2nd souci). J'ai fait quelques modif depuis mon 1er post

    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
     
    <rich:dataTable id="maListe" binding="#{monController.dataTable}" value="#{monController.touteMaliste}" var="var" >
    		<rich:column>
    			..
    		</rich:column>
    		<rich:column>
    			..
    		</rich:column>
    </rich:dataTable>
     
    <a4j:form id="form">
     
            ---> rend monController.visible=true
            <a4j:commandButton value="Ajouter" action="#	{monController.ajouter}" reRender="ajout">
            </a4j:commandButton>
     
     
            <a4j:outputPanel id="ajout">	
    		<a4j:outputPanel rendered="#{monController.visible}">
    		        ...
                            ...
                            ...
    	                <a4j:commandButton value="Annuler" immediate="true" action="#{moncontroller.cachePanel}" reRender="ajout"></a4j:commandButton>
                            ---->Remet monController.visible=false
    	        </a4j:outputPanel>
    	</a4j:outputPanel>
    </a4j:form>
    Explication : Lors du clic sur Ajouter/Annuler, le panel "ajout" apparait/disparait (normal!) mais des requête sur la base qui sont également déclenchée pour actualiser la datatable alors que je n'ai pas demandé de rerender de cette dernière

  4. #4
    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
    Non tu le reREnder c'est sur le composant qui est toujours dans le DOM, donc le composant parent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <a4j:outputPanel id="panel">
     
    <xx:yyyy rendered="condition" />
     
    </a4j:outputPanel>
     
    <a4j:commandButton reRender="panel"/>
    pour le second problème, ajoute la table aussi dans le même formulaire..

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Pigé pour le 1er souci !

    Le 2eme, même en mettant tout dans le même form, même souci. j'avais déja tenté

  6. #6
    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 davidovitch Voir le message
    Pigé pour le 1er souci !

    Le 2eme, même en mettant tout dans le même form, même souci. j'avais déja tenté
    pas normal ça ..
    Est ce que par hasard la table est incluse dans un composants a4j tel que a4j:outputPanel avec ajaxRendered égal à true ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Le seul truc qui contient la table, c'est le define du template Facelets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ui:define name="content">
     
    		<h:outputText>Liste</h:outputText>
    		<a4j:form id="form">
    			<rich:dataTable id="maListe" binding="#{monControler.dataTable}"
                            ....
                            ....
    </ui:define>
    Pour compléter, il y a précisément deux requêtes qui sont déclenchée lors du clic sur annuler

  8. #8
    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 davidovitch Voir le message
    Le seul truc qui contient la table, c'est le define du template Facelets

    Pour compléter, il y a précisément deux requêtes qui sont déclenchée lors du clic sur annuler
    tu parles de requêtes sql?

    comment tu sais que la table est réactualisée?? ses valeurs changent??

    tu as essayé d'ajouter ajaxSingle à true?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Oui Oui, je parle de requêtes SQL.

    le "value" de ma datatable est relié à la couche service qui elle même est reliée à ma chouche DAO

    J'ai fait le test suivant :
    -Je vais sur ma page, ma datatable s'affiche
    -Je supprime manuellement des données dans ma table
    -Je clic sur annuler
    -ma datatable reste intacte ! en revanche, 2 requêtes sont enregistrée sur ma couche DAO

    AjaxSingle sur mon form, pas mieu

  10. #10
    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
    ça na rien avoir avec le reRender,
    tu dois faire appel à la requete dans le getter de la value de la dataTable..
    N'oublies pas que le getter est appelé plusieurs fois pendant le traitement de ta page..
    Ceci dit, tu peux éviter que la table soit traités pendant une requete ajax, l'aide des attributs, ajaxSingle, limitToList, process . regarde la documentation de Richfaces concernant ces attributs ajax.
    ajaxSingle pas sur le form, et utilise un formulaire normal, tu n'a pas besoin de a4j:form dans ton cas.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    tu dois faire appel à la requete dans le getter de la value de la dataTable..
    C'est déja le cas.

    Je regarde demain pour le ajaxSingle sur le a4j:commandButtonbien sur
    Fatigue...

    N'oublies pas que le getter est appelé plusieurs fois pendant le traitement de ta page..
    ça par contre, je ne le savais pas. Voila donc la source de mes requêtes multiples. tu contournerai ça uniquement avec les ajaxSingle du coup ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Après tests

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4j:commandButton value="Annuler" immediate="true" ajaxSingle="true" limitToList="true" action="#{monController.toogleAjoutPanel}" reRender="ajout"></a4j:commandButton>
    C'est mieux, je n'ai plus qu'une requête de lancée. mais c'est encore une de trop pour être correctement optimisé.
    Je veux éviter cette requête car je ne fait que masquer un panel. ça fait en cher performance juste pour un masquage.

  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
    Citation Envoyé par davidovitch Voir le message
    C'est déja le cas.
    C'est ce qu'il faut éviter de faire..
    le getter dois seulement retourner la valeur, et pas faire appel à la base, tu va lancer plusieurs requêtes inutiles.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    tu dois faire appel à la requete dans le getter de la value de la dataTable..
    le getter dois seulement retourner la valeur, et pas faire appel à la base, tu va lancer plusieurs requêtes inutiles.
    C'est contradictoire non ?

    Pour être propre, à quel moment il serai préférable que je la fasse cette requête si je ne la met pas le le getter du value de ma datatable ?

    On approche de la solution la je pense

  15. #15
    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 me suis mal exprimé,

    je voulais dire, je suppose que tu fais appel à la requete dans le getter....

    Citation Envoyé par davidovitch Voir le message
    Pour être propre, à quel moment il serai préférable que je la fasse cette requête si je ne la met pas le le getter du value de ma datatable ?

    On approche de la solution la je pense
    ça dépend, tu peux calculer la liste avant l'affichage de la page dans une fonction appelé sur une action de l'utilisateur..sinon au pire, si il n'y a pas de d'action utilisateur, tu peux aussi faire l'appel dans le constructeur..

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    En effet par le constructeur, ça fonctionne ! Par contre, je suis obligé, dans ma déclaration spring de passer bon bean de ma couche service en argument de mon bean controller et non plus en properties injecté.

    Y'a plus propre ou c'est correct ?

    Dans tous les cas, merci encore pour ton coup de main. Il est très appréciable

  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
    je ne sais pas comment tu utilise le bean controller et le service, mais normalement tu n'a pas besoin d'injecter un bean service, faut utilise un serviceLocator.
    sinon le mieux c'est d'avoir un backinBean JSF qui contient les informations nécessaires à la vue qui contient que des valeurs. un bean 'manager' qui fait appel à la couche DAO et qui valorise ton backing bean.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    je ne sais pas comment tu utilise le bean controller et le service, mais normalement tu n'a pas besoin d'injecter un bean service, faut utilise un serviceLocator.
    J'ai un bean DAO, un bean 'Service', un bean controller.
    Lors de la déclaration Spring, je déclare mon dao, ensuite je déclare mon service avec mon dao comme properties et ensuite, je déclare mon controller avec mon service en argument du constructeur.

  19. #19
    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
    juste que le service normalement doit être appelé avec un ServiceLocator..
    regarde un petit cours de design pattern, c'est un pattern très utilisé.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Je zieute je zieute. merci de la piste.
    En merci aussi pour ton aide et tes conseils.

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

Discussions similaires

  1. [Disques durs] Optimisation des partitions
    Par DarkOcean dans le forum Composants
    Réponses: 18
    Dernier message: 10/02/2005, 13h54
  2. Optimisation des tables
    Par le-roy_a dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 24/01/2005, 10h04
  3. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  4. [Compilateur] Optimisation des conditions
    Par Pedro dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 13h49
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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