JSF 2 facelets <f:metadata/> dans le modèle de page et
J'ai le modèle suivant (masterLayout.xhtml):
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
<ui:insert name="metadata"/>
<h:head>
<title><ui:insert name="windowTitle"/> | MySite</title>
</h:head>
<h:body>
<div id="container">
<div id="header">
<ui:insert name="header">
<ui:include src="/WEB-INF/templates/header.xhtml"/>
</ui:insert>
</div>
<div id="content">
<ui:insert name="content"/>
</div>
<div id="footer">
<ui:insert name="footer">
<ui:include src="/WEB-INF/templates/footer.xhtml"/>
</ui:insert>
</div>
</div>
</h:body>
</f:view>
</html>
et la page qui l'utilise (de recherche.xhtml):
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/templates/masterLayout.xhtml">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="address" value="#{searchBean.address}"/>
<f:event type="preRenderView" listener="#{userSessionBean.preRenderViewCookieLogin(e)}"/>
<f:event type="preRenderView" listener="#{searchBean.preRenderView(e)}"/>
</f:metadata>
</ui:define>
<ui:define name="windowTitle">#{searchBean.address}</ui:define>
<ui:define name="content">
<!-- Content goes here -->
</ui:define>
</ui:composition>
</h:body>
</html>
Le problème est que je veux placer l'appel à userSessionBean.preRenderViewCookieLogin(e)
dans le modèle parce qu'il y a de nombreuses autres pages. Cette méthode vérifie que l'utilisateur est connecté (en fonction de l'état de session) et, si non, vérifie qu'un cookie est disponible qui peut être utilisé pour connecter l'utilisateur et, si oui (et si en cours de validité), les journaux de l'utilisateur automatiquement. Le système fonctionne dans le code ci-dessus, mais quand j'essaie de le pousser dans le modèle, de mon point de vue, les paramètres ne sont plus ensemble.
Voici la version modifiée de la version ci-dessus, avec userSessionBean.preRenderViewCookieLogin(e)
poussé jusqu'à la modèle.
masterLayout.xhtml:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
<f:metadata>
<f:event type="preRenderView" listener="#{userSessionBean.preRenderViewCookieLogin(e)}"/>
<ui:insert name="metadata"/>
</f:metadata>
<h:head>
<title><ui:insert name="windowTitle"/> | MySite</title>
</h:head>
<h:body>
<div id="container">
<div id="header">
<ui:insert name="header">
<ui:include src="/WEB-INF/templates/header.xhtml"/>
</ui:insert>
</div>
<div id="content">
<ui:insert name="content"/>
</div>
<div id="footer">
<ui:insert name="footer">
<ui:include src="/WEB-INF/templates/footer.xhtml"/>
</ui:insert>
</div>
</div>
</h:body>
</f:view>
</html>
de recherche.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/templates/masterLayout.xhtml">
<ui:define name="metadata">
<f:viewParam name="address" value="#{searchBean.address}"/>
<f:event type="preRenderView" listener="#{searchBean.preRenderView(e)}"/>
</ui:define>
<ui:define name="windowTitle">#{searchBean.address}</ui:define>
<ui:define name="content">
<!-- Content goes here -->
</ui:define>
</ui:composition>
</h:body>
</html>
Avis que j'ai déplacé le <f:metadata/>
balise pour le modèle. C'est le seul problème que la suppression userSessionBean.preRenderViewCookieLogin(e)
ne fait aucune différence. J'ai aussi essayé une variation sur le code qui a travaillé, qui a été à juste déplacer userSessionBean.preRenderViewCookieLogin(e)
dans le modèle, ce qui signifie qu'il ne peut pas être à l'intérieur de la <f:metadata/>
tag. Dans ce cas, la méthode exécutée après que tous les paramètres de vue avaient été établies et searchBean.preRenderView(e)
appelé. Je veux userSessionBean.preRenderViewCookieLogin(e)
à être appelée avant tout de la page preRenderView(e)
est appelé, et pas après. Et juste pour le fun j'ai essayé de mettre un <f:metadata/>
autour de userSessionBean.preRenderViewCookieLogin(e)
, qui appelle cette méthode, mais n'a pas défini les paramètres d'affichage.
Donc, je voudrais savoir:
- Pourquoi est-ce qui se passe et est-il un moyen de le réparer?
- Est-il une meilleure façon de s'assurer de la même méthode est appelée à chaque page avant de quelque chose d'autre?
Edit:
Je viens d'essayer quelque chose d'autre - une phase de l'événement:
<f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase(e)}">
C'est dans masterLayout.xhtml. Il n'est pas appelée à tous; ce n'est pas n'importe quelle phase.
Edit:
Enlevé le e
(damn vous NetBeans!):
<f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase}">
Ce n'est appelée avant que le rendu de la réponse de phase, ce qui bien sûr, signifie qu'il est appelé d'après le preRenderView
événement est déclenché.
OriginalL'auteur Distortum | 2011-09-27
Vous devez vous connecter pour publier un commentaire.
De la
<f:métadonnées>
de la balise de la documentation (l'accent de la 2ème paragraphe est le mien):Donc, il faut vraiment aller dans la vue d'en haut, non pas dans le modèle.
Dans votre cas particulier, magasin de l'utilisateur connecté en tant que propriété d'une session d'étendue de managed bean au lieu d'un cookie et l'utilisation d'un filtre sur le modèle d'URL pour le vérifier. Session étendue géré les haricots sont dans le filtre disponible en
HttpSession
attributs. Homegrown cookies sont inutiles car vous avez l'impression de réinventer laHttpSession
ici. Sauf si vous voulez qu'un "se souvenir de moi" installation, mais cela ne devrait pas être résolu de cette façon. Le faire dans un filtre.Voir aussi:
preRenderView
?Supprimer
(e)
. Il n'y a pas une telle chose dans le champ d'application.Fait. Voir les résultats. J'ai fini à l'aide d'une phase à l'écoute. La phase auditeur regarde
userSessionBean
(session d'étendue), puis appelle la méthode sur cette fève qui ne le cookie de connexion. J'ai utilisé et a voté du code de la vôtre ici pour obtenir la fève nom dans la phase d'écoute. Je vais poster la solution ici peu de temps.Je n'ai pas l'option de filtre parce que je pensais que c'était exagéré. Depuis que je suis de gérer toute la partie authentification, JSF, il n'a pas de bon sens pour gérer certains de l'extérieur de la JSF quand une simple phase auditeur ferait l'affaire. J'apprécie vraiment votre réponse. Ah zut, je vais vous donner ce parce que vous fait répondre à la première partie et m'a orienté dans la bonne direction pour résoudre la deuxième partie.
OriginalL'auteur BalusC
J'ai eu ce travail à l'aide d'un
PhaseListener
à la place.et le peu de fève de recherche de la magie est ici:
Grâce à @BalusC pour cela: JSF - get bean géré par nom. Depuis que je suis en CDI, je ne peux pas utiliser le plus déclaratif
@ManagedProperty
option. Pas une grosse affaire.OriginalL'auteur Distortum