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

时间:2012-03-25 00:12:50

标签: jsf metadata facelets composition templating

我在将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 模板还有一个部分(名为“标题”),可以将这些标记放在标题部分中。它们应该放在那里吗?它是否有所作为,或者我是否设置了一些我尚未见过的副作用?

1 个答案:

答案 0 :(得分: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>

使用模板时,the <f:metadata> tag documentation中所述的推荐方法是在主模板中声明单独的<ui:insert name="metadata">,让客户端在{{<f:metadata>中定义<ui:define name="metadata"> 1}}。

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