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