JSF 2 фасетки в шаблоне и на странице

У меня есть следующий шаблон (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) , который вызвал этот метод, но не установил параметры просмотра.

Итак, я хотел бы знать:

  1. Почему это происходит и есть ли способ исправить это?
  2. Есть ли лучший способ гарантировать, что один и тот же метод вызывается для каждой страницы раньше всего?

Редактировать: Я просто попробовал кое-что еще - событие фазы: Это находится в masterLayout.xhtml. Его вообще не называют; не для какой-либо фазы.

Изменить: Удален e (черт возьми, NetBeans!): Это вызывается только перед фазой ответа отрисовки, что, конечно, означает, что она вызывается после возникновения события preRenderView .

9
задан BalusC 23 September 2014 в 06:29
поделиться