java - template - ui:composition primefaces
Uso adecuado de plantillas de Facelet y componentes compuestos (1)
Todavía no estoy seguro sobre el uso correcto de las plantillas JSF y los componentes compuestos. Necesito crear una aplicación web empresarial, que tendrá muchas páginas. Cada página tendrá el mismo encabezado, menú, pie de página y, por supuesto, diferente contenido (= plantilla JSF). El contenido en cada página constará de "cajas" reutilizables (= componentes compuestos JSF). Los recuadros consisten en algunos archivos, botones, etc. ¿Mi solución es la adecuada? ¿O debería usar otra tecnología como, Componentes personalizados, decorar ...?
layout.xhtml
<h:body>
<ui:insert name="main_menu">
<ui:include src="/xhtml/template/main_menu.xhtml"/>
</ui:insert>
<ui:insert name="header">
<ui:include src="/xhtml/template/header.xhtml"/>
</ui:insert>
<ui:insert name="content"/>
<ui:insert name="footer">
<ui:include src="/xhtml/template/footer.xhtml"/>
</ui:insert>
</h:body>
customer_overview.xhtml:
<html xmlns:cc="http://java.sun.com/jsf/composite/composite_component">
<h:body>
<!-- Facelet template -->
<ui:composition template="/xhtml/template/layout.xhtml">
<ui:define name="content">
<!-- Composite Components -->
<cc:component_case_history
caseList="#{customerOverviewController.cases}"
/>
<cc:component_customer
....
/>
...
</ui:define>
</ui:composition>
</h:body>
component_case_history.xhtml
<html xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="cases" type="java.util.List"/>
</composite:interface>
<composite:implementation>
<!-- using of "cases" -->
...
</composite:implementation>
CustomerOverviewController.java
@ManagedBean
@ViewScoped
public class CustomerOverviewController {
public List<Case> getCases() {
...
}
}
EDITAR 2012-04-27
Basado en: ¿ Cuándo usar <ui: include>, archivos de etiquetas, componentes compuestos y / o componentes personalizados?
Creo que debería usar más bien plantillas de Facelet + archivos de etiquetas de Facelet en lugar de plantillas de Facelet + componentes compuestos.
Diseño, plantillas
layout.xhtml:
Cada página tendrá el mismo encabezado, menú, pie de página ...
En este caso, puede omitir el ui: insertar etiquetas para encabezado, menú, pie de página.
<h:body>
<ui:include src="/xhtml/template/main_menu.xhtml"/>
<ui:include src="/xhtml/template/header.xhtml"/>
<ui:insert name="content"/>
<ui:include src="/xhtml/template/footer.xhtml"/>
</h:body>
También puede tener un ui: insertar sin nombre, por lo que si desea simplificar aún más:
<h:body>
<ui:include src="/xhtml/template/main_menu.xhtml"/>
<ui:include src="/xhtml/template/header.xhtml"/>
<ui:insert/>
<ui:include src="/xhtml/template/footer.xhtml"/>
</h:body>
customer_overview.xhtml:
Si tiene ui: inserte sin nombre en layout.xhtml, no necesita ui: defina aquí:
<ui:composition template="/xhtml/template/layout.xhtml">
<!-- Composite Components -->
<cc:component_customer/>
<cc:component_case_history
caseList="#{customerOverviewController.cases}"
/>
...
</ui:composition>
También debe colocar sus plantillas en una carpeta a la que los usuarios no pueden acceder directamente (WEB-INF).
"cajas" reutilizables
Uno de tus componentes compuestos se ve así:
<cc:component_customer/>
Un componente sin ningún atributo es muy sospechoso.
- ¿Qué hace?
- muestra un nombre de usuario?
- ¿cómo obtiene el nombre de usuario si no pasas ningún atributo?
Un componente debe ser autocontenido, para otras partes reutilizables use ui: insertar en su lugar.