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 :

JSF2 - Component, traitement initial au chargement de la page


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut JSF2 - Component, traitement initial au chargement de la page
    Bonjour à tous

    Je teste actuellement les composants jsf2.
    Je tente de faire un composant pour gérer les clés étrangères. Le principe est simple, on a un champ de saisie qui représente un identifiant de la clé étrangère et le composant se charge de rechercher le libellé associé... bref, très simple fonctionnellement...
    Lorsque je modifie la valeur de la référence, ça fonctionne correctement (ou presque parce que si je reviens à la valeur initiale, le listener n'est pas appelé)
    Mon problème de base est d'appeler le listener à la création de la vue.
    Est ce qu'il y a une solution à ce problème ?

    Le contexte est le suivant :

    - PrimeFaces 3.2
    - Eclipse Indigo
    - Java 1.7

    Code du composant
    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
     
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:composite="http://java.sun.com/jsf/composite"
        xmlns:p="http://primefaces.org/ui">
     
    <composite:interface>
        <composite:attribute name="value" required="true" />
    </composite:interface>
     
    <composite:implementation>
        <nobr>
            <p:inputText value="#{cc.attrs.value}" valueChangeListener="#{personReference.identityChanged()}" update="personLabel" immediate="true" onchange="submit();"/>
            <h:outputLabel id="personLabel" value="#{personReference.label}"/>
        </nobr>
    </composite:implementation>
     
    </html>
    Le ManagedBean PersonReference
    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
    49
    50
    51
    52
    53
    54
    55
     
    package com.sample.bean;
     
    import javax.ejb.EJB;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import javax.faces.event.ValueChangeEvent;
    import com.sample.ejb.PersonSingletonBean;
    import com.sample.model.Person;
     
    @ManagedBean(name = "personReference")
    @ViewScoped
    public class PersonReference
    {
        private String label;
     
        @EJB
        private PersonSingletonBean ejb;
     
        public PersonReference()
        {
            super();
        }
     
        public String getLabel()
        {
            return label;
        }
     
        public void setLabel(String label)
        {
            this.label = label;
        }
     
        public void identityChanged(ValueChangeEvent event)
        {
            if (event != null)
            {
                extractLabel(event.getNewValue().toString());
            }
        }
     
        private void extractLabel(String value)
        {
            Person person = ejb.get(value);
            if (person != null)
            {
                setLabel(person.getName());
            }
            else
            {
                setLabel("La personne n'existe pas !");
            }
        }
    }
    La page de test
    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
     
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:util="http://java.sun.com/jsf/composite/component"
        xmlns:p="http://primefaces.org/ui">
     
    <ui:composition template="/template/template.xhtml">
        <ui:define name="content">
     
            <h:form id="jsfform1">
     
            <util:personReference value="#{personTest.identity}"/>
            <br/>
     
            <p:commandButton value="Charger" action="#{personTest.load()}"/>
            </h:form>
     
        </ui:define>
    </ui:composition>
     
    </html>
    (Sachant que le ManagedBean à une propriété identity avec une valeur initiale en dur pour le test)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Par défaut
    Bonjour OButterlin,

    En ce qui concerne ton problème, je ne pense pas qu'on puisse le résoudre de la manière que tu souhaites.

    L'initialisation des champs n'est soit pas considéré par l'écouteur valueChange, soit il n'est pas encore en mode écoute au moment de l'assignation des valeurs.

    Par contre, on peut reproduire ce système autrement.

    Si on résume, il te suffit d'appeler ta méthode identityChanged() après le chargement de tes valeurs.

    Pourquoi n'appelerais-tu pas ta méthode dans l'écouteur "onload" de ton formulaire ?

    Pour effectuer des appels d'une méthode d'un bean à partir d'une méthode n'acceptant que des méthodes javascript (comme onload par exemple) tu peux utiliser le composant remoteCommand de Primefaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     <h:form id="form" onload="appel_methode()">               
          <p:remoteCommand name="appel_methode" actionListener="#{monBean.maMethode}" update="monComposant">  
    </form>
    Je sais que ce n'est pas exactement la fonctionnalité souhaité, mais si tu ne trouves pas d'autres solutions, peut-être que celle-ci pourrait te convenir.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Merci pour ta solution N4rc0, je vais la tester, le potentiel que ça ouvre m'intéresse dans tous les cas

    J'ai également trouvé une solution (temporaire ou pas) au problème de chargement initial qui fait que je n'ai même plus besoin de l'écouteur (on croit rêver quand même). J'utilise tout simplement la jstl et je fais un <c:set> dans ma balise <p:inputText> et ça fonctionne.
    Par contre, ça oblige à traiter la PhaseId pour ne faire le traitement qu'une fois dans la phase de rendu de la réponse. Bref, c'est pas terrible non plus...

    Je découvre la bibliothèque PrimeFaces et on peut dire que la première impression n'est pas forcément très positive... C'est beau, faut le dire, mais il y a plein de trucs qui fonctionne très moyennement.
    Et vivement la sortie de la version 2.2 de JSF parce que les problèmes de scope qui foutent la m.... ça me saoule également. Pas moyen d'utiliser le @ViewScoped dans certains cas, impossible d'utiliser le @SessionScoped dès qu'on fait un binding... c'est n'importe quoi...

    Bon, je ne vais pas continuer à cracher mon venin, ça n'intéresse sûrement personne (mais ça fait du bien )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Invité de passage
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Par défaut JSF2
    Bonjour, je recrute un développeur Java/J2EE avec des bonnes connaissances en JSF2 (poste à Paris).
    Si cela peut vous intéresser envoyer votre CV à : recrutement@kmbpartners.com

Discussions similaires

  1. [1.x] Root component not initialized ?
    Par symfony30000 dans le forum Symfony
    Réponses: 7
    Dernier message: 07/04/2010, 01h28
  2. Réponses: 2
    Dernier message: 26/04/2007, 09h06
  3. [JSP] pbl chargement d'une page JSP
    Par Shiryu44 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 30/03/2005, 10h49
  4. Réponses: 4
    Dernier message: 08/06/2004, 09h01
  5. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 04h12

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