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.
<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>