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>

HTML Element Tag#

Der Tag rendert ein HTML-Element mit ClientId und übergibt alle Attribute und Childrens.
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:cc="http://java.sun.com/jsf/composite"
>
	<cc:interface name="test">
		<cc:attribute name="element" required="true"/>
		<cc:attribute name="rendered"/>
	</cc:interface>
	<cc:implementation>
		<c:if test="#{!rendered or rendered}">
			<h:outputText value="&lt;#{cc.attrs.element} id=&quot;#{cc.clientId}&quot;" escape="false"/>
			<c:forEach items="#{cc.attributes}" var="attribute">
				<h:outputText value=" #{attribute.key}=&quot;#{attribute.value}&quot;" escape="false"
					rendered="#{!attribute.key.startsWith('javax.faces') and
						!attribute.key.startsWith('com.sun') and
						attribute.key != 'element' and
						attribute.key != 'rendered'}"/>
			</c:forEach>
			<h:outputText value="&gt;" escape="false"/>
			<cc:insertChildren/>
			<h:outputText value="&lt;/#{cc.attrs.element}&gt;" escape="false"/>
		</c:if>
	</cc:implementation>
</html>