使用<ui:composition>模板时,我应该在哪里声明<f:metadata>?

Ala*_*ect 21 jsf metadata facelets templating composition

我在将我的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
Run Code Online (Sandbox Code Playgroud)

所以f:metadata和child f:viewParam标签在我的页面正文中遇到.我的pattern.xhtml模板还有一个部分(名为"header"),可以将这些标记放在标题部分.它们应该放在那里吗?它是否有所作为,或者我是否设置了一些我尚未见过的副作用?

Bal*_*usC 41

从技术上讲,<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>
Run Code Online (Sandbox Code Playgroud)

当使用模板,推荐的方法,在规定<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>
Run Code Online (Sandbox Code Playgroud)

  • @this:这是对的.这是'UIViewRoot`.另请参见http://stackoverflow.com/q/8883476 (2认同)