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 :

rich:tabPanel dynamique récalcitrant


Sujet :

JSF Java

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut rich:tabPanel dynamique récalcitrant
    Bonjour à tous !

    J'aimerais afficher un tabPanel avec RichFaces 3.3.3 de manière dynamique. Pour cela, en cherchant sur le web j'ai vu qu'en employant un <c:forEach> on pouvait générer des <rich:tab> à partir d'un bean ...

    C'est ce que j'ai fait dans ce code :

    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
     
    <?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">
     
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:a4j="http://richfaces.org/a4j"
    	xmlns:rich="http://richfaces.org/rich"
    	xmlns:c="http://java.sun.com/jsp/jstl/core"
    	template="/templates/module.xhtml">
     
    	<ui:define name="menu">
    		<ui:include src="/planner/menu.xhtml" />
    	</ui:define>
     
    	<ui:define name="module">
    		<f:facet name="header">
    			Liste des choses à faire
    		</f:facet>
     
    		<!-- Début du module -->
     
    		<rich:tabPanel id="ctx_panel" width="100%" switchType="ajax">
    			<c:forEach items="#{todoBean.contextList}" var="toolist" >
    				<rich:tab name="#{toolist.name}">
    					<f:facet name="label">
    						<h:outputText value="#{toolist.name}" />
    					</f:facet>
     
    					<!-- Début de l'onglet -->
     
     
     
    					<!-- Fin de l'onglet -->
     
    				</rich:tab>
    			</c:forEach>
    		</rich:tabPanel>
     
    		<!-- Fin du module -->
     
    	</ui:define>
     
    </ui:composition>
    #{todoBean.contextList} retourne ici un objet de type List<Context>, Context étant une classe à moi ...

    Les tab ne s'affichent pas malgré le fait que todoBean.contextList retourne 4 objets ... C'est bizarre !



    Et si je remplace
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    par
    xmlns:c="http://java.sun.com/jstl/core"
    alors là il m'affiche bien tous les onglets comme il faut.
    Mais l'appelle à TodoBean.getContextList() se fait une vingtaine de fois !!! ce qui ralenti fortement l'affichage (j'ai des requetes Hibernate derrière) ...

    Voila ... donc j'ai le choix entre n'afficher rien du tout ou bien tout afficher et attendre longtemps que la fonction itère n fois ...


    Pour info j'ai :
    - JBoss 5.0.1
    - RichFaces 3.3.3
    - JSF 1.2
    - Taglibs 1.2


    Auriez-vous une idée pour que les tabs s'affichent correctement, et que la fonction ne soit exécutée qu'une seule fois ???


    Merci beaucoup !!!


    PS : plus il y a de tabs à afficher et plus la fonction TodoBean.getContextList() est appelée ...

  2. #2
    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 : 45
    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
    les composant JSF ne font pas de caching des valeurs retournées par les beans. Par conséquent, et pour éviter de faire 50 fois le même calculs pendant une requete, c'est à ton bean de faire le caching de la liste pour ne devoir aller lire qu'une seule fois la base de données.

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut
    Merci de te réponse !

    Seulement le fait est que la fonction Java du Bean est appelée une vingtaine de fois par affichage de la page ... Alors que je ne l'appelle dans mon code XML qu'une seule fois !

    Si j'avais mis le #{todoBean.contextList} dans le value d'un <rich:datatable> pour afficher les contextes sous forme de tableau au lieu de tabs, la fonction getContextList() n'aurait été appelée qu'une seule fois ... (j'ai fait le test).

    Et je me demande aussi pourquoi cela ne marche pas lorsque j'utilise xmlns:c="http://java.sun.com/jsp/jstl/core". Alors que cette adresse est il me semble celle qu'il faut pour JSTL 1.2 ...

  4. #4
    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 : 45
    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 Ernesto_X Voir le message
    Merci de te réponse !

    Seulement le fait est que la fonction Java du Bean est appelée une vingtaine de fois par affichage de la page ...
    Oui bien sur, et comme je l'ai dit "pendant une requête". Tes beans doivent assumer qu'ils seront appelés autant de fois que le composant le juge nécessaire pour faire son affichage, c'est-à-dire, à priori
    N*5 appels. 5 car il y a 5 phases indépendantes au rendu JSF, N car une propriété peut être appelé plusieurs fois pendant la phase par plusieurs composants ou par un seul. 5 peux être moins si certaines phases sont sautées, N peut varier d'une phase à l'autre.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <c:forEach items="#{todoBean.contextList}" var="toolist" >
    				<rich:tab name="#{toolist.name}">
    					<f:facet name="label">
    						<h:outputText value="#{toolist.name}" />
    					</f:facet>
    				</rich:tab>
    			</c:forEach>
    sera rendu comme:
    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
     
    				<rich:tab name="#{todoBean.contextList[0].name}">
    					<f:facet name="label">
    						<h:outputText value="#{todoBean.contextList[0].name}" />
    					</f:facet>
    				</rich:tab>
    				<rich:tab name="#{todoBean.contextList[1].name}">
    					<f:facet name="label">
    						<h:outputText value="#{todoBean.contextList[1].name}" />
    					</f:facet>
    				</rich:tab>
    				<rich:tab name="#{todoBean.contextList[2].name}">
    					<f:facet name="label">
    						<h:outputText value="#{todoBean.contextList[2].name}" />
    					</f:facet>
    				</rich:tab>
    donc au moins 6 appels à getcontextList pour 3 onglets (ceci en supposant que outuptText ou tab ne fait qu'un seul appel, d'un composant à l'autre JSF tu n'a aucune garantie là dessus).

    Il est donc primordial de ne pas faire des appel DB inutile, de se contenter de cacher la denière valeur tant qu'on est dans la même requete.


    pour ce qui est de tes tags, si http://java.sun.com/jsp/jstl/core ne marche pas, j'aurais tendance à dire que tu n'a pas installé la JSTL 1.2 mais la JSTL 1.1 ....

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut
    Merci pour ton explication claire et détaillée !!!
    J'ai enfin compris !

    Au début je pensais avoir affaire à un bug ... Mais non !
    Je vais donc cacher les valeurs !

    Pour ce qui est de la version de JSTL c'est celle qui est par défaut dans JBoss 5 ... Donc JSTL 1.1 !

    C'est résolu !

  6. #6
    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 : 45
    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 Ernesto_X Voir le message
    Pour ce qui est de la version de JSTL c'est celle qui est par défaut dans JBoss 5 ... Donc JSTL 1.1 !
    Attention! JSTL 1.1 n'est pas compatible avec JSF. N'hésite pas à fournir ta probre version de JSTL 1.2 embarquée dans ton war

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

Discussions similaires

  1. création d'un rich:tabPanel dynamique
    Par sal.gass dans le forum JSF
    Réponses: 4
    Dernier message: 25/06/2009, 15h18
  2. Inclusions dans rich:tabPanel
    Par christie dans le forum JSF
    Réponses: 8
    Dernier message: 20/02/2009, 09h35
  3. Réponses: 5
    Dernier message: 25/11/2008, 19h51
  4. Problème avec rich:tabPanel
    Par jdev23 dans le forum JSF
    Réponses: 1
    Dernier message: 09/09/2008, 03h55
  5. [.NET 2.0 + Ajax] TabPanel dynamique
    Par fix105 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/04/2007, 08h40

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