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 :

Composant UISelectOne, Backing Bean et récupération de valeur


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut Composant UISelectOne, Backing Bean et récupération de valeur
    Bonjour,

    deux petites questions:

    1) Dans le contexte de la réalisation d'un "JSF custom component" consistant en un "drop-down" dans une page JSP. Le contenu à afficher provient d'un Service, et donc je ne songeais pas créer un "binding" dans le Tag. Par contre je dois passer un paramètre qui indique quel type de code afficher, et aussi l'item sélectionné.

    J'ai peut être mal lu la doc JSF mais comment on fait pour retrouver la valeur sélectionnée par l'utilisateur ensuite ?
    Est-ce que c'est en ajoutant une action (ex. onChange) au Tag, en lui associant une méthode dans le backing bean ?
    Est-ce que ce serait mieux de créer un genre de "binding" ?
    Autre ?

    2) Dans l'implémentation de départ, UIParametrage étend UISelectOne. Il existe d'autres alternatives, comme faire hériter le composant de javax.faces.component.html.HtmlSelectOneMenu ou bien faire hériter le Tag de com.sun.faces.taglib.html_basic.SelectOneListBox, je me questionne à savoir quelle sont les avantages de ces approches par rapport à simplement faire étendre le composant de UISelectOne ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <%@taglib uri="/WEB-INF/tld/taglibs-test.tld" prefix="te"%>
     
    <te:Parametrage code="AFFICHAGE_LISTE" parametreSelectionne="#{navigationBean.itemSelectionne}" 
    	id="listeAffichage" style="width: 150px">
    </te:Parametrage>
    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
     
    public class UIParametrage extends UISelectOne {
        public static final String COMPONENT_TYPE = "UIParametrage";    
        public void encodeBegin(FacesContext context) throws IOException {
    	ResponseWriter writer = context.getResponseWriter();
    	writer.startElement("select", this);    
        }
     
        public void encodeEnd(FacesContext context) throws IOException {
        	ResponseWriter writer = context.getResponseWriter();
    	writer.endElement("select");
        }
     
        public void encodeChildren(FacesContext context) throws IOException {
        	ResponseWriter writer = context.getResponseWriter();
    	String code = (String)getAttributes().get("code");
    	String parametreSelectionne = (String)getAttributes().get("parametreSelectionne");
    	ParametrageBean parametrageBean = new ParametrageBean();
     
    	// obtenu via l'appel a un Service
    	List listeValeurs = parametrageBean.getListeValeur(code);
     
    	Iterator iterValeurs = listeValeurs.iterator();
    	for(int i = 0; i < listeValeurs.size(); i++) {
              Valeur valeur = (Valeur) iterValeurs.next();
    	  writer.startElement("option", this);
    	  writer.writeAttribute("value", valeur.getCode(), null);
    	  if (parametreSelectionne.equals(valeur.getCode())){
    	    writer.writeAttribute("selected", "selected", null);
    	  }
    	  writer.write(valeur.getDescription());
    	  writer.endElement("option");
    	}
        }
     
        public boolean getRendersChildren() {
    	return true;
        }
    }
    En passant, le forum ici est pas mal cool!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut
    Vu l'absence de réponse j'ai pris le temps de me relire et je dois admettre que les questions ne sont peut être pas super claires. Alors je prends ici le temps de ré-écrire ces questions:

    Contexte: L'objectif est de réaliser un menu de type 'drop-down' à partir d'un 'JSF Custom Tag' sur un page Web. Le composant UIParametrage étend UISelectOne. La balise SELECT est encodé dans encodeBegin(FacesContext). Cette balise requiert plusieurs paramètres entrant du tag pour l'affichage [id, style]

    Le contenu des balises OPTION provient d'un service appellé dans le BackingBean [parametrageBean.getListeValeur(code);] Toutefois, le paramètre entrant CODE du Tag est requis pour spécifier quelle type d'information par le service [tous les types d'information disponibles ont le même gabarit, seulement le contenu change].

    Code HTML résultant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <select id="form1:listeProv" lang="fr" style="width: 150px" class="select1">
    	<option value="CA" selected="selected">California</option>
    	<option value="IL">Illinois</option>
    </select>
    Question 1: J'aurais préféré instancier directement un HtmlSelectOneListbox, et plutôt créer un 'JSF Custom component' pour générer seulement les éléments HTML option, mais je vois pas comment signifier au composant parent [HtmlSelectOneListbox] qu'il a un enfant. En fait j'ai essayé mais ça ne marchait pas, est-ce que quelqu'un a déjà fait ça ?

    Question 2: Comment on récupère la sélection de l'usager dans un Servlet, par défaut rien n'est mis-à-jour automatiquement ?

    Question 3: Essayé d'ajouter un ValueChangeListener mais la classe n'est pas appellé quand le formulaire est soumis ?

    Question 4: Est-ce qu'il y a d'autre options que de faire étendre le composant de UISelectOne ?

    Je sais que c un peu long comme description mais merci d'avoir lu tout ça

  3. #3
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    En rapport à ta question #1 (qui résoudrait ton problème j'ai l'impression), il me faudrait plus d'informations...
    Qu'entends tu par "comment signifier au composant parent [HtmlSelectOneListbox] qu'il a un enfant" ?

    Le composant <f:selectItems> ne pourrait-il pas répondre à ton problème ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut
    Si j'utilise plutôt un tag <f:selectItems /> alors je vois pas comment faire pour influencer l'affichage de la liste d'éléments option ? (ordre de tri, valeur écourté ou bien longue, etc.). J'avais enlevé tout ça dans le code mis dans un post précédent, pour pas prendre trop de place ,mais le voici reproduit ici pour montrer le mécanisme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <%@taglib uri="/WEB-INF/tld/taglibs-test.tld" prefix="te"%>
    <te:Parametrage code='<%=Constante.CODE_PAYS%>' parametreSelectionne="#{navigationBean.provinceSelectionne}"
    ordreTri='<%=Constante.TRI_DESC_ASC)%>' afficherInactives="true" descriptionCourte="false" id="listeAffichage" lang="fr" styleClass="select1" style="width: 150px" rendered="true">
    </te:Parametrage>
    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
     
    public class UIParametrage extends UISelectOne {
        public static final String COMPONENT_TYPE = "UIParametrage";    
        public void encodeBegin(FacesContext context) throws IOException {
    	ResponseWriter writer = context.getResponseWriter();
    	writer.startElement("select", this);    
        }
     
        public void encodeEnd(FacesContext context) throws IOException {
        	ResponseWriter writer = context.getResponseWriter();
    	writer.endElement("select");
        }
     
        public void encodeChildren(FacesContext context) throws IOException {
        	ResponseWriter writer = context.getResponseWriter();
        	boolean boolDescriptionCourte = false;
    	String code = (String)getAttributes().get("code");
    	String parametreSelectionne = (String)getAttributes().get("parametreSelectionne");
    	String ordreTri = (String)getAttributes().get("ordreTri");
    	String afficherInactives = (String)getAttributes().get("afficherInactives");
    	String descriptionCourte = (String)getAttributes().get("descriptionCourte");
    	if (descriptionCourte != null && descriptionCourte.length() > 0) {
    		boolDescriptionCourte = Boolean.parseBoolean(descriptionCourte);
    	}
    	ParametrageBean parametrageBean = new ParametrageBean();
     
    	// obtenu via l'appel a un Service
    	List listeValeurs = parametrageBean.getListeValeur(code, ordreTri, afficherInactives);
     
    	Iterator iterValeurs = listeValeurs.iterator();
    	for(int i = 0; i < listeValeurs.size(); i++) {
              Valeur valeur = (Valeur) iterValeurs.next();
    	  writer.startElement("option", this);
    	  writer.writeAttribute("value", valeur.getCode(), null);
    	  if (parametreSelectionne.equals(valeur.getCode())){
    	    writer.writeAttribute("selected", "selected", null);
    	  }
    	  if (boolDescriptionCourte) {
    		writer.write(valeur.getDescriptionCourte());
    	  }
    	  else {
    		writer.write(valeur.getDescription());
    	  }
    	  writer.endElement("option");
    	}
        }
     
        public boolean getRendersChildren() {
    	return true;
        }
    }

  5. #5
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Moi je vois bien une solution avec les f:selectItems:
    Si tu utilises les EL Functors, tu peux passer des paramètres aux méthodes appelées dans les beans.
    Du coup, tu pourras donner des paramètres à la méthode qui retourne la List<SelectItem> qui peuplera le combobox.
    C'est peut être plus simple que de créer son propre composant, non ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut
    Hé merci pour le tuyau En fait c'est super ce projet mais peux pas l'utiliser sur ce projet-là. On utilise une implémentation ibm de JSF 1.1, avec J2EE 1.4. Ce sont des requis

    Essayé quand même mais bon ça donne une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [Servlet Error]-[Failed to load listener: beanface.el.functor.InstallFunctorListener]: java.lang.NoClassDefFoundError: javax.el.ELResolver
    	at java.lang.J9VMInternals.verifyImpl(Native Method)
    	at java.lang.J9VMInternals.verify(J9VMInternals.java:59)
    	at java.lang.J9VMInternals.initialize(J9VMInternals.java:120)
    	at java.lang.Class.newInstanceImpl(Native Method)
    	at java.lang.Class.newInstance(Class.java:1263)
    	at java.beans.Beans.instantiate(Beans.java:219)
    	at java.beans.Beans.instantiate(Beans.java:63)
    	at com.ibm.ws.webcontainer.webapp.WebApp.loadListener(WebApp.java:1281)
    Ça doit être causé par le fait que ELResolver existe pas dans J2EE 1.4

  7. #7
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Pour information, chez moi la classe javax.el.ELResolver se situe dans une librairie appelée el-api-1.0.jar, et non dans le JRE.
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut
    Ok trouvé el-api-1.0.jar et ajouté dans les lib. Si ajoute le listener dans web.xml ça donne une exception au démarrage du serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <listener>
      <listener-class>beanface.el.functor.InstallFunctorListener</listener-class>
    </listener>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [07-11-08 12:07:26:074 EST] 00000016 WebApp        E   Exception caught while initializing context 
    java.lang.NoSuchMethodError: javax/servlet/jsp/JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    	at beanface.el.functor.InstallFunctorListener.contextInitialized(InstallFunctorListener.java:49)
    	at com.ibm.ws.wswebcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:608)
    	at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinish(WebApp.java:266)
    	at com.ibm.ws.wswebcontainer.webapp.WebApp.initialize(WebApp.java:272)
    	at com.ibm.ws.wswebcontainer.webapp.WebGroup.addWebApplication(WebGroup.java:88)
    	at com.ibm.ws.wswebcontainer.VirtualHost.addWebApplication(VirtualHost.java:157)
    	at com.ibm.ws.wswebcontainer.WebContainer.addWebApp(WebContainer.java:655)
    	at com.ibm.ws.wswebcontainer.WebContainer.addWebApplication(WebContainer.java:608)
    	at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:333)
    	at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:549)
    	at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1295)
    Remarqué que la lib contient une version de JspFactory avec la méthode getJspApplicationContext(). Or dans J2EE 1.4 il y a déjà une version de JspFactory mais sans cette méthode. Essayé de modifier le classloader (PARENT_LAST) du EAR, en espérant que el-api-1.0.jar serait chargée avant la classe dans le JAR J2EE mais non l'exception persiste ...

    Bon, aussi essayé sans mettre le listener dans web.xml mais alors là il y a une JspTranslationException dans la page JSP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:selectOneMenu id="listePaysD" style="background-color: #eee">
        <f:selectItems value="${navigationBean.listeSelectItem$2['bla1']['bla2']}" />
    </h:selectOneMenu>
    Méthode appellée dans le bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /** Les param servent juste pour tester */
    public List getListeSelectItem(String arg1, String arg2) {
      listeSelectItem.clear();
      listeSelectItem.add(new SelectItem("CA", "Canada"));
      listeSelectItem.add(new SelectItem("FR", "France"));
      listeSelectItem.add(new SelectItem("IT", "Italie"));
      return listeSelectItem;
    }
    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
    [07-11-08 13:30:12:855 EST] 00000023 WebApp        E   [Servlet Error]-[/parametrage.jsp]: com.ibm.ws.jsp.translator.JspTranslationException: JSPG0227E: Exception intercept?e lors de la conversion de /parametrage.jsp:  
    /parametrage.jsp(87,5) --> JSPG0124E: L'attribut de balise personnalis? value ne peut pas ?tre une expression d'ex?cution. valeur : "[${navigationBean.listeSelectItem$2['bla1']['bla2']}]"
     
    	at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttributeValues(ValidateVisitor.java:1655)
    	at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.visitCustomTagStart(ValidateVisitor.java:289)
    	at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:267)
    	at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:309)
    	. . .
    	at com.ibm.ws.jsp.translator.visitor.JspVisitor.visit(JspVisitor.java:121)
    	at com.ibm.ws.jsp.translator.JspTranslator.processVisitors(JspTranslator.java:121)
    	at com.ibm.ws.jsp.translator.utils.JspTranslatorUtil.translateJsp(JspTranslatorUtil.java:181)
    	at com.ibm.ws.jsp.translator.utils.JspTranslatorUtil.translateJspAndCompile(JspTranslatorUtil.java:83)
    	at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.translateJsp(AbstractJSPExtensionServletWrapper.java:349)
    	at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper._checkForTranslation(AbstractJSPExtensionServletWrapper.java:317)
    	at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.checkForTranslation(AbstractJSPExtensionServletWrapper.java:226)
    	at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:131)
    	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:308)
    	at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:325)
    Là je dois admettre que j'envisage sérieusement la solution d'un JSF Custom Component...

Discussions similaires

  1. Réponses: 16
    Dernier message: 17/01/2010, 09h33
  2. Réponses: 4
    Dernier message: 27/02/2009, 21h57
  3. [JSF - Backing Bean] Valeur par défaut
    Par gufra dans le forum JSF
    Réponses: 4
    Dernier message: 26/09/2007, 15h44
  4. Backing bean et passage de valeurs
    Par tartanfion dans le forum JSF
    Réponses: 5
    Dernier message: 10/04/2007, 07h41

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