У меня есть следующий шаблон (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)
, помещенным в шаблон.
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>
Обратите внимание, что я переместил тег
в шаблон. Это уже проблема, поскольку удаление userSessionBean.preRenderViewCookieLogin (e)
не имеет значения. Я также попробовал вариант работающего кода, который заключался в том, чтобы просто переместить userSessionBean.preRenderViewCookieLogin (e)
в шаблон, что означает, что он не может находиться внутри
тег. В данном случае этот метод выполняется после того, как были установлены все параметры представления и вызван searchBean.preRenderView (e)
. Я хочу, чтобы userSessionBean.preRenderViewCookieLogin (e)
вызывался до вызова preRenderView (e)
любой страницы, а не после. И просто для удовольствия я попытался поместить
вокруг userSessionBean.preRenderViewCookieLogin (e)
, который вызвал этот метод, но не установил параметры просмотра.
Итак, я хотел бы знать:
Редактировать:
Я просто попробовал кое-что еще - событие фазы:
Это находится в masterLayout.xhtml. Его вообще не называют; не для какой-либо фазы.
Изменить:
Удален e
(черт возьми, NetBeans!):
Это вызывается только перед фазой ответа отрисовки, что, конечно, означает, что она вызывается после возникновения события preRenderView
.