This page (revision-63) was last changed on 26-Mar-2013 12:05 by Dieter Käppel

This page was created on 07-Jun-2009 20:54 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
63 26-Mar-2013 12:05 26 KB Dieter Käppel to previous
62 26-Mar-2013 12:05 26 KB Dieter Käppel to previous | to last
61 24-Nov-2012 12:00 26 KB Dieter Käppel to previous | to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 changed one line
Die Intersult Taglib ist eine Taglib zur Produktion von Taglibs. Die produzierten Tags sind geeignet für die Entwicklung von JEE-Applikationen unter JSF, Seam, Facelets, Tomahawk und Richfaces. Damit produzieren Sie alle denkbaren Tags in hoher Geschwindigkeit, auch mit Javascript, AJAX, Styles oder Images.
__Achtung:__ [Intersult Taglib] ist nur für JSF 1.2. Für die aktuelle Version JSF 2.1 gibt es [JSF Ext].
At line 3 added 12 lines
Die Intersult hat die Herstellung von JSF-Components revolutioniert: Die [Intersult Taglib] ermöglicht erstmals die Erstellung vollwertiger Facelet-Tags in XHTML. Und das ohne eine Zeile Java-Code zu schreiben.
Die effiziente Herstellung von Components hat einen gravierenden Vorteil: Einzelteile werden wiederverwertbar, das Web-System einheitlicher. Die Components können weiterentwickelt werden, während das Gesamtsystem wächst.
Wir beraten Sie gerne über den Einsatz von Components und die effiziente Strukturierung von JEE-Projekten. Wir liefern Ihnen die für Ihr Projekt nützlichen Components.
!!!Inhalt
[{TableOfContents }]
!!!Was ist Meta-UI?
Die Intersult Taglib "meta-ui" ist eine Taglib zur Produktion von Taglibs. Die produzierten Tags sind geeignet für die Entwicklung von JEE-Applikationen unter JSF 1.2, Seam, Facelets, Tomahawk und Richfaces. Damit produzieren Sie alle denkbaren Tags in hoher Geschwindigkeit, auch mit Javascript, AJAX, Styles oder Images.
At line 4 changed one line
Der wichtigste Tag von "com.intersult.ui" ist der meta-Tag. Was ist ein Meta-Tag? Das ist ein Tag zur Konstruktion einer Component mittels einer XHTML-Datei mit vollwertigem Id- und Rendering-Verhalten. Der Bau eigener Components wird damit zum Kinderspiel, da in der Regel keine komplizierten Tag-, Renderer- und Handler-Klassen mehr geschrieben werden brauchen. Eine Java-Klasse bauen Sie nur noch, wenn Ihre Komponente ein Datenmodell braucht, also mit dem value-Attribut an einen Wert gebunden wird.
Der wichtigste Tag der Gruppe "com.intersult", Artifact "meta-ui" ist der meta-Tag. Was ist ein Meta-Tag? Das ist ein Tag zur Konstruktion einer Component mittels einer XHTML-Datei mit vollwertigem Id- und Rendering-Verhalten. Der Bau eigener Components wird damit zum Kinderspiel, da in der Regel keine komplizierten Tag-, Renderer- und Handler-Klassen mehr geschrieben werden brauchen. Eine Java-Klasse bauen Sie nur noch, wenn Ihre Komponente ein Datenmodell braucht, also mit dem value-Attribut an einen Wert gebunden wird.
At line 12 removed 10 lines
** __id:__ Innerhalb des meta-Tags kann hier eine Id abgerufen werden und als Zuweisung für eine andere Komponente verwendet werden. Diese Id darf natürlich nur einmal verwendet werden, da die im Component-Tree von JSF eindeutig sein muss. Werden mehrere Ids gebraucht, können diese mit #{comp.id}-suffix erzeugt werden.
** __clientId:__ Innerhalb des meta-Tags kann hier die clientId, als die im HTML-Code tatsächlich heraus generierte Id abgefragt werden. Dies wird vom JavaScript-Code gebraucht.
** __parentId:__ Die JSF-Id des übergeordneten Tags.
** __parentClientId:__ Die ClientId des übergeordneten Tags. Damit ist es möglich, z.B. Javascript-Tags zu bauen, die Aktionen für einen Event durchführen.
** __javascriptId:__ Eine aus der ClientId abgeleitete Id, die für Javascript Variablen und Funktionen benutzt werden kann. Die ClientId kann nicht verwendet werden, da diese Id das Trennzeichen ':' enthält.
** __index:__ Liefert die Position des eigenen Tags im Parent Tag. Damit lassen sich Tabellen einfach mit gestreiftem Muster versehen, erste und letzte Zeile mit besonderem Style versehen etc.
** __count:__ Liefert die Gesamtzahl der Tags im Parent Tag.
** __first:__ Liefert einen boolean-Wert ob der Tag der erste Tag im Parent Tag ist. Damit lassen sich z.B. Header einfärben oder mit anderen Images versehen.
** __last:__ Wie first, nur dass hier auf den letzten Tag geprüft wird.
** __get/set:__ Mit dem generischen getter-/setter-Paar "Object get(String property)" und "void set(String property, Object value)" erhalten man Zugriff auf die UI-Parameter, die an die Komponente übergeben wurden.
At line 28 changed 3 lines
* __attribute:__ Damit kann ein Attribut der Parent Component überschrieben werden, z.B. um einen Javascript-Event hinzuzufügen. Dazu werden ebenfalls das Attribut ''get'' spezifiziert, das den Wert enthält, der gesetzt werden soll. Optional kann das Attribut ''set'' spezifiziert werden, um den Setter zu überschreiben. Der so erzeugte Tag muss nach A4J- oder Richfaces-Handler gestellt werden, da diese den Handler einfach überschreiben würden. Der meta-Tag hingegen konkateniert die Handler, sodass beide ausgeführt werden.
* __get:__ Dieses Attribut wird zusammen mit ''attribute'' verwendet, um ein Attribut der Parent Component zu überschreiben. Wurde mit ''attribute'' ein Attribut spezifiziert, muss mit ''get'' ein Wert angegeben werden, der beim Lesen des original Attributs der Parent Component geliefert wird. ''get'' kann selbst eine EL-Expression sein, dabei ist ein Zugriff auf den Originalwert durch die Variable ''value'' möglich. Das Überschreiben des Setters kann durch das Attribut ''set'' erfolgen.
* __set:__ Dieses Attribut wird zusammen mit ''attribute'' und ''get'' verwendet, ist jedoch optional. Wenn mit ''attribute'' ein Attribut der Parent Component spezifiziert wurde, wird nicht der originale Wert gesetzt, sondern der unter ''set'' spezifizierte. Wie bei ''get'' kann es sich hier um eine EL-Expression handelt, der original zu setzende Wert ist unter der Varialbe ''value'' zugreifbar.
* __attribute:__ Damit kann ein Attribut der Parent Component überschrieben werden, z.B. "onclick" um den Javascript-Event onclick zu überschreiben. Über das Attribut ''get'' spezifiziert wird der entsprechende Wert gesetzt. Optional kann über das Attribut ''set'' der Setter überschreiben werden. Der so erzeugte Tag muss nach A4J- oder Richfaces-Handler gestellt werden, da diese den Handler einfach überschreiben würden. Der meta-Tag hingegen konkateniert die Handler, sodass beide ausgeführt werden. Das so überschriebene Attribut der parent Component kann über "#{comp.attribute}" zugegriffen werden.
* __get:__ Dieses Attribut wird zusammen mit ''attribute'' verwendet, um ein Attribut der Parent Component zu überschreiben. Wurde mit ''attribute'' ein Attribut spezifiziert, muss mit ''get'' ein Wert angegeben werden, der beim Lesen des original Attributs der Parent Component geliefert wird. Der Wert ''#{comp.attribute.value}'' entspricht dabei der ursprünglichen Zuweisung. Das Überschreiben des Setters kann durch das Attribut ''set'' erfolgen.
* __set:__ Dieses Attribut wird zusammen mit ''attribute'' und ''get'' verwendet, ist jedoch optional. Wenn mit ''attribute'' ein Attribut der Parent Component spezifiziert wurde, wird nicht der originale Wert gesetzt, sondern der unter ''set'' spezifizierte. Wie bei ''get'' kann es sich hier um eine EL-Expression handelt, der original zu setzende Wert ist unter der Varialbe '''' zugreifbar. Wird kein Setter spezifiziert entspricht das dem Ausdruck "#{comp.attribute.newValue}".
At line 34 added 18 lines
Wie unter dem Attribut ''var'' beschrieben wird das Object innerhalb des Component Scope einer Variable mit dem unter ''var'' spezifiziertem Namen zugeordnet. In den Beispielen ist das meist ''comp''. Unter diesem Component Object kann auf verschiedene Properties zugegriffen werden:
* __id:__ Innerhalb des meta-Tags kann hier eine Id abgerufen werden und als Zuweisung für eine andere Komponente verwendet werden. Diese Id darf natürlich nur einmal verwendet werden, da die im Component-Tree von JSF eindeutig sein muss. Werden mehrere Ids gebraucht, können diese mit #{comp.id}-suffix erzeugt werden.
* __clientId:__ Innerhalb des meta-Tags kann hier die clientId, als die im HTML-Code tatsächlich heraus generierte Id abgefragt werden. Dies wird vom JavaScript-Code gebraucht.
* __parentId:__ Die JSF-Id des übergeordneten Tags.
* __parentClientId:__ Die ClientId des übergeordneten Tags. Damit ist es möglich, z.B. Javascript-Tags zu bauen, die Aktionen für einen Event durchführen.
* __javascriptId:__ Eine aus der ClientId abgeleitete Id, die für Javascript Variablen und Funktionen benutzt werden kann. Die ClientId kann nicht verwendet werden, da diese Id das Trennzeichen ':' enthält.
* __index:__ Liefert die Position des eigenen Tags im Parent Tag. Damit lassen sich Tabellen einfach mit gestreiftem Muster versehen, erste und letzte Zeile mit besonderem Style versehen etc.
* __count:__ Liefert die Gesamtzahl der Tags im Parent Tag.
* __first:__ Liefert einen boolean-Wert ob der Tag der erste Tag im Parent Tag ist. Damit lassen sich z.B. Header einfärben oder mit anderen Images versehen.
* __last:__ Wie first, nur dass hier auf den letzten Tag geprüft wird.
* __get/set:__ Mit dem generischen getter-/setter-Paar "Object get(String property)" und "void set(String property, Object value)" erhalten man Zugriff auf die UI-Parameter, die an die Komponente übergeben wurden.
* __attribute:__ Über dieses Property kann auf Informationen zu dem über das Attribut ''attribute'' gebundenen Attribute der Parent Component zugegriffen werden:
** __name:__ Name des gebundenen Attributs.
** __attributeValue:__ Der Attribute-Value der gebundenen Komponente. Dieser ist nur gesetzt wenn es sich um einen konstanten Wert und nicht um eine EL-Expression handelt.
** __value:__ Der aktuelle Value des Attribute der parent Component das mit ''attribute'' spezifiziert wurde. Sie auch Attribute ''get''.
** __expression:__ Die ValueExpression der parent Component die an das mit ''attribute'' spezifizierte Attribute gebunden ist.
** __newValue:__ Der neu zuzuordnente Wert der dem durch das ''attribute'' spezifizierten Attribute der parent Component. Nur im Scope der Auswertung des Attribute ''set'' erfügbar. Siehe auch Attribute ''set''.
At line 178 changed one line
!Beispiel setValue
!Beispiel Handler
At line 183 changed one line
<i:meta var="comp" useId="#{id}" rendered="#{empty rendered or rendered}" event="#{event}">
<i:meta var="comp" useId="#{id}" rendered="#{empty rendered or rendered}" attribute="#{event}" get="#{comp.javascriptId}(this); #{value}">
At line 283 added 6 lines
Der meta-Tag im Beispiel arbeitet wie folgt:
* Das Attribut ''attribute="value"'' legt fest, dass das Attribut ''value'' des äußeren Tags ''selectBooleanCheckbox'' überschrieben wird.
* Sobald die Component ''selectBooleanCheckbox'' auf ''value'' zugreift, liefert der meta-Tag stattdessen den Wert des Attributs ''get'' zurück, also ''#{!value}''. Die Variable ''value'' innerhalb der EL-Expression referenziert dabei den Originalwert ''#{article.sold}''. Durch Einsetzen des Originalwert erhält man ''#{!article.sold}''.
* Wenn die Component ''selectBooleanCheckbox'' einen neuen Wert auf ''value'' zurückschreibt, wird stattdessen der Wert des Attributs ''set'' vom meta-Tag geschrieben, im Beispiel also ''#{!value}''. Die Variable ''value'' innerhalb der EL-Expression referenziert hier den Wert, den die Component setzen möchte.
At line 366 added 12 lines
!!!Tag validator
Mit dem validator-Tag können Validators anhand EL-Expressions geschrieben werden. Das Schreiben vieler Validator-Classes wird dadurch erspart. Darüber hinaus ist mit dem validator-Tag eine Parametrisierung der Validierung möglich.
Beispiel ist ein Validator für zwei Datumswerte, der den Anfang eines Events vor dessen Ende prüft:
{{{
<i:inputCalendar value="#{event.from}/>
<i:inputCalendar value="#{event.to}>
<i:validator expression="#{event.from lt value}" message="From before to!"/>
</i:inputCalendar>
}}}
At line 370 changed one line
JSF oder Seam stellen zwar Mechanismen zum Laden von Bundles zur Verfügung, jedoch nicht für das Hinzufügen von Bundles aus JAR-Dateien. Mit dem Intersult ResourceBundle wird diese Interferenz vermieden, es kann ein Resource-Bundle innerhalb der Taglib geladen werden. Dazu wird einfach ein Einträge nach folgendem Schema in die components.xml der Taglib-JARs und der Applikation gemacht:
Das ResourceBundle ist eine Erweiterung der Resource-Bundles (länder- und sprachspezifisches Laden von *.properties Resourcen) von JSF und Seam um folgende Features:
At line 410 added 5 lines
* __JAR-Resources:__ JAR-Dateien können Resources enthalten, die vom verwendenten WAR überschrieben werden können. Eine Taglib kann damit eigene Resources mitliefern.
* __Runtime-Loading:__ Die Resourcen können im laufenden Deployment geändert werden und können sofort zugegriffen werden.
Dazu wird einfach ein Einträge nach folgendem Schema in die components.xml der Taglib-JARs und der Applikation gemacht:
At line 425 added 50 lines
!!!Interception
Mit der Intersult taglib können EJB3 Interceptoren durch Events realisiert werden. Konkret heißt das, alle Method Invocations auf Seam- und EJB3-Beans können per Observation abgefangen werden.
!!Eigene Interceptoren
{{{
@Observer("com.intersult.interceptor.preInvoke")
public void preInvoke(InterceptorContext context) throws Exception {
...
}
@Observer("com.intersult.interceptor.postInvoke")
public void postInvoke(InterceptorContext context) throws Exception {
...
}
}}}
InterceptorContext enthält dabei die Felder:
* __invocationContext:__ Der IncovationContext der Methode
* __proceed:__ Nur relevant bei preInvoke, Boolean Feld ob nach Abarbeitung aller Obersvators die Methode ausgeführt werden sollen. Dabei ist zu beachten dass sich mehrere Observatoren gegenseitig überschreiben könnten, der Implementor ist verantwortlich für die Auflösung von Konflikten.
* __result:__ Nur relevant bei postInvoke, Object Feld das das Ergebnis der Invocation enthält. Das Ergebnis kann verändert werden. Dabei ist zu beachten dass sich mehrere Observatoren gegenseitig überschreiben könnten, der Implementor ist verantwortlich für die Auflösung von Konflikten.
!!EjbInjector
Der EjbInjector ist eine bereits in der Intersult taglib enthaltener Interceptor der auf der Event-Technologie basiert. Werden in Seam-Beans @EJB-Injections benutzt, sind diese normaler Weise unwirksam. Der EjbInjector löst diese Abhängigkeiten auf. Entweder der vollständige Name wird angegeben:
{{{
@EJB(name = "earName/beanName/local"
private Bean bean;
}}}
Oder der Name wird generiert aus dem Seam jndiPattern aus der Init-Komponente, die in der components.xml definiert wird:
JBoss:
{{{
<core:init jndi-pattern="ear-name/#{ejbName}/local"/>
}}}
Glassfish:
{{{
<core:init jndi-pattern="java:comp/env/#{className}/#{fieldName}"/>
}}}
In der Seam-Bean braucht dann nur noch die @EJB-Annotation zu stehen:
{{{
@EJB
private Bean bean;
}}}
At line 395 changed 2 lines
<artifactId>com.intersult.ui</artifactId>
<version>1.0-SNAPSHOT</version>
<artifactId>meta-ui</artifactId>
<version>1.1-SNAPSHOT</version>
At line 415 removed 16 lines
!Manuell
Folgende Bibliotheken sind im Stand vom 07.06.2009. Daher sind nicht alle oben beschriebenen Features enthalten. Es wird dringend der Einsatz von Maven2 empfohlen.
* [Intersult Taglib/com.intersult.ui-1.0-20090607.204442-8.jar]
* [Intersult Taglib/com.intersult.util-1.0-20090607.204442-7.jar]
* JBoss Seam 2.1.2.CR2
* Richfaces 3.3.0.GA
* Facelets 1.1.15.B1
* JSF API/IMPL 1.2_12
* Tomahawk 1.1.8
* Servlet API 2.5
* JSP API 2.0
* Apache commons-lang 2.1
* Apache commons-collections 3.2
* Apache commons-beanutils 1.6