Expression Language (SPEL)
Anchor
Anchor sind pro Mandant eindeutige Bezeichner von Elementen. Innerhalb von Templates kann und soll nie mit den ID's der Elementen gearbeitet werden, damit der Template-Code leserlicher ist (vorausgesetzt es werden sprechende Anchornamen vergeben). Ein weiterer Grund Anchor zu verwenden ist die mandantenunabhänge Implementation von Templates, da eine ID immer einem bestimmten Mandanten zuordbar 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 beispielswiese von Tags verwendet, um das Ergebnis einer Aktion zu speichern (sp:sort speicher die umsortierte liste in einer Variable).
Variablennamen dürfen nicht mit eine Zahl beginnen und dürfen nur aus Alphanummerischen Zahlen und Untrestrichen 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 representiert immer ein Objekt. Im einfachsten Fall sind das String-, Number- und Date-Objekte.
Attribut
Attribute beschreiben Objekte und dessen Werte. Attribute sind im einfachsten Fall Variablen, die beispielsweise mit sp:set gesetzt wurde. 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 Variablennames wurde die Zeichenkette selber 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 er 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
Die in den hier verwendetent 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 meherere 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 so einen Bereiche ist der Session Scope. Alle Variablen innerhalb dieses Bereiches 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 Variablen 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 Bereiches können von anderen Template 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 muß 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 gesetzt 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 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 muß mit jedem Request der Request-Parameter SYS_window mit der aktuellen Window-ID mitgesendet werden. sp:form und sp:url übernehmen diese Aufgabe. Werden URL's und Formulare konsequent mit sp:form und sp:url erzeugt, wird automatisch dafür gesorgt, das 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 Bereiches 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). Auf diesen Bereich kann nur lesend zugegriffen werden.
Text
Ein Text ist eine beliebige Zeichenkette, die Variablen enthalten kann. Variablen beginnt mit ${ und endet mit }. Die Variablen werden ausgewertet und dessen Inhalt an der Stelle der 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 (\) escapt 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 Variablen, ein Attribut oder ein Literal. Im Fall einer Variablen oder eines Attribut wird der Wert der Variablen oder des Attribut 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)
- 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, das in ein Number-Objekt umgewandelt werden kann (beispeilsweise ein String-Objekt, das 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="a" value="5"/>
<sp:set name="b" value="4"/>
<sp:set name="c" expression="${a} + ${b}"/>
<sp:print expression="${a} * ( ${c} + ${b} ) - 23"/> <%-- 5 * ( ( 5 + 4 ) + 4 ) - 23 --%>
Die Ausgabe ist dann:
42
Condition
Condition ist ein logischer Ausdruck, der aus Operanden und vergleichs und/oder logischen Operatoren besteht. Ein Operand ist eine Expression, eine Variablen, ein Attribut oder ein Literal. Im Fall einer Variablen oder eines Attribut wird der Wert der Variablen oder des Attribut ausgelesen und danach der Vergleich durchgeführt.
- Operanten
- Für Conditions sind folgende Literale definiert:
- Boolean
- Die boolesche Werte true und false
- 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)
- Zeichenketten
- Zeichenketten werden in einfache Anführungsstriche gesetzt 'abc'. Um Anführgszeichen 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, das 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)