Ответ 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>