[{ALLOW modify Intersult}] JSF 2.0 !Composite Tags * Auch bezeichnet als On-The-Fly-Tags, Facelet-2.0-Tags * Include xmlns:x="http://java.sun.com/jsf/composite/path" heißt dass alle Tags unter /resources/path/... geladen werden. * Tags fügen immer eine Komponente im Komponentenbaum ein. * Tags sind UI-Naming-Container, daher entstehen keine Konflikte beim mehrfachen Einfügen der 2.0-Tags. Allerdings ist das auch beim Zugriffspfad zu beachten. * Definition des Interface durch die View * Erweiterung des Interface durch ** __ActionSource__ Es können endlich Actions über EL-Expressions gebunden werden. Dies war bisher das größte Problem bei der Herstellung vollwertiger Komponenten durch Facelets. ** __ValueHolder__ ** __EditableValueHolder__ ** __RenderFacet__ 2.0-Tags können vollwertige Facets enthalten genau wie echte Komponenten. Dadurch ist die Verwendung hässlicher UI-Inserts nicht mehr nötig. ** __InsertFacet__ Facets können auch in Subkomponenten applied werden. * Zugriff aus die Komponente durch EL-Expressions durch #{cc} oder #{component} ** Die Attribute werden nicht mehr unkontrolliert nach innen propagiert, was früher teils zu üblen Fehlern geführt hat. Der Zugriff erfolgt nun über #{cc.attrs} also zum Beispiel #{cc.attrs.value} für den Parameter !AJAX Status Die Component zeit den AJAX-Status an. {{{ <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:composite="http://java.sun.com/jsf/composite" > <composite:interface> <composite:attribute name="onbegin"/> <composite:attribute name="oncomplete"/> <composite:attribute name="onsuccess"/> <composite:attribute name="onerror"/> </composite:interface> <composite:implementation> <script type="text/javascript"> function updateBusyStatus(data) { <c:if test="#{cc.facets.begin != null}"> document.getElementById('#{cc.clientId}:begin').style.visibility = data.status == 'begin' ? 'visible' : 'hidden'; </c:if> <c:if test="#{cc.facets.complete != null}"> document.getElementById('#{cc.clientId}:complete').style.visibility = data.status == 'complete' ? 'visible' : 'hidden'; </c:if> <c:if test="#{cc.facets.success != null}"> document.getElementById('#{cc.clientId}:success').style.visibility = data.status == 'success' ? 'visible' : 'hidden'; </c:if> <c:if test="#{cc.facets.error != null}"> document.getElementById('#{cc.clientId}:error').style.visibility = data.status == 'error' ? 'visible' : 'hidden'; </c:if> } jsf.ajax.addOnEvent(updateBusyStatus); </script> <c:if test="#{cc.facets.begin != null}"> <div id="#{cc.clientId}:begin" style="visibility: hidden;"> <composite:renderFacet name="begin"/> </div> </c:if> <c:if test="#{cc.facets.complete != null}"> <div id="#{cc.clientId}:complete" style="visibility: hidden;"> <composite:renderFacet name="complete"/> </div> </c:if> <c:if test="#{cc.facets.success != null}"> <div id="#{cc.clientId}:success" style="visibility: hidden;"> <composite:renderFacet name="success"/> </div> </c:if> <c:if test="#{cc.facets.error != null}"> <div id="#{cc.clientId}:error" style="visibility: hidden;"> <composite:renderFacet name="error"/> </div> </c:if> </composite:implementation> </html> }}} Verwendung zum Beispiel wie folgt: {{{ <test:ajaxStatus> <f:facet name="begin"> <h:graphicImage id="busyStatus" value="/images/wait30trans.gif"/> </f:facet> </test:ajaxStatus> }}}