usar template define como java jsf-2 custom-component composite-component tagfile

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.