Die Intersult Taglib ist eine Facelet-Taglib mit einigen nützlichen Tags für die Entwicklung von JEE-Applikationen unter JSF und Seam.
<i:info id="info" value="Dies ist die Infobox"/>
Die Implementierung erfolgt als Facelet in der Datei info.xhtml:
<ui:composition>
<i:meta useId="#{id}" var="comp" rendered="#{empty rendered or rendered}">
<s:graphicImage id="#{comp.id}" url="#{empty img ? '/images/information.png' : img}"
onmouseover="$('#{comp.clientId}-text').style.display = '';"
onmouseout="$('#{comp.clientId}-text').style.display = 'none';"/>
<s:span id="#{comp.id}-text" style="display: none; position: fixed; background-color: yellow; padding: 3px;">
<h:outputText value="#{value}"/>
</s:span>
</i:meta>
</ui:composition>
Die *.taglib.xml enthält folgenden Eintrag, um das Facelet zu registrieren:
<tag> <tag-name>info</tag-name> <source>/tag/info.xhtml</source> </tag>
Was passiert hier? Der meta-Tag generiert eine Component-Id und stellt diese unter der unter var angegebenen Variable (hier comp) zur Verfügung. Diese Variable hat zwei Properties:
Was kann dieser Tag?
Als Luxus kann noch eine TLD im Verzeichnis META-INF abgelegt werden, sodass z.B. der Content Assist von Eclipse eine Code Completion für die eben gebaute Component vornehmen kann:
<tag>
<name>info</name>
<tag-class/>
<body-content>empty</body-content>
<description>Renderes a info icon with popup div.</description>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<type>java.lang.String</type>
<description>Text for popup.</description>
</attribute>
<attribute>
<name>img</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>java.lang.String</type>
<description>Optional: Image for the info icon.</description>
</attribute>
<attribute>
<name>rendered</name>
<description>
Flag indicating whether this component (and its children) should be rendered. Expressions must evaluate
to a boolean.
</description>
</attribute>
</tag>
Einschränkungen: Der meta-Tag ist nur mit State-Saving auf dem Server getest, d.h. ohne Serialisierung. Wenn es Probleme gibt, in der web.xml folgende Parameter setzen:
<context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param>
Dies findet bei ui:include und ui:param ebenso statt, wie bei der Definition von Tags in der Facelets-Taglib. Um dies zu verhindern, steht der Intersult clear-Tag zur Verfügung:
<i:clear var="id,label">
<ui:insert/>
</i:clear>
Was geschieht hier? Der clear-Tag verhindert die weitere Propagierung der UIParameter (also auch Tag-Attribute) "id" und "label".
<i:inputGroup label="Gruppe">
<i:inputText id="test" value="#{test}"/>
</i:inputGroup>
Die Implementierung der inputGroup ist wie folgt:
<i:meta var="comp" useId="#{id}" rendered="#{empty rendered or rendered}">
<fieldset id="#{comp.clientId}">
<legend>
<h:outputText value="#{label}"/>
</legend>
<i:clear var="id,label">
<ui:insert/>
</i:clear>
</fieldset>
</i:meta>
Die Implementkerung von inputText:
<i:meta var="comp" useId="#{id}" rendered="#{empty rendered or rendered}">
<h:panelGrid>
<h:inputLabel for="#{comp.id"} value="#{empty label ? 'Default' : label}"/>
<h:inputText id="#{comp.id}" value="#{value}"/>
<i:message id="#{comp.id}-message" for="#{comp.id}"/>
</h:panelGrid>
</i:meta>
Der Tag inputText enthält wieder eine Referenz auf die Variable Label. Ohne Verwendung des clear-Tag wäre diese nun auf den äußeren Wert gesetzt, da der inputGroup-Tag den Wert nach innen hinein propagiert.
<h:form>
<h:commandLink action="redirect">#{index}</h:commandLink>
<i:inputHidden value="#{list.firstResult}" from="#{index}"/>
</h:form>
Statt dem h:commandLink kann natürlich auch ein a4j:commandLink benutzt werden.
durchgeführt werden kann:
<project>
...
<dependencies>
...
<dependency>
<groupId>com.intersult</groupId>
<artifactId>com.intersult.ui</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
...
<repositories>
...
<repository>
<id>intersult-repository</id>
<name>Intersult Repository</name>
<url>http://repository.intersult.com/repository</url>
</repository>
...
</repositories>
...
</project>