Hier sind einige Informationen über JSF 2 gespeichert.
!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>
}}}