Когда используешьшаблон, где я должен объявить? - PullRequest
21 голосов
/ 25 марта 2012

Я добился большого прогресса в преобразовании своих приложений JSF в страницы с закладками, но мне интересно, правильно ли я это делаю.Один из вопросов заключается в том, что существует наилучшее местоположение для тегов f: метаданные ?

Моя типичная страница клиента Facelets выглядит следующим образом: f: метаданные и дочерние f: viewParam теги встречаются в теле моей страницы.В моем шаблоне pattern.xhtml также есть раздел (с именем "header"), который может поместить эти теги в раздел header.Должны ли они быть помещены туда?Это имеет значение, или я настроен на какой-то побочный эффект, который я еще не видел?

1 Ответ

41 голосов
/ 25 марта 2012

Технически, не имеет значения, где вы объявляете <f:metadata> в представлении, если оно находится в представлении верхнего уровня (поэтому, при использовании шаблонов, в клиенте шаблона и, следовательно, не в главном шаблоне). Когда представление создается, метаданные в основном не являются частью дерева компонентов JSF, а являются корневым представлением (которое можно получить для каждого представления по ViewDeclarationLanguage#getViewMetadata()).

В большинстве случаев самодокументирование помещает <f:metadata> в верхнюю часть представления, чтобы вы могли видеть любые метаданные на первый взгляд без необходимости прокручивать до половины или вниз исходный код представления.

При использовании простой страницы просто поместите ее прямо перед <h:head>.

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
    <f:metadata>
        <f:viewParam name="userId" value="#{bean.userId}" />
        <f:viewParam name="startRecord" value="#{bean.startRecord}" />
        <f:viewParam name="pageSize" value="#{bean.pageSize}" />
        <f:viewParam name="sort" value="#{bean.sort}" />
    </f:metadata>

    <h:head>
        ...
    </h:head>

    <h:body>
        ...
    </h:body>
</html>

При использовании шаблонов рекомендуемый подход, как указано в документации <f:metadata> тега , заключается в объявлении отдельного <ui:insert name="metadata"> в главном шаблоне и разрешении клиенту определить <f:metadata> в <ui:define name="metadata">.

<ui:composition template="/WEB-INF/pattern.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
    <ui:define name="metadata">
        <f:metadata>
            <f:viewParam name="userId" value="#{bean.userId}" />
            <f:viewParam name="startRecord" value="#{bean.startRecord}" />
            <f:viewParam name="pageSize" value="#{bean.pageSize}" />
            <f:viewParam name="sort" value="#{bean.sort}" />
        </f:metadata>
    </ui:define>

    <ui:define name="content">
        <h1>Data Table</h1>
        ...
    </ui:define>
</ui:composition>
...