Was kann man also tun, damit man trotzdem wiederverwendbare Komponenten mit geringem Aufwand individualisieren kann?
JSF bietet insertChildren und f:facet an, um Teile von Composite Components vom aussen zu konfigurieren.
Schauen Sie sich dazu die Facet and Insert Children Demo im Forms Demo Projekt an das unter http://xpert-ivy-hacker-source-code.googlecode.com/svn/trunk/Forms ausgecheckt werden kann.
Code-Snippet 1: Ivy Composite Component
Code-Snippet 2: Composite Component konfigurieren
insertChildren
Mit insertChildren werden alle Elemente die innerhalb des Composite Components definiert werden, direkt in den Composite Component eingefügt. Ein tolles Beispiel ist die p:dataTable die als Kinder p:column entgegennimmt.
Um diese Kinder innerhalb eines Composite Components anzeigen zu können, kann man einfach cc:insertChildren (Code-Snippet 1, Zeile 15) verwenden. Im Beispiel wird das p:outputLabel und das p:inputText als Kind eingefügt (Code-Snippet 2, Zeilen 9 und 10).
Um diese Kinder innerhalb eines Composite Components anzeigen zu können, kann man einfach cc:insertChildren (Code-Snippet 1, Zeile 15) verwenden. Im Beispiel wird das p:outputLabel und das p:inputText als Kind eingefügt (Code-Snippet 2, Zeilen 9 und 10).
Facetten
Facetten funktionieren ähnlich wie insertChildren. Der Unterschied ist, dass sie Namen haben und man sie mit f:facet einfügen muss. Des Weiteren muss man die Facetten im Interface angeben und es gibt 2 Möglichkeiten Facetten innerhalb des Composite Components zu rendern.
Die erste ist cc:renderFacet (Code-Snippet 1, Zeile 8). Sie rendert den Inhalt von f:facet direkt und hat somit den selben Effekt wie cc:insertChildren.
cc:insertFacet wird nicht direkt im Composite Component gerendert, sondern in der Komponente, in der cc:insertFacet aufgerufen wird als Facette mitgegeben. Im Beispiel geben wird die header und footer Facette der p:panelGrid mitgegeben und dort gerendert (Code-Snippet 1, Zeilen 11 und 13).
Die erste ist cc:renderFacet (Code-Snippet 1, Zeile 8). Sie rendert den Inhalt von f:facet direkt und hat somit den selben Effekt wie cc:insertChildren.
cc:insertFacet wird nicht direkt im Composite Component gerendert, sondern in der Komponente, in der cc:insertFacet aufgerufen wird als Facette mitgegeben. Im Beispiel geben wird die header und footer Facette der p:panelGrid mitgegeben und dort gerendert (Code-Snippet 1, Zeilen 11 und 13).
Fazit
Facetten und insertChildren sind tolle Werkzeuge, um Composite Components von Fall zu Fall einfach individualisieren zu können.
Über den Author: Heinrich Spreiter ist der Gründer von xpertivyhacker.ch. Kontaktieren Sie ihn auf Xing und Twitter
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.