jsf - plantillas - Al utilizar<ui: composition> templating, ¿dónde debería declarar<f: metadata>?
ui define (1)
He avanzado mucho en la conversión de mis aplicaciones JSF a páginas marcables con libros, pero me pregunto si lo estoy haciendo de la manera correcta. Una pregunta es si existe una ubicación de mejores prácticas para las etiquetas f: metadata ?
Mi página de cliente típica de Facelets se ve así:
<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
Entonces, las etiquetas f: metadata e child f: viewParam se encuentran en el cuerpo de mi página. Mi plantilla pattern.xhtml también tiene una sección (llamada "header") que podría poner estas etiquetas en la sección del encabezado. ¿Deberían ser puestos allí? ¿Hace una diferencia o estoy configurado para algún efecto secundario que no haya visto todavía?
Técnicamente, no importa dónde declare <f:metadata>
en la vista, siempre y cuando esté en la vista de nivel superior (por lo tanto, al usar plantillas, en el cliente de plantilla y, por lo tanto, no en la plantilla maestra). Cuando se construye la vista, los metadatos básicamente no son parte del árbol de componentes JSF, sino de la raíz de la vista (que se puede ver en vista por ViewDeclarationLanguage#getViewMetadata()
).
La mayor parte de la auto-documentación sería poner <f:metadata>
en la parte superior de la vista, para que pueda ver cualquier metadato a primera vista sin necesidad de desplazarse a la mitad o abajo del código fuente de la vista.
Cuando use una página simple, simplemente colóquela justo antes de la <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>
Al usar plantillas, el enfoque recomendado, como se indica en la documentación de la etiqueta <f:metadata>
, sería declarar un <ui:insert name="metadata">
en la plantilla maestra y dejar que el cliente defina los <f:metadata>
en un <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>