Подтвердить что ты не робот

При использовании шаблона <ui: composition>, где я должен объявить <f: metadata>?

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

Моя типичная клиентская страница Facelets выглядит следующим образом:

    <ui:composition template="./pattern.xhtml">

        <ui:define name="content">

            <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>

            <h1>Data Table</h1>

etc

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

4b9b3361

Ответ 1

Технически, неважно, где вы объявляете <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>