¿Cuál es la diferencia entre esos enfoques?
Plantillas de facelet
Utilice las plantillas de Facelet (como en <ui:composition>
, <ui:include>
y <ui:decorate>
) si desea dividir los fragmentos de diseño de la página principal en plantillas reutilizables. Por ejemplo, encabezado, menú, contenido, pie de página, etc.
Ejemplos:
Archivos de etiquetas de facelet
Utilice los archivos de etiquetas Facelet si desea tener un grupo de componentes reutilizables para evitar / minimizar la duplicación de códigos. Por ejemplo, un grupo de componentes etiqueta + entrada + mensaje. La principal diferencia con los componentes compuestos es que la salida de un archivo de etiqueta Facelet no representa uno solo UIComponent
y, en algunas circunstancias, puede ser la única solución cuando un componente compuesto no es suficiente. Generalmente, tener un <ui:include>
con uno o más <ui:param>
que pase una propiedad de bean administrado (y por lo tanto no un valor codificado) es una señal de que el archivo de inclusión puede ser mejor un archivo de etiqueta.
Ejemplos:
Componentes compuestos
Utilice componentes compuestos si desea crear una personalizada única y reutilizable UIComponent
con una sola responsabilidad utilizando XML puro. Dicho componente compuesto generalmente consta de un grupo de componentes existentes y / o HTML y se representa físicamente como un solo componente y se supone que está vinculado a una sola propiedad de bean. Por ejemplo, un componente que representa una java.util.Date
propiedad única por 3 <h:selectOneMenu>
componentes dependientes , o un componente que se combina <p:fileUpload>
y <p:imageCropper>
en una única <my:uploadAndCropImage>
referencia a una única com.example.Image
entidad personalizada como propiedad.
Ejemplos:
Componentes personalizados
Utilice un componente personalizado siempre que la funcionalidad no se pueda lograr con archivos de etiquetas Facelet o componentes compuestos, debido a la falta de compatibilidad en el conjunto de componentes estándar / disponible. Se pueden encontrar ejemplos en todo lugar en el código fuente de bibliotecas de componentes de código abierto como PrimeFaces y OmniFaces .
Controladores de etiquetas
Cuando desee controlar la construcción del árbol de componentes JSF en lugar de la representación de la salida HTML, debe usar un controlador de etiquetas en lugar de un componente.
Ejemplos:
Proyectos de ejemplo
Aquí hay algunos proyectos de ejemplo que utilizan todas las técnicas mencionadas anteriormente.
¿Podría diferir el rendimiento?
Técnicamente, la preocupación por el rendimiento es insignificante. La elección debe basarse en los requisitos funcionales concretos y el grado final de abstracción, reutilización y mantenibilidad de la implementación. Cada enfoque tiene sus propios objetivos y limitaciones bien definidos.
Sin embargo, los componentes compuestos tienen una sobrecarga significativa durante la construcción / restauración de la vista (específicamente: al guardar / restaurar el estado de la vista). Y, en versiones anteriores de Mojarra, los componentes compuestos tenían problemas de rendimiento con la asignación de valores predeterminados, esto ya está arreglado desde 2.1.13. Además, Mojarra tuvo una pérdida de memoria cuando <cc:attribute method-signature>
se usa a para expresiones de método, básicamente se vuelve a hacer referencia a todo el árbol de componentes en la sesión HTTP, esto se corrigió desde 2.1.29 / 2.2.8. La pérdida de memoria se puede omitir en versiones anteriores 2.1 como se muestra a continuación:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
O en versiones 2.2 anteriores como se muestra a continuación:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Aún así, cuando tiene relativamente "muchos" componentes compuestos, y lo ha javax.faces.STATE_SAVING_METHOD
configurado client
, entonces el rendimiento será un fastidio. No abuse de los componentes compuestos si simplemente desea la funcionalidad básica que ya es posible con un simple archivo de inclusión o etiqueta. No use la facilidad de configuración (léase: no se *.taglib.xml
necesita archivo) como excusa para preferir componentes compuestos a archivos de etiquetas.
Cuando utilice Mojarra 2.2.10 o una versión anterior, no olvide deshabilitar el período de actualización de Facelets relativamente corto para el modo de producción:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
No use esta configuración para el desarrollo, de lo contrario, debe reiniciar todo el servidor para que los cambios en los archivos Facelets se reflejen. Mojarra 2.2.11 y versiones posteriores, y MyFaces ya tiene el valor predeterminado -1
cuando javax.faces.PROJECT_STAGE
no está configurado en Development
.