У меня есть следующий шаблон (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>
и страница, которая его использует (search.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>
Проблема в том, что я хочусделайте вызов к userSessionBean.preRenderViewCookieLogin(e)
в шаблоне, потому что есть много других страниц.Этот метод проверяет, что пользователь вошел в систему (в соответствии с состоянием сеанса), и, если нет, проверяет, доступен ли файл cookie, который можно использовать для входа в систему, и, если да (и если он действителен), автоматически регистрирует пользователя.,Система работает в коде выше, но когда я пытаюсь вставить это в шаблон, мои параметры просмотра больше не устанавливаются.
Вот модифицированная версия выше, с userSessionBean.preRenderViewCookieLogin(e)
, выдвинутой доtemplate.
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>
search.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>
Обратите внимание, что я переместил тег <f:metadata/>
в шаблон.Проблема одна в том, что удаление userSessionBean.preRenderViewCookieLogin(e)
не имеет значения.Я также попробовал вариант работающего кода, который должен был просто переместить userSessionBean.preRenderViewCookieLogin(e)
в шаблон, что означает, что он не может быть внутри тега <f:metadata/>
.В этом случае этот метод выполняется после того, как все параметры просмотра были установлены и вызваны searchBean.preRenderView(e)
.Я хочу, чтобы userSessionBean.preRenderViewCookieLogin(e)
вызывался до вызова preRenderView(e)
любой страницы, а не после.И просто для удовольствия я попытался поместить <f:metadata/>
вокруг userSessionBean.preRenderViewCookieLogin(e)
, который вызывал этот метод, но не устанавливал параметры просмотра.
Итак, я хотел бы знать:
- Почему это происходит и есть ли способ это исправить?
- Есть ли лучший способ убедиться, что один и тот же метод вызывается для каждой страницы, прежде чем что-либо еще?
Редактировать: Я только что попробовал что-то еще - фазовое событие: <f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase(e)}">
Это в masterLayout.xhtml.Это не вызывается вообще;не для какой-либо фазы.
Редактировать: Удалено e
(черт побери, NetBeans!): <f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase}">
Это вызывается только до фазы ответа рендеринга, что, конечно, означает, что она называетсяпосле события preRenderView
.