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

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

Моя типичная клиентская страница 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:metadata и дочерние теги f:viewParam встречаются в теле моей страницы. В моем шаблоне pattern.xhtml также есть раздел (названный "заголовок"), в котором эти теги можно поместить в раздел заголовка. Их надо туда ставить? Есть ли разница, или я настроен на какой-то побочный эффект, которого я еще не видел?


person AlanObject    schedule 25.03.2012    source источник


Ответы (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>
person BalusC    schedule 25.03.2012
comment
Я должен сказать, что это выглядит немного чище, чем то, что я делал. Почему-то мне не пришло в голову создать ui:insert только для целей метаданных, но сейчас я это сделаю. - person AlanObject; 25.03.2012
comment
Означает ли это, что f:metadata нельзя поместить, например, в шаблон страницы, чтобы сделать его многоразовым? Что делать, если есть какое-то действие, которое мы хотим выполнить для каждого представления до того, как оно будет отрисовано? - person Xtreme Biker; 20.01.2014
comment
@Xtreme: просто используйте <f:event>. На самом деле его не обязательно размещать внутри <f:metadata>. См. также stackoverflow.com/questions/7343220/ - person BalusC; 20.01.2014
comment
@BalusC, о размещении его перед <h:head>, то же самое <f:metadata> документация по тегу говорит: This must be a child of the <f:view>. Есть ли неявный f:view на верхнем уровне или что-то в этом роде? - person Vsevolod Golovanov; 07.02.2014
comment
@это: это правильно. Это UIViewRoot. См. также stackoverflow.com/q/8883476. - person BalusC; 07.02.2014