Expression Language (SPEL)
Anchor
Anchor sind pro Mandant eindeutige Bezeichner von Elementen. Innerhalb von Templates kann und soll nie mit den IDs der Elemente gearbeitet werden, damit der Template-Code leserlicher ist (vorausgesetzt es werden sprechende Anchornamen vergeben). Ein weiterer Grund Anchor zu verwenden ist die mandantenunabhängige Implementation von Templates, da eine ID immer einem bestimmten Mandanten zugeordnet ist. Damit jedoch direkte Beziehungen aufgebaut werden können, sind die sog. Anchor vorgesehen. Sie dienen als benannter Ersatz für die ID.
Ein Anchor ist eine Referenz zu einem Element innerhalb des IES. Der Zugriff auf Anker erfolgt über !{anchorname}
und kann je nach Objekt hinter dem Anker mit Attributen erweitert werden:
<sp:print name="!{anchorname}.attribute"/>
Bei Tag-Attributen, die Text erwarten, muss wie auch bei Variablen der Anchor in ${...}
gefasst werden.
<sp:text name="attribute" value="${!{anchorname}.attribute}"/>
Anchornamen dürfen nur aus Alphanummerischen Zeichen, Punkten, Unterstrichen und Bindestrichen bestehen.
Variable
Mit Variablen lassen sich Daten speichern, die vom Template gelesen und geschrieben werden können. Variablen werden beispielsweise von Tags verwendet, um das Ergebnis einer Aktion zu speichern (sp:sort speichert die umsortierte Liste in einer Variable).
Hinweis: Variablennamen dürfen nicht mit einer Zahl beginnen und dürfen nur aus alphanummerischen Zahlen und Unterstrichen bestehen.
Zum Beispiel kann sp:set dazu verwendet werden, um eine Variable zu definieren:
<sp:set name="a" value="kleines a"/>
sp:set erzeugt in in dem obigen Beispiel ein String-Objekt mit dem Variablennamen a
. Eine Variable repräsentiert immer ein Object. Im einfachsten Fall sind das String-, Number- und Date-Objekte.
Attribute
Attribute beschreiben Objekte und dessen Werte. Attribute sind im einfachsten Fall Variablen, die beispielsweise mit sp:set gesetzt wurden. In diesem Fall besteht das Attribut nur aus dem Variablennamen.
Beispiel:
<sp:set name="a" value="kleines a"/>
<sp:print name="a"/>
Der sp:print-Tag erwartet in name
ein Attribut und löst die Variable a
auf. Die Ausgabe ist dann:
kleines a
In diesem Fall ist a
ein String-Objekt. Durch die Angabe des Variablennamens wurde die Zeichenkette selbst ausgegeben. Attribute können aber auch aus mehreren Teilen bestehen. Um jetzt auf ein Attribut des String-Objektes zuzugreifen, wird der Attributname des Objektes angehängt. Der Variablenname und der Attibutname werden durch einen Punkt (.) getrennt. Beispielsweise kann das Attribut toUpperCase
der a
-Variable wie folgt ausgegeben werden.
<sp:print name="a.toUpperCase"/>
Die Ausgabe ist dann:
KLEINES A
toUpperCase
ist ebenfalls ein String-Objekt, auf dessen Attribute ebenfalls zugegriffen werden kann.
Einige Objekte stellen nicht nur Attribute sondern auch Methoden zur Verfügung. Methoden erwarten Übergabeparameter, die in Klammern ( ) zusammengefasst sind. Das String-Objekt besitzt beispielsweise die Methode substring. Diese liefert ein String-Objekt mit der Zeichenkette ab der angegebenen Position. Die anzugebende Position ist ein Methoden-Parameter. Methoden-Parameter sind ebenfalls Objekte.
<sp:print name="a.toUpperCase.substring(3)"/>
Ausgegeben wird:
EINES A
In den hier verwendeten Beispielen ist die Variable a mit dem sp:set-Tag erzeugt worden. Die Variable wird in einem Bereich abgelegt, der nur für den ausführenden Request erreichbar ist. Nachdem der Request abgearbeitet wurde, existiert die Variable nicht mehr. Dieser Bereich wird als Request-Scope bezeichnet. Der IES kennt mehrere Bereiche, in denen Variablen und Objekte abgelegt werden können.
Scope
Mit einem Scope, ist eine Umgebung gemeint, in der die dort abgelegten Variablen erreichbar sind. Ein Beispiel für einen derartigen Bereich ist der Session Scope. Alle Variablen innerhalb dieses Bereichs sind nur von dem Nutzer dieser Session erreichbar.
Um Variablen aufzulösen ist es nicht erforderlich, dass angegeben wird, in welchem Bereich sich die Variable befindet. Der IES durchsucht alle von ihm zur Verfügung gestellten Bereiche in einer definierten Reihenfolge. Wurde eine gewünschte Variable in einem Bereich gefunden, wird diese verwendet, ohne dass die nachfolgenden Bereiche weiter berücksichtigt werden. In folgender Reihenfolge werden die Bereiche durchsucht:
- Page Scope
- Aktuelles Element
- Request Scope
- Window Scope
- Session Scope
- Application Scope
- Request-Parameter Scope
Page Scope
Der Page Scope ist der Bereich für ein Template. Bei der Ausführung eines Templates wird dieser Bereich angelegt. Variablen, die in diesem Bereich abgelegt werden, gelten zur Ausführungszeit des Templates. Werden in einem Template mit sp:include weitere Templates eingebuden, so existiert für jedes eingebundene Template ein eigener Page Scope. Variablen dieses Bereichs können von anderen Templates nicht gelesen oder geändert werden.
Aktuelles Element
Das aktuelle Element ist kein Bereich im eigentlichen Sinne. Hier können keine Variablen abgelegt oder geändert werden. Er dient als reiner lesender Zugriff auf alle Attribute eines bestimmten Elementes. Welches Element (welche Instanz) als aktuelles Element verwendet wird, ist in der Variable SYS_current
definiert. Diese kann beliebig gesetzt werden und muss entweder ein Element, eine ID oder ein String im ID-Format sein. Um die Variable SYS_current
zu setzen, kann entweder sp:set verwendet werden, oder SYS_current
wird als Request-Parameter mitgesendet.
Request Scope
Der Request Scope ist der Bereich in dem Variablen innerhalb eines HTTP-Requests gültig sind. Nach dem der Request abgearbeitet wurde, stehen die für diesen Bereich gesetzten Variablen nicht mehr zur Verfügung. Alle mit sp:include eingebundenen Templates greifen auf den gleichen Request Scope zu. So können eingebundene Templates auf Variablen zugreifen, die in einem anderen Template schon gesetzt wurden.
Alle von sp- und spt-Tags gesetzten Variablen werden in den Request Scope abgelegt, wenn nicht mit dem Tag-Attribut scope
ein anderer Bereich angegeben ist.
Window Scope
Der Window Scope ist ein Teilbereich des Session Scopes. Die Variablen gelten templateübergreifend innerhalb einer HTTP-Session, allerdings nur für ein Fenster. Nachdem die Session beendet wurde, oder in einen Timeout gelaufen ist, stehen die für diesen Bereich gesetzten Variablen nicht mehr zur Verfügung. Eine Browser-Instanz kann mehrere Fenster und Tabs besitzen, die die gleichen Cookies verwenden und sich somit die selbe HTTP-Session teilen. Um Session-Variablen für ein Browser-Fenster bzw. einen Browser-Tab zu definieren, wird der Window-Scope verwendet. Damit der IES die einzelnen Fenster und Tabs unterscheiden kann, muss mit jedem Request der Request-Parameter SYS_window
mit der aktuellen Window-ID mitgesendet werden. sp:form und sp:url übernehmen diese Aufgabe. Werden URLs und Formulare konsequent mit sp:form und sp:url erzeugt, wird automatisch dafür gesorgt, dass alle Request die nötigen Parameter mitliefern.
Session Scope
- Der Session Scope ist der Bereich in dem Variablen innerhalb einer HTTP-Session gütlig sind. Nachdem die Session beendet wurde, oder in einen Timeout gelaufen ist, stehen die für diesen Bereich gesetzten Variablen nicht mehr zur Verfügung. Alle mit sp:include eingebundenen Templates greifen auf den gleichen Session Scope zu.
Application Scope
- Der Application Scope ist ein globaler Bereich, auf den alle Templates für alle HTTP-Requests in allen HTTP-Sessions zugreifen können. Variablen dieses Bereichs werden erst gelöscht, wenn der Server heruntergefahren wird.
Request-Parameter Scope
- Der Request-Parameter Scope ist der Bereich, in dem die Request-Parameter (GET-Parameter und POST-Formularfelder) genutzt werden können. Auf diesen Bereich kann nur lesend zugegriffen werden.
Text
Ein Text ist eine beliebige Zeichenkette, die Variablen enthalten kann. Variablen beginnen mit ${
und enden mit }
. Die Variablen werden ausgewertet und deren Inhalt an der Stelle der jeweiligen Variable eingefügt.
Beispiel:
<sp:set name="a" value="kleines a"/>
<sp:print text="Dies ist ein ${a}."/>
Die Variable a
wird durch sp:print
aufgelöst und an die Stelle der Variable eingefügt. Die Ausgabe ist dann:
Dies ist ein kleines a.
Um doppelte Anführungszeichen auszugeben, müssen diese mit einem Backslash (\) escaped werden. Um einen Backslash auszugeben, müssen zwei Backslashes angegeben werden.
Beispiel:
<sp:set name="a" value="kleines a"/>
<sp:print text="\\ Dies ist ein \"${a}\"."/>
Die Ausgabe ist dann:
\ Dies ist ein "kleines a".
Expression
Expression ist ein mathematischer Ausdruck, der aus Operanden und Operatoren besteht.Ein Operand ist eine Variable, ein Attribut oder ein Literal. Im Fall einer Variablen oder eines Attributs wird der Wert der Variablen oder des Attributs ausgelesen und danach die Berechnung durchgeführt.
Operanten
Für Expressions sind folgende Literale definiert:
- Reelle Zahlen
- Reelle Zahl in dem Wertebereich 4.94065645841246544E-324 - 1.79769131486231570E+308
- Reelle Zahlen können in einfacher Schreibweise wie 100 oder 100.1 oder in Exponenzial-Schreibweise wie 1.001E2 (1.001 x 102) vorkommen
Operanden können auch Variablen und Attribute sein. Diese werden in ${ } gefasst. Beispiel: ${a} für eine Variable a.
Bei der Angabe von Variablen und/oder Attributen in einer Expression werden diese zunächst aufgelöst und anschließend die Expression ausgeführt. Ist die Variable ein Number-Objekt, oder ist es ein Objekt, dass in ein Number-Objekt umgewandelt werden kann (beispeilsweise ein String-Objekt, welches nur aus Nummerischen Zeichen besteht), wird dieser Zahlenwert direkt verwendet. Zur Umwandlung von Zeichenketten in Zahlen gelten noch folgende Sonderfälle:
- Besteht die Zeichenkette nur aus einem Leerstring "", so wird dieses Objekt in eine 0 umgewandelt.
- Existiert die Variable oder das Attribute nicht (null), so wird die Variable durch 0 ersetzt.
Bei Objekten, die nicht in eine Zahl umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
Operatoren
Für Expressions sind folgende Operatoren definiert:
- Klammern ( )
- Klammern werden verwendet, um die Reihenfolge der Auswertung des mathematischen Ausdrucks zu ändern.
- Potenz ^
- Exponenziert eine Basis mit einem Exponenten Beispiel: 2^8 (28).
- Multiplikation * , Division / und Rest % (Modulo)
- Rechen-Operationen Multiplikation * , Division / und Rest % (Modulo)
- Addition + und Subtraktion -
- Rechen-Operationen Addition + und Subtraktion -
Beispiel
<sp:set name="variable_a" value="5"/>
<sp:set name="variable_b" value="4"/>
<sp:set name="variable_c" expression="${variable_a} + ${variable_b}"/>
<sp:print expression="${variable_a} * ( ${variable_c} + ${variable_b} ) - 23"/> <%-- 5 * ( ( 5 + 4 ) + 4 ) - 23 --%>
Die Ausgabe ist dann:
42
?: (Elvis-Operator)
Ab Version 2.52
Der Elvis-Operator (Siehe Wikipedia:Elvis operator) erlaubt Bedingungen innerhalb von Expressions.
Condition ? ExpressionA : ExpressionB
Ist Condition true, wird ExpressionA verwendet, sonst Expression B
Beispiel
<sp:set name="_a" value="1"/>
<sp:set name="_b" value="2"/>
<sp:set name="_c" value="3"/>
<sp:set name="_d" expression="${_a} > ${_b} ? ${_c} : 4"/>
<sp:print expression="${_d}"/> <%-- Ergebnis: 4 --%>
Condition
Condition ist ein logischer Ausdruck, der aus Operanden und vergleichenden und/oder logischen Operatoren besteht. Ein Operand ist eine Expression, eine Variable, ein Attribut oder ein Literal. Im Fall einer Variablen oder eines Attributs wird der Wert der Variablen oder des Attributs ausgelesen und danach der Vergleich durchgeführt.
Operanten
Für Conditions sind folgende Literale definiert:
- Boolean
- Die booleschen Werte
true
undfalse
- Reelle Zahlen
- Reelle Zahl in dem Wertebereich 4.94065645841246544E-324 - 1.79769131486231570E+308
- Reelle Zahlen können in einfacher Schreibweise wie 100 oder 100.1 oder in Exponenzial-Schreibweise wie 1.001E2 (1.001 x 102) vorkommen.
Zeichenketten
Zeichenketten werden in einfache Anführungsstriche gesetzt 'abc
'. Um Anführungszeichen zu escapen müssen doppelte Backslashes verwendet werden (\\').
- null
null
ist das Literal für ein nicht vorhandenes Objekt.
Operanden können auch Variablen und Attribute sein. Diese werden in ${ }
gefasst. Beispiel: ${a}
für eine Variable a
.
Ein Operand kann auch eine Expression sein.
Vergleichs Operatoren
Vergleichs-Operatoren vergleichen Ausdrücke miteinander und geben einen Wahrheitswert (Boolean) zurück. Die zur Verfügung gestellten Operatoren sind:
- Größer (>)
- Kleiner (<)
- Test auf Gleichheit (==)
- Test auf Ungleichheit (!=)
- Größer-gleich (>=)
- Kleiner-gleich (<=)
Operanden können auch Variablen und Attribute sein. Diese werden in ${ }
gefasst. Beispiel: ${a}
für eine Variable a
.
Bei der Angabe von Variablen und/oder Attributen in einer Vergleichs-Operation werden diese zunächst aufgelöst und anschließend der Vergleich ausgeführt. Ist die Variable ein Number-Objekt, oder ist es ein Objekt, das in ein Number-Objekt umgewandelt werden kann (beispeilsweise ein String-Objekt, welches nur aus nummerischen Zeichen besteht), wird dieser Zahlenwert direkt verwendet. Zur Umwandlung von Zeichenketten in Zahlen gelten noch folgende Sonderfälle:
- Besteht die Zeichenkette nur aus einem Leerstring "", so wird dieses Objekt in eine 0 umgewandelt.
- Existiert die Variable oder das Attribute nicht (
null
), so wird die Variable durch 0 ersetzt.
Bei Objekten, die nicht in eine Zahl umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
Beispiel für eine Condition mit Vergleichs-Operator
${a} > 10
Logische Operatoren
Mit logischen Operatoren werden Wahrheitswerte nach definierten Mustern verknüpft. Logische Operatoren operieren nur auf Boolean-Objekte. Die zur Verfügung gestellten Operatoren sind:
- Nicht (!)
- Und (&&)
- Oder (||)
Bei der Angabe von Variablen und/oder Attributen in einer Condition werden diese zunächst aufgelöst und anschließend der Vergleich durchgeführt. Ist die Variable ein Boolean-Objekt oder ist es ein Objekt, das in ein Boolean-Objekt umgewandelt werden kann (beispeilsweise ein String-Objekt, mit der Zeichenkette true oder false), wird dieser Boolean-Wert direkt verwendet.
Bei Objekten, die nicht in einen booleschen Wert umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
Beispiel für einen logischen Vergleich
${a} || ${b}
Für logische Operatoren können auch Conditions mit Vergleichsoperatoren als Operanten verwendet werden.
Beispiel:
(${a} > 10) && (${b} <= 5)
Nicht nur Variablen und Attribute können als Operanden verwendet werden, sondern auch Expressions.
Beispiel:
( (${a} + 10) > 20) && ( (4 / ${b}) <= 2)
Logische Vergleiche im IES
Wert | isNull(Wert) | Wert == null | Wert == 0 | Wert != 0 |
---|---|---|---|---|
""
|
true
|
true
|
true
|
false
|
"0"
|
false
|
true
|
true
|
false
|
0
|
false
|
true
|
true
|
false
|
"null"
|
false
|
false
|
false
|
true
|
null
|
true
|
true
|
true
|
false
|