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 :

jsf - facelets : question sur la composition


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut jsf - facelets : question sur la composition
    Bonjour,
    je suis en train de me former au développement web avec les techniques JSF et facelets et
    j'ai une question concernant la composition.
    Je veux définir un menu en début de session et le conserver lorsque l'on change de page ( partie "variable"). Je suis partie sur l'idée suivante, avoir un menu "menu.xhtml" dont toutes les options sont à rendered=false et de les passer à true par programme suivant le user dans un managed bean session. Problème cela marche si je ne change pas de page. Il semble qu'il reconstruise entièrement la page et reparte du fichier menu.xhtml sans tenir compte des modifs faîtes par programme??

    Est-ce que c'est un problème de définition des templates ou est-ce le fonctionnement normal de facelets?

    merci pour vos suggestions.

    template main.xhtml

    <?xml version='1.0' encoding='ISO-8859-1' ?>
    <!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link href="css/ggc.css" rel="stylesheet" type="text/css" />
    <title><ui:insert name="pageTitle">Page Title</ui:insert></title>
    </head>
    <body>
    <div id="header">
    <div class="panel">
    <ui:include src="./header.xhtml" > page header</ui:include>
    </div>
    </div>
    <div id="topbar">
    <div class="panel">
    <ui:insert name="topbar">Topbar</ui:insert>
    </div>
    </div>

    <div>
    <div id="sidebar">
    <div class="panel">
    <ui:insert name="sidebar">Sidebar</ui:insert>
    </div>
    </div>
    <div id="body" style="text-align: center;">
    <div class="panel">
    <ui:insert name="body">Body</ui:insert>
    </div>
    </div>
    </div>
    <div id="footer">
    <div class="panel">
    <ui:include src="./footer.xhtml" > Footer</ui:include>
    </div>
    </div>
    </body>
    </html>

    Template navigation.xhtml :

    <ui:composition template="/main.xhtml">
    <div>
    <ui:define name="pageTitle">
    <ui:insert name="pageTitle">Page Title</ui:insert>
    </ui:define>
    </div>
    <div>
    <ui:define name="topbar">
    <ui:include src="#{navigation.barRoles}">Bar Actors</ui:include>
    </ui:define>
    </div>
    <ui:define name="sidebar">
    <ui:include src="#{navigation.menuRoleCourant}">Side Menu</ui:include>
    </ui:define>
    <div>
    <ui:define name="body">
    <ui:insert name="body">Page Content</ui:insert>
    </ui:define>
    </div>
    </ui:composition>

    Template pageBlanche.xhtml :

    <ui:composition template="/navigation.xhtml">
    <ui:define name="pageTitle">
    connexion
    </ui:define>
    <ui:define name="body">
    <f:subview id="body">
    <h:form>
    <h2> Page blanche</h2>

    </h:form>
    </f:subview>
    </ui:define>
    </ui:composition>

  2. #2
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 42
    Par défaut
    En fait si j'ai bien compris, tout fonctionne tant que tu ne changes pas de page, mais si jamais tu la rafraichis ou que tu reviens sur ton menu à partir d'une autre page les modifications réalisées n'ont pas été sauvegardées....

    Le scope de ton Bean est bien en mode Session ou Application? (dans le faces-config.xml)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut
    Oui,
    des le départ je fait appel au menu mais il n'apparaît pas (rendered=false), donc lorsque je positionne certaines "option" à true et que je reste sur la même page le menu devient visible.
    J'ai fait le test d'actualiser la page, j'ai un message m'indiquant que je vais renvoyer des données par post, mais je conserve le bon affichage.

    Si je demande le reaffichage de la même page en donnant son nom (passage par le faces-config) je perds le menu.

    voici le menu:

    <ui:composition
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">

    <f:subview id="sidebar">

    <h:form>
    <h:panelGrid columns="1">
    <f:facet name="header">
    <h:outputText value="Menu Ens" styleClass="sectionTitle"/>
    </f:facet>

    <h:commandLink action="#{navigation.doChangePage}">
    <h:outputText value="Gérer référentiel métiers"/>
    <f:param name="choixPage" value="page.referentiel"/>
    </h:commandLink>

    <h:commandLink action="#{navigation.doChangePage}">
    <h:outputText value="Gérer référentiel compétences"/>
    <f:param name="choixPage" value="page.competence"/>
    </h:commandLink>

    <h:commandLink action="#{navigation.doChangePage}">
    <h:outputText value="Gérer catégories de compétences"/>
    <f:param name="choixPage" value="page.categorie"/>
    </h:commandLink>

    </h:panelGrid>

    </h:form>

    </f:subview>
    </ui:composition>

  4. #4
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 42
    Par défaut
    Mais en fait il y a un truc qui me tracasse, tu modifies le rendered des composants comment? Il n'y a aucun binding... Ou alors c'est peut-être de là que vient le problème.

    Tu utilises peut-être une méthode que je ne connais pas, mais moi pour faire ce que tu veux faire, je ferai un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ....
    
       <h:panelGroup binding="#{navigation.itemMenuA}">
          <h:commandLink action="#{navigation.doChangePage}">
             <h:outputText value="Gérer référentiel métiers"/>
             <f:param name="choixPage" value="page.referentiel"/>
          </h:commandLink>
       </h:paneGroup>
    
    ...
    Et dans le Bean navigation, le rendered se gère comme ceci :

    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
    
    ...
    //déclaration de l'ttribut lié au panelGroup
            private HtmlPanelGroup itemMenuA;
    
    //getter & setter
    	public HtmlPanelGroup getItemMenuA() {
    		return itemMenuA;
    	}
    
    	public void setItemMenuA(HtmlPanelGroup itemMenuA) {
    		this.itemMenuA = itemMenuA;
    	}
    
    ...
    //au moment de modifié le rendered à true par exemple:
             ...
             itemMenuA.setRendered(true);
             ...

    Ainsi, les valeurs modifiées en ce qui concernent les rendered le sont dans le Bean instancié, et restent donc mémorisées.

    M'enfin si ça se trouve tu as déjà essayé ou alors ce que je te propose est inadéquat.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut
    je suis désolé, ce n'était pas le bon menu. J'ai bien un binding sur chacun des commandLink. voici un exemple:

    <f:subview id="topbar">

    <h:form>
    <h:panelGrid columns="5">

    <h:commandLink id="Administrateur" binding="#{navigation.roleAdministrateur}"
    action="#{navigation.doChangeRole}" rendered="false">
    <h:outputText value="Administrateur" styleClass="sectionMenu"/>
    <f:param name="choixRole" value="adm"/>
    </h:commandLink>
    ..............................................
    </h:panelGrid>
    </h:form>

    </f:subview>
    </ui:composition>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut
    pour le rendre visible je fais simplement :

    roleGestionnaire.setRendered(true);

    je pense que c'est tout ce qu'il y a à faire!?

  7. #7
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 42
    Par défaut
    Oui.

    Bon après un petit test chez moi, j'obtiens le même problème en laissant le rendered="false" à la création du composant. Apparement lors du rechargement de la page, les paramètres du composant JSF écrasent la valeur dans le Bean instancié.

    Par contre si on l'initialise dans le Bean lors de son instanciation, tout est résolu.

    Bon là j'avoue ne pas savoir comment on touche au constructeur par défaut, je suis pas doué en java. (je sais même pas si c'est possible)

    Je connais toutefois un moyen de s'en sortir sans le binding, en affectant un attribut booléen aux rendered (1 différent pour chaque rendered s'il faut) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    <h:commandLink id="Administrateur" 
    action="#{navigation.doChangeRole}" rendered="#{navigation.affichMenuA}">
    <h:outputText value="Administrateur" styleClass="sectionMenu"/>
    <f:param name="choixRole" value="adm"/>
    </h:commandLink> 
    ...
    et dans le Bean:

    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
     
    //initialisation
            private boolean affichMenuA = false;
     
    //getter & setter
    	public boolean isAffichMenuA() {
    		return affichMenuA;
    	}
     
    	public void setAffichMenuA(boolean affichMenuA) {
    		this.affichMenuA = affichMenuA;
    	}
     
    //pour modifier l'affichage :
            affichMenuA = true;

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut
    MERCI BEAUCOUP,
    j'ai effectué les modifications suivant tes indications et cela marche également chez moi.

    J'espère ne pas abuser en te demandant si tu aurais une idée comment initialiser un selectOneMenu par son managed bean avant son affichage (à l'initialisation).
    Il s'agit d'une liste résultant de la lécture d'une table.

    En tout cas merci encore. http://www.developpez.net/forums/ima...es/yaisse2.gif

  9. #9
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 42
    Par défaut
    tu as un bel exemple ici :

    http://www.developpez.net/forums/sho...d.php?t=400715

    ou alors j'ai pas bien cerné ton problème.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Par défaut
    C'est ce que je viens de voir.

    merci encore.

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

Discussions similaires

  1. Question sur la composition d'une adresse MAC
    Par beegees dans le forum Dépannage et Assistance
    Réponses: 6
    Dernier message: 09/12/2008, 16h18
  2. Debutant : Question sur jasperReport avec jsf
    Par kam81 dans le forum JSF
    Réponses: 2
    Dernier message: 08/11/2008, 19h53
  3. [JSF][Tomahawk] Question sur le Schedule
    Par Jexou dans le forum JSF
    Réponses: 1
    Dernier message: 15/02/2008, 16h05
  4. [scanners] Quelques questions sur la composition des scans.
    Par Muesko dans le forum Périphériques
    Réponses: 13
    Dernier message: 04/09/2007, 15h37
  5. question sur utilisation de dojo avec jsf
    Par anti_gone10 dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 13/08/2007, 13h57

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