Expression Language (SPEL): Unterschied zwischen den Versionen

Aus SiteparkWiki
Zur Navigation springen Zur Suche springen
 
(45 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
==Anchor==
 
==Anchor==
 +
Anchor sind pro Mandant eindeutige Bezeichner von [[Element|Elementen]]. Innerhalb von [[Template|Templates]] kann und soll nie mit den [[ID|IDs]] der [[Element|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 [[Template|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]].
  
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 <code>!{anchorname}</code> und kann je nach Objekt hinter dem Anker mit Attributen erweitert werden:
 
 
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:
 
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 9: Zeile 8:
 
</source>
 
</source>
  
Bei Tag-Attributen, die Text erwarten, muss wie auch bei Variablen der Anchor in ${...} gefasst werden.
+
Bei Tag-Attributen, die [[Text]] erwarten, muss wie auch bei Variablen der Anchor in <code>${...}</code> gefasst werden.
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 16: Zeile 15:
  
 
Anchornamen dürfen nur aus Alphanummerischen Zeichen, Punkten, Unterstrichen und Bindestrichen bestehen.
 
Anchornamen dürfen nur aus Alphanummerischen Zeichen, Punkten, Unterstrichen und Bindestrichen bestehen.
 
  
 
==Variable==
 
==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).
  
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).
+
<div class="note">
 
+
'''Hinweis:''' Variablennamen dürfen '''nicht''' mit einer Zahl beginnen und dürfen nur aus alphanummerischen Zahlen und Unterstrichen bestehen.
Variablennamen dürfen nicht mit eine Zahl beginnen und dürfen nur aus Alphanummerischen Zahlen und Untrestrichen bestehen.
+
</div>
 
 
Zum Beispiel kann sp:set dazu verwendet werden, um eine Variable zu definieren:
 
  
 +
Zum Beispiel kann [[sp:set]] dazu verwendet werden, um eine Variable zu definieren:
 
<source lang="xml">
 
<source lang="xml">
 
<sp:set name="a" value="kleines a"/>
 
<sp:set name="a" value="kleines a"/>
 
</source>
 
</source>
  
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.
+
[[sp:set]] erzeugt in in dem obigen Beispiel ein [[String]]-Objekt mit dem Variablennamen <code>a</code>. Eine Variable repräsentiert immer ein [[Object]]. Im einfachsten Fall sind das [[String]]-, [[Number]]- und [[Date]]-Objekte.
  
 +
==Attribute==
  
==Attribut==
+
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.
 
 
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:
 
Beispiel:
 
 
<source lang="xml">
 
<source lang="xml">
 
<sp:set name="a" value="kleines a"/>
 
<sp:set name="a" value="kleines a"/>
Zeile 44: Zeile 40:
 
</source>
 
</source>
  
Der sp:print-Tag erwartet in name ein Attribut und löst die Variable a auf. Die Ausgabe ist dann:
+
Der [[sp:print]]-Tag erwartet in <code>name</code> ein Attribut und löst die Variable <code>a</code> auf. Die Ausgabe ist dann:
 
 
 
<source lang="text">
 
<source lang="text">
 
kleines a
 
kleines a
 
</source>
 
</source>
  
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.
+
In diesem Fall ist <code>a</code> 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 <code>toUpperCase</code> der <code>a</code>-Variable wie folgt ausgegeben werden.
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 57: Zeile 52:
  
 
Die Ausgabe ist dann:
 
Die Ausgabe ist dann:
 
 
<source lang="text">
 
<source lang="text">
 
KLEINES A
 
KLEINES A
 
</source>
 
</source>
  
toUpperCase ist ebenfalls ein String-Objekt, auf dessen Attribute ebenfalls zugegriffen werden kann.
+
<code>toUpperCase</code> 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.
+
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.
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 71: Zeile 65:
  
 
Ausgegeben wird:
 
Ausgegeben wird:
 
 
<source lang="text">
 
<source lang="text">
 
EINES A
 
EINES A
 
</source>
 
</source>
  
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.
+
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==
  
==Variablen Bereich (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.
  
Mit einem Variablen-Bereich, 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 Variable in einem Bereich gefunden, wird diese verwendet, ohne dass die nachfolgenden Bereiche weiter berücksichtigt werden. In folgender Reihenfolge werden die Bereiche durchsucht:
  
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
1. Page Scope
+
# Request Scope
2. Aktuelles Element
+
# Window Scope
3. Request Scope
+
# Session Scope
4. Window Scope
+
# Application Scope
5. Session Scope
+
# Request-Parameter Scope
6. Application Scope
 
7. Request-Parameter Scope
 
  
 
===Page 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.
+
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===
 
===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.
+
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 [[Element|Elementes]]. Welches Element (welche Instanz) als aktuelles Element verwendet wird, ist in der Variable <code>SYS_current</code> definiert. Diese kann beliebig gesetzt werden und muss entweder ein Element, eine [[ID]] oder ein [[String]] im ID-Format sein. Um die Variable <code>SYS_current</code> zu setzen, kann entweder [[sp:set]] verwendet werden, oder <code>SYS_current</code> wird als Request-Parameter mitgesendet.
  
 
===Request Scope===
 
===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.
+
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.
+
Alle von [[:Kategorie:SP-Tags|sp-]] und [[:Kategorie:SPT-Tags|spt-Tags]] gesetzten Variablen werden in den Request Scope abgelegt, wenn nicht mit dem Tag-Attribut <code>scope</code> ein anderer Bereich angegeben ist.
  
 
===Window Scope===
 
===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.
+
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 <code>SYS_window</code> 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===
 
===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.
+
: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===
 
===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.
+
: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===
 
===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.
+
: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==
 
==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.
+
Ein Text ist eine beliebige Zeichenkette, die Variablen enthalten kann. Variablen beginnen mit <code>${</code> und enden mit <code>}</code>. Die Variablen werden ausgewertet und deren Inhalt an der Stelle der jeweiligen Variable eingefügt.
  
 
Beispiel:
 
Beispiel:
 
 
<source lang="xml">
 
<source lang="xml">
 
<sp:set name="a" value="kleines a"/>
 
<sp:set name="a" value="kleines a"/>
Zeile 128: Zeile 118:
 
</source>
 
</source>
  
Die Variable a wird durch sp:print aufgelöst und an die Stelle der Variable eingefügt. Die Ausgabe ist dann:
+
Die Variable <code>a</code> wird durch <code>sp:print</code> aufgelöst und an die Stelle der Variable eingefügt. Die Ausgabe ist dann:
 
 
 
<source lang="text">
 
<source lang="text">
 
Dies ist ein kleines a.
 
Dies ist ein kleines a.
 
</source>
 
</source>
  
Um doppelte Anführungszeichen auszugeben müssen diese mit einem Backslash (\) escapt werden. Um einen Backslash auszugeben müssen zwei Backslashes angegeben werden.
+
Um doppelte Anführungszeichen auszugeben, müssen diese mit einem Backslash (\) escaped werden. Um einen Backslash auszugeben, müssen zwei Backslashes angegeben werden.
  
 
Beispiel:
 
Beispiel:
 
 
<source lang="xml">
 
<source lang="xml">
 
<sp:set name="a" value="kleines a"/>
 
<sp:set name="a" value="kleines a"/>
Zeile 144: Zeile 132:
  
 
Die Ausgabe ist dann:
 
Die Ausgabe ist dann:
 
 
<source lang="text">
 
<source lang="text">
 
\ Dies ist ein "kleines a".
 
\ Dies ist ein "kleines a".
 
</source>
 
</source>
 
  
 
==Expression==
 
==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.
+
''Expression'' ist ein mathematischer Ausdruck, der aus Operanden und Operatoren besteht.Ein Operand ist eine [[Variable]], ein [[Attribute|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===
 
===Operanten===
 
Für Expressions sind folgende Literale definiert:
 
Für Expressions sind folgende Literale definiert:
  
:;Reelle Zahlen
+
;Reelle Zahlen
::Reelle Zahl in dem Wertebereich 4.94065645841246544E-324 - 1.79769131486231570E+308
+
: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)
+
: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.
 
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:
+
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.
+
* 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.
+
* 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.
 
Bei Objekten, die nicht in eine Zahl umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
Zeile 174: Zeile 160:
 
Für Expressions sind folgende Operatoren definiert:
 
Für Expressions sind folgende Operatoren definiert:
  
:;Klammern ( )
+
;Klammern ( )
::Klammern werden verwendet, um die Reihenfolge der Auswertung des mathematischen Ausdrucks zu ändern.
+
:Klammern werden verwendet, um die Reihenfolge der Auswertung des mathematischen Ausdrucks zu ändern.
  
:;Potenz ^
+
;Potenz ^
::Exponenziert eine Basis mit einem Exponenten Beispiel: 2^8 (28).
+
:Exponenziert eine Basis mit einem Exponenten Beispiel: 2^8 (2<sup>8</sup>).
  
:;Multiplikation * , Division / und Rest % (Modulo)
+
;Multiplikation * , Division / und Rest % (Modulo)
::Rechen-Operationen Multiplikation * , Division / und Rest % (Modulo)
+
:Rechen-Operationen Multiplikation * , Division / und Rest % (Modulo)
  
:;Addition + und Subtraktion -
+
;Addition + und Subtraktion -
::Rechen-Operationen Addition + und Subtraktion -
+
:Rechen-Operationen Addition + und Subtraktion -
  
 
Beispiel
 
Beispiel
 +
<source lang="xml">
 +
<sp:set name="variable_a" value="5"/>
 +
<sp:set name="variable_b" value="4"/>
 +
<sp:set name="variable_c" expression="${variable_a} + ${variable_b}"/>
  
<source lang="xml">
+
<sp:print expression="${variable_a} * ( ${variable_c} + ${variable_b} ) - 23"/>  <%-- 5 * ( ( 5 + 4 ) + 4 ) - 23 --%>
<sp:set name="a" value="5"/>
 
<sp:set name="b" value="4"/>
 
<sp:set name="c" expression="${a} + ${b}"/>
 
 
</source>
 
</source>
 
<sp:print expression="${a} * ( ${c} + ${b} ) - 23"/>  <%-- 5 * ( ( 5 + 4 ) + 4 ) - 23 --%>
 
  
 
Die Ausgabe ist dann:
 
Die Ausgabe ist dann:
 
 
<source lang="text">
 
<source lang="text">
 
42
 
42
 
</source>
 
</source>
  
 +
===?: (Elvis-Operator)===
 +
''Ab Version 2.52''
 +
 +
Der Elvis-Operator (Siehe [https://en.wikipedia.org/wiki/Elvis_operator Wikipedia:Elvis operator]) erlaubt Bedingungen innerhalb von Expressions.
 +
 +
Condition ? ExpressionA : ExpressionB
 +
 +
Ist Condition true, wird ExpressionA verwendet, sonst Expression B
 +
 +
Beispiel
 +
<source lang="xml">
 +
<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 --%>
 +
</source>
  
 
==Condition==
 
==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.
+
''Condition'' ist ein logischer Ausdruck, der aus Operanden und vergleichenden und/oder logischen Operatoren besteht. Ein Operand ist eine [[Expression]], eine [[Variable]], ein [[Attribute|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===
 
===Operanten===
 
Für Conditions sind folgende Literale definiert:
 
Für Conditions sind folgende Literale definiert:
  
:;Boolean
+
;Boolean
::Die boolesche Werte true und false
+
:Die booleschen Werte <code>true</code> und <code>false</code>
  
:;Reelle Zahlen
+
;Reelle Zahlen
::Reelle Zahl in dem Wertebereich 4.94065645841246544E-324 - 1.79769131486231570E+308
+
: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)
+
:Reelle Zahlen können in einfacher Schreibweise wie 100 oder 100.1 oder in Exponenzial-Schreibweise wie 1.001E2 (1.001 x 10<sup>2</sup>) vorkommen.
  
:;Zeichenketten
+
===Zeichenketten===
::Zeichenketten werden in einfache Anführungsstriche gesetzt 'abc'. Um Anführgszeichen zu escapen müssen doppelte Backslashes verwendet werden (\\').
+
Zeichenketten werden in einfache Anführungsstriche gesetzt '<code>abc</code>'. Um Anführungszeichen zu escapen müssen '''doppelte''' Backslashes verwendet werden (\\').
  
:;null
+
;null
::null ist das Literal für ein nicht vorhandenes Objekt.
+
:<code>null</code> 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.
+
Operanden können auch Variablen und Attribute sein. Diese werden in <code>${ }</code> gefasst. Beispiel: <code>${a}</code> für eine Variable <code>a</code>.
  
 
Ein Operand kann auch eine Expression sein.
 
Ein Operand kann auch eine Expression sein.
  
 
===Vergleichs Operatoren===
 
===Vergleichs Operatoren===
Vergleichs Operatoren vergleichen Ausdrücke miteinander und geben einen Wahrheitswert (Boolean) zurück. Die zur Verfügung gestellten Operatoren sind:
+
Vergleichs-Operatoren vergleichen Ausdrücke miteinander und geben einen Wahrheitswert ([[Boolean]]) zurück. Die zur Verfügung gestellten Operatoren sind:
  
 
* Größer (>)
 
* Größer (>)
Zeile 238: Zeile 240:
 
* Kleiner-gleich (<=)
 
* Kleiner-gleich (<=)
  
Operanden können auch Variablen und Attribute sein. Diese werden in ${ } gefasst. Beispiel: ${a} für eine Variable a.
+
Operanden können auch [[Variable|Variablen]] und [[Attribute|Attribute]] sein. Diese werden in <code>${ }</code> gefasst. Beispiel: <code>${a}</code> für eine Variable <code>a</code>.
  
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:
+
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.
 
* 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.
+
* Existiert die Variable oder das Attribute nicht (<code>null</code>), so wird die Variable durch 0 ersetzt.
  
 
Bei Objekten, die nicht in eine Zahl umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
 
Bei Objekten, die nicht in eine Zahl umgewandelt werden können, wird eine Fehlermeldung ausgegeben.
  
 
Beispiel für eine Condition mit Vergleichs-Operator
 
Beispiel für eine Condition mit Vergleichs-Operator
 
 
<source lang="text">
 
<source lang="text">
 
${a} > 10
 
${a} > 10
Zeile 254: Zeile 255:
  
 
===Logische Operatoren===
 
===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:
+
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 (!)
 
* Nicht (!)
Zeile 260: Zeile 261:
 
* Oder (||)
 
* 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.
+
Bei der Angabe von [[Variable|Variablen]] und/oder [[Attribute|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
 
Beispiel für einen logischen Vergleich
 
 
<source lang="text">
 
<source lang="text">
 
${a} || ${b}
 
${a} || ${b}
Zeile 271: Zeile 273:
  
 
Beispiel:
 
Beispiel:
 
 
<source lang="text">
 
<source lang="text">
 
(${a} > 10) && (${b} <= 5)
 
(${a} > 10) && (${b} <= 5)
 
</source>
 
</source>
  
Nicht nur Variablen und Attribute können als Operanden verwendet werden, sondern auch Expressions.
+
Nicht nur Variablen und Attribute können als Operanden verwendet werden, sondern auch [[Expression|Expressions]].
  
 
Beispiel:
 
Beispiel:
 
 
<source lang="text">
 
<source lang="text">
 
( (${a} + 10) > 20) && ( (4 / ${b}) <= 2)
 
( (${a} + 10) > 20) && ( (4 / ${b}) <= 2)
 
</source>
 
</source>
 +
 +
===Logische Vergleiche im IES===
 +
 +
{| class="prettytable"
 +
|- class="hintergrundfarbe1"
 +
! Wert || isNull(Wert) || Wert == null || Wert == 0 || Wert != 0
 +
|-
 +
| <code>""</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>false</code>
 +
|-
 +
| <code>"0"</code>
 +
| <code>false</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>false</code>
 +
|-
 +
| <code>0</code>
 +
| <code>false</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>false</code>
 +
|-
 +
| <code>"null"</code>
 +
| <code>false</code>
 +
| <code>false</code>
 +
| <code>false</code>
 +
| <code>true</code>
 +
|-
 +
| <code>null</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>true</code>
 +
| <code>false</code>
 +
|}
 +
 +
<noinclude>
 +
[[Category:SPML]]
 +
[[Category:Qualität_des_Codes_prüfen]]
 +
</noinclude>

Aktuelle Version vom 12. Dezember 2019, 09:47 Uhr

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:

  1. Page Scope
  2. Aktuelles Element
  3. Request Scope
  4. Window Scope
  5. Session Scope
  6. Application Scope
  7. 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 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) 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