Pregunta

Comencé a usar JSF 2.0 con facelets recientemente y me desconcertaron los nuevos componentes compuestos conociendo existentes <ui:include> y otras técnicas de plantilla ofrecidas por FACELETS 1.x.

¿Cuál es la diferencia entre esos enfoques? Funcionalmente parecen ofrecer lo mismo: <ui:param> VS <cc:attribute>, <ui:insert>+<ui:define> VS Archivos de etiqueta, reutilización de las plantillas existentes. ¿Hay algo además de la sintaxis y la especificación de interfaz clara en caso de componentes compuestos? ¿Podría el rendimiento diferir?

¿Fue útil?

Solución

¿Cuál es la diferencia entre esos enfoques?

Plantillas de facel

Use 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. EG encabezado, menú, contenido, pie de página, etc.

Ejemplos:

Archivos de etiqueta de facelé

Use archivos de etiqueta facelet si desea tener un grupo de componentes reutilizable para prevenir/minimizar la duplicación de código. Por ejemplo, un grupo de componentes de etiqueta+entrada+mensaje. La principal diferencia con los componentes compuestos es que la salida de un archivo de etiqueta de facelet no representa un solo UIComponent y en algunas circunstancias puede ser la única solución cuando un componente compuesto no es suficiente. En general, tener un <ui:include> con uno o más <ui:param> que pasa una propiedad de bean administrada (y, por lo tanto, no un valor codificado) es una señal de que el archivo de incluido puede ser mejor un archivo de etiqueta.

Ejemplos:

Componentes compuestos

Use componentes compuestos si desea crear una sola y reutilizable personalizada UIComponent con una sola responsabilidad usando XML puro. Tal componente compuesto generalmente consiste en un montón de componentes existentes y/o HTML y se reproduce físicamente como componente único y se supone que está vinculado a una sola propiedad de frijoles. Por ejemplo, un componente que representa un solo java.util.Date Propiedad por 3 dependientes <h:selectOneMenu> componentes o un componente que combina <p:fileUpload> y <p:imageCropper> en un solo <my:uploadAndCropImage> refiriendo una sola personalización com.example.Image entidad como propiedad.

Ejemplos:

Componentes personalizados

Use un componente personalizado siempre que la funcionalidad no se pueda lograr con archivos de etiqueta de facelé o componentes compuestos, debido a la falta de soporte en el conjunto estándar/disponible de componentes. Se pueden encontrar ejemplos sobre todo el lugar en el código fuente de bibliotecas de componentes de código abierto, como Primitaderos y Omnifacios.

Manejadores de etiquetas

Cuando desee controlar la construcción del árbol de componentes JSF en lugar de representar 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 el rendimiento diferir?

Técnicamente, la preocupación del rendimiento es insignificante. La elección debe hacerse en función de los requisitos funcionales concretos y el grado final de abstracción, reutilización y mantenimiento de la implementación. Cada enfoque tiene su propio propósito y limitaciones bien definidas.

Sin embargo, los componentes compuestos tienen una sobrecarga significativa durante la construcción/restauración de la vista (específicamente: durante el guardar/restauración del estado de 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á solucionado desde 2.1.13. Además, Mojarra tenía un pérdida de memoria cuando una <cc:attribute method-signature> se utiliza para expresiones de método, básicamente todo el árbol de componentes se referenca en la sesión HTTP, esto se soluciona desde 2.1.29 / 2.2.8. La fuga de memoria se puede pasar por alto en versiones más antiguas de 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 más antiguas de 2.2 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 tienes relativamente "muchos" componentes compuestos, y tienes javax.faces.STATE_SAVING_METHOD ajustado a client, entonces el rendimiento será un dolor. No abuse de los componentes compuestos si simplemente desea la funcionalidad básica que ya es posible con un archivo o archivo de etiqueta simple. No use la facilidad de configuración (léase: no *.taglib.xml Archivo necesario) como una excusa para preferir componentes compuestos sobre los archivos de etiqueta.

Cuando use Mojarra 2.2.10 o más, no olvide deshabilitar el período de actualización de facelets relativamente cortos 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 obtener cambios en los archivos de FACELETS para reflejarse! Mojarra 2.2.11 y más nuevo, y myfaces ya está predeterminado a -1 cuando javax.faces.PROJECT_STAGE no está configurado en Development.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top