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 :

reRender + binding


Sujet :

JSF Java

  1. #1
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut reRender + binding
    Yop,

    J'ai un certain nombre de champs dans mon formulaire que je dois générer dynamiquement en fonction des données contenues dans un fichier que l'utilisateur upload.
    La méthode que je pense la plus simple pour générer ces champs est d'utiliser l'attribut binding sur un panelGrid auquel j'ajoute programmatiquement des composants.

    Bref, j'ai un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <rich:fileUpload id="upload" fileUploadListener="#{bean.fileUploadListener}">
    	<a4j:support event="onuploadcomplete" ajaxSingle="true" 
    	reRender="parameters" />
    </rich:fileUpload>
     
    ...
    <h:panelGrid id="parameters" binding="#{bean.parameters}" />
    Avec dans mon bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private HtmlPanelGrid parameters;
    Le problème c'est que mon composant est bien modifié au niveau du bean mais il n'est pas mis à jour au niveau de l'interface, pas d'appel au getter non plus.

    Avez vous des idées ?

  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
    essaye avec:

  3. #3
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    pas de changement

  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
    et comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <a4j:outputPanel id="parameters">
    <h:panelGrid  binding="#{bean.parameters}" />
    </a4j:outputPanel>

  5. #5
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    non plus. J'ai essayé pas mal de combinaisons, avec et sans a4j:outputPanel, avec et sans process, avec et sans ajaxSingle... mais rien de concluant.

  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
    ton bean est dans quel scope?

  7. #7
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    request

  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
    et le code java?

  9. #9
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    bon, après quelques tests j'ai l'impression que ce qui se passe c'est que c'est la vue qui met à jour le modèle alors que je souhaite que ce soit l'inverse : à chaque requête j'ai une série d'appels au setter de mon composant et aucun appel au getter.

    Sinon qu'est ce que tu voudrais voir dans le code ?

  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
    pour voir si ton biding marche bien, utilise un h:commandButton dans l'actionListener tu peux mettre le code qui remplit le panelGrid..

  11. #11
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    le binding fonctionne, lorsque j'initialise la table dans le constructeur les valeurs sont bien affichées dans la page.

  12. #12
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    Bon, finalement le problème est qu'il n'y a aucun appel au getter de mon composant bind lors de la phase renderResponse en cas de postback (donc rien en cas de requête ajax, ou action/actionListener).
    Le seul get n'est effectué qu'en cas de requête initiale ...

    En gros j'arrive à mettre à jour mon composant que si je le stocke en session et que l'utilisateur rafraichit la page ... ce qui n'est absolument pas viable.

    C'est le comportement normal d'un composant bind ou y'a un couille dans le pâté ?

  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
    le bean qui contient le binding doit être dans un scope request.
    tu peux tester en ajoutant keepAlive. mais normalement, une requete ajax est comme une requete normal, le composant passe par les différentes phases JSF, sauf si on utilise ajaxSingle.

    si tu utilise <h:commandButton/> le getter sera automatiquement appelé peut plus qu'une fois même.
    tu n'a toujours pas posté ton code java, je ferais un test chez moi et je te tiens au courant.

  14. #14
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    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
    private HtmlPanelGrid parameters;
     
    public void fileUploadListener(UploadEvent event) {
    	[...]
    	generatePanel();
    }
     
    private void generatePanel() {
    	parameters = new HtmlPanelGrid();
    	UIOutput text = new UIOutput();
    	text.setValue("test");
    	UIColumn column = new UIColumn();
    	column.getChildren().add(text);
    	parameters.getChildren().add(column);
    }
    J'ai également testé avec un actionListener sur un commandButton qui appelle generatePanel mais ça ne change rien.
    Voici les phases lors du clic sur un commandButton :
    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
    beforePhase RESTORE_VIEW(1)
    ~~~~~CONSTRUCT~~~~~
    SETTER javax.faces.component.html.HtmlPanelGrid@141d281 : 0
    afterPhase RESTORE_VIEW(1)
    beforePhase APPLY_REQUEST_VALUES(2)
    afterPhase APPLY_REQUEST_VALUES(2)
    beforePhase PROCESS_VALIDATIONS(3)
    SOMEGETTER
    afterPhase PROCESS_VALIDATIONS(3)
    beforePhase UPDATE_MODEL_VALUES(4)
    afterPhase UPDATE_MODEL_VALUES(4)
    beforePhase INVOKE_APPLICATION(5)
    afterPhase INVOKE_APPLICATION(5)
    beforePhase RENDER_RESPONSE(6)
    SOMEGETTER
    afterPhase RENDER_RESPONSE(6)
    somegetter c'est le getter d'un simple champ texte de mon formulaire. Comme tu vois pas d'appel au getter de ma table.

  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
    Ceci fonctionne bien chez moi..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a4j:commandButton value="generate" actionListener="#{requestBean.addChild}" reRender="grid"/>
    <h:panelGrid id="grid" binding="#{requestBean.parameters}" />

    et dans le bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void addChild(ActionEvent e) {
     
    FacesContext context = FacesContext.getCurrentInstance();
    javax.faces.application.Application application = context.getApplication(); 
    HtmlOutputText text = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);	
    text.setValue("coucou");
    parameters.getChildren().clear();
    parameters.getChildren().add(text);
    }

  16. #16
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    effectivement, ça fonctionne également chez moi.

    J'ai fait quelques tests à partir de ton code et finalement le problème venait de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parameters = new HtmlPanelGrid();
    Apres quelques recherches, je pense que l'intro de cet article indique d'où venait mon problème.
    Le binding de composant se base sur la référence de l'objet dans le bean. Vu que je réinitialisais l'adresse à chaque instanciation il ne devait pas trouver le composant (d'ailleurs il n'y a vraiment pas d'appel au getter d'un composant bind en cas de postback).

    Dans tous les cas merci de ton aide.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/03/2011, 17h41
  2. Récupérer l'adresse de bind d'un socket
    Par gloode dans le forum Réseau
    Réponses: 4
    Dernier message: 04/02/2005, 10h56
  3. Bind ou pas Bind?
    Par jonzuzu dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 10h00
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54

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