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 :

rafraichir un element d'une page


Sujet :

JSF Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut rafraichir un element d'une page
    bonjour,

    Je cherche s'il est possible de rafraichir un element d'une page JSF. J'ai un page qui permet d'envoyer les données d'une base de données 1 vers une base de données 2. Cette page contient un élément selectManyListbox où l'utilisateur choisit ce qu'il souhaite tranferer. A la fin du transfert j'affiche un message pour indiquer que l'opération est terminée.

    Mon problème c'est que la page n'est pas rafraichie et que la liste contient tout les éléments alors que je voudrais quelle ne contienne que les élement non transferrée ou qu'elle soit vide suite au transfert.

    Pour afficher le message j'utilise la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    msgError = bundle.getString("synchronization_successful");
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_INFO, msgError, msgError));
    et je retourne null. C'est a cause de mon null que la liste n'est pas rafraichi mais je ne sait pas comment je peux faire pour 1 avoir mon message (ou pas de message si le transfert n'a pas encore au lieu) en sachant que l'on peut acceder a cette page par plusieurs moyen (difficile de gérer un boolean en session) et 2. rafraichir le contenu de ma liste.

    Voici le code de ma liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h:selectManyListbox id="listSynchronization" styleClass="bigListbox" value="#{Synchronization.toSynchronizeSelected}">
                                            <f:selectItems value="#{Synchronization.toSynchronize}"/>
                                        </h:selectManyListbox>
    Voici mes accesseurs/mutateurs
    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
     
    public String[] getToSynchronizeSelected() {
            getSessionBean().setSelectedItemToSynchronize(null);
            return toSynchronizeSelected;
        }
     
        public void setToSynchronizeSelected(final String[] l) {
            this.toSynchronizeSelected = l;
        }
     
        public SelectItem[] getToSynchronize() {
            final SelectItem[] groupOptions = loadGroupOptions();
            final SelectItem[] userOptions = loadUserOptions();
     
            final SelectItemGroup groups = new SelectItemGroup();
            groups.setLabel(bundle.getString("synchronization_groups"));
            groups.setSelectItems(groupOptions);
     
            final SelectItemGroup users = new SelectItemGroup();
            users.setLabel(bundle.getString("synchronization_users"));
            users.setSelectItems(userOptions);
     
            toSynchronize = new SelectItem[]{groups, users};
            toSynchronizeSelected = getSessionBean().getSelectedItemToSynchronize();
     
            return toSynchronize;
        }
     
        public void setToSynchronize(final SelectItem[] dol) {
            this.toSynchronize = dol;
        }
    Merci pour votre aide

  2. #2
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    utilise Richfaces tu vas trouver ton perdus

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Je 'nai aps le droit d'utiliser de librarie particulière. Je dois tout faire avec du JSF pur

    Ou peut etre en java script mais la je connais pas et je sais pas s'il est possible de rafraichir un element en recuperant la valeur souhaiter dans le bean.

  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
    Citation Envoyé par Jacobian Voir le message
    utilise Richfaces tu vas trouver ton perdus
    il ne faut pas itoujours incriminer Richfaces , le problème est peu etre du pure JSF, les messages sont ajoutés au context dans une phase après ils ne sont plus pris en compte, c'est peu être du à ça ton problème..
    désolè de ne pas etre plus clair, je n'ai pas eu le temps de bien regarder le code, j'en dirais plus plus tard s'il n'y a pas de réponses.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ne renvoie pas null dans ton action, mais renvoie un résultat cohérent. Ensuite, si tu veux rester sur la même page, il suffit de mettre en place une navigation rule de la page vers elle même.

    Enfin, pour ton problème de "rafraichissment", c'est tes méthodes loadXXXX() qui renvoient la liste à afficher, jsf ne fait aucun cache nulle part de ce coté là. Si cette liste est mauvaise à l'affichage, c'est donc toi qui génère des mauvaises valeurs.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Le problème c'est que si je fais un renvoi sur ma page avec la anvigation. Je perd mon message d'information pour indiquer à l'utilisateur que le transfert c'est bien passé ou non.

    En supposant que j'utilise la navigation :Comment faire pour savoir si cette page est simplement afficher à la demande de l'utilisateur en cliquant sur l'un des liens ou bien si j'affiche cette page suite a un transfert ? Comment garder mon message d'information?

    EDIt : je sais que mon getteur fonctionne correctement car suite a un transfert si je rafraichit ma page ma liste est bien vide.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Edta Voir le message
    Le problème c'est que si je fais un renvoi sur ma page avec la anvigation. Je perd mon message d'information pour indiquer à l'utilisateur que le transfert c'est bien passé ou non.
    Ca ne se produit que si tu met <redirect/> dans ta règle de navigation. Tu n'en a pas besoin.

    Citation Envoyé par Edta Voir le message
    je sais que mon getteur fonctionne correctement car suite a un transfert si je rafraichit ma page ma liste est bien vide.
    Ca prouve juste que le getteur qui fonctionne mal est request scope. Quand tu rafraichis manuellement la page, tu fait une nouvelle requête, les bean request scope sont donc recréés à partir de 0. Tu dois donc chercher où, toi, tu fais du cache d'information dans le request scope. Sans voir le code de ton bean, difficile à dire, mais tu fais probablement quelque chose comme çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    X x;
    public X getX(){
     if (x==null)
        creerX();
     return x;
    }

    Ce genre de caching de donnée pose problème si tu veux que ton getteur envoie des informations différentes entre avant et après l'action.

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Effectivement si je ne mets pas le redirect le message s'affiche. Par contre j'ai pas de fonction get comme tu le montre. C'est juste un backing bean. dans le fichier faces-config il est déclaré en request.

    Voici le code java :

    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
     
    /** Backing Bean of the Synchronization.jsp.
     */
    public class Synchronization {
    //declaration de mes EJB
        private static final String PREFIX_GROUPS = "group_";
        private static final String PREFIX_USERS = "user_";;
        private SelectItem[] toSynchronize;
        private String[] toSynchronizeSelected;
        private final ResourceBundle bundle = NewApplicationBean.getRessourceBundle();
     
     
       /** Construct a new Page bean instance.
         * @throws javax.naming.NamingException when EJb not found
         */
        public Synchronization() throws NamingException {
            groupsManager = EJBUtils.getEJB(GroupManagerRemote.class);
            userManager = EJBUtils.getEJB(UserManagerRemote.class);
        }
     
      // ensuite il y a le code déjà donné

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Je suis toujours sur mon problème, j'ai essayé de jouer avec la balise META mais bon cette fois comme ma page se rafraichit toutes les 3 secondes ma liste est bien mise à jour mais mon message d'information reste 3 secondes puis disparait.

    Je dois bien rester sur le système de la navigation mais se que je comprends pas comment fonctionne le cycle de JSF. Comme je lui indique une règle de navigation il devrait recrèer une requête pour affichier ma page "rafraichie" non? alors pouruqoi mon message apparait mais ma liste n'est pas refaite? si vous avez des idées je suis à votre écoute

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Le cycle de vie JSF c'est

    1. restore view or create view
    2. apply request value
    3. validate
    4. convert / update model
    5. invoke application (appel de l'action mentionnée dans le commandbutton)
    6. render

    En cas d'invoke application réussi (ton cas),


    Si tu met le <redirect/>, dans l'étape render JSF va juste envoyer un message au browser disant "la page a changé d'address", et le browser va faire une nouvelle requête. Tout ce qui est request scope aura donc été remis à 0 lors de la deuxième requete (ça inclu les bean request scope et les messages)

    Si tu ne met pas le <redirect/>, jsf va afficher la vue mentionnée dans la règle de navigation. On reste dans la même requête -> on garde les bean en état actuel ainsi que les messages.


    Si des données changent pendant le invoke application et qu'elles doivent se refléter dans tes beans, c'est à toi de gérer/coder correctement tes beans en fonction de ça pour qu'il fournissent des informations à jour. En l'occurence ici, je suppose que ton action modifie la DB mais que tu ne met pas à jour tes listes d'EJB.

  11. #11
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Bon se que tu dis n'est pas tout a fait faux. C'est se qui m'a mise sur la voie. En fait le transfert des données de la base & à la base 2 et fait avec un schduling (car possibilité de règler la date et l'heure du transfert) et même si ce transfert est immédiat, la page est réaffiché avant que mon autre thread est fini d'éxécuter le transfert.

    Le seul moyen de pouvoir rafraichir cette liste et d'intégrer de l'ajax (à mon avis) donc je laisse tomber pour l'instant n'ayant pas l'accord de l'utiliser.

  12. #12
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Bonjour,

    Je susi de nouveau sur mon problème de rafraichissement de ma liste. Cette fois j'ai la possibilité d'ajouter la libraire dAJAX au projet mais je n'ai pas trouvé comment faire un rafraichissement de la liste de façon périodique. Auriez vous une idée. Avez vous de bon tutorial à m'indiquer?

Discussions similaires

  1. compter le nombre d'element dans une page
    Par the-destroyer dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/10/2009, 19h24
  2. Rafraichir un élément d'une page
    Par Edta dans le forum JSF
    Réponses: 8
    Dernier message: 21/08/2009, 15h25
  3. Connaitre le nom des elements d'une page internet
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/06/2009, 11h46
  4. fixer des elements d'une page
    Par jmjmjm dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 02/11/2006, 23h55

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