$K(Die Expression Language)
$KK(Zugriff auf implizite Variablen)
$R(Objective)
Given a scenario, write EL code that accesses the following implicit variables including:
pageScope, requestScope, sessionScope, and applicationScope, param and paramValues, header and
headerValues, cookie, initParam and pageContext.
$R\
Mit der Expression Language hat man Zugriff auf eine Reihe von implizierten Objekten, die in
der folgenden Tabelle zusammengefasst sind.
$T(caption,ll,25.75)
Name | Bedeutung ||
pageContext | Die Instanz der PageContext Klasse ,für die aktuelle Seite ||
pageScope | Eine Collection (java.util.Map) aller page scope Variablen ||
requestScope | Eine Collection (java.util.Map) aller request scope Variablen ||
sessionScope | Eine Collection (java.util.Map) aller session scope Variablen ||
applicationScope | Eine Collection (java.util.Map) aller application scope Variablen ||
param | Eine Collection (java.util.Map) aller Parameterwerte einer Anfrage.${param.name}
entspricht aServletRequest.getParameter(name) ||
paramValues | Eine Collection (java.util.Map) aller Parameterwerte einer Anfrage
als String Array. ${paramValue.name}
entspricht aServletRequest.getParameterValues(name) ||
header | Eine Collection (java.utilMap) aller Header Werte einer Anfrage. ||
headerValues | Eine Collection (java.utilMap) aller Header Werte einer Anfrage als String Array ||
cookie | Eine Collection (java.utilMap) von Cookie-Namen zu einzelnen Cookie Werten ||
initParam | Eine Collection (java.utilMap) aller Initialisierungsparameter ||
$T\
Beispiele:
* ${param["userName"]} Dies gibt der Parameterwert von userName einer Anfrage zurück.
Die Anfrage ist identisch mit ${param.userName}.
* ${pageContext.request.requestURI} Die URI der Anfrage
* ${sessionScope.cart.numberOfItems} Das Propertie numberOfItems aus dem Attribut das
unter dem Namen cart in der sessionScope abgespeichert ist.
* ${header["host"]} Wert des Paramters Host vom Header. Dies ist identisch mit
${header.host}
Bei einem Ausdruck ${einString} wird erstmal geschaut ob einString ein implizites Objekt ist.
In diesem Falle wird dieses zurückgegeben. Ansonsten wird mit der Funktion
PageContext.findAttribute(einString) der Paramter einString in den Scopes gesucht. Es
werden nacheinander die Scopes page,request,session und application
durchsucht bis das Attribut einString gefunden wird. Es wird der Wert des Attributs
einString zurückgegeben, oder falls es diesen nicht gibt, wird der Wert null zurückgegeben.
Sollte es ein Attribut innerhalb eines Scopes wie ein implizites Objekt heissen, so wird das implizite
Objekt zurückgegeben.
$KK(Zugriff auf Bean Properties und Collection Elemente)
$R(Objective)
Given a scenario, write EL code that uses the following operators: property access
(the '.' operator), collection access (the '[]' operator).
$R\
Mit dem Punkt Operator '.' wird auf die Properties eines Beans zugreifen.
$S()
${aBean.aProperty.aPropertyOfTheProperty.andSoOn}
$S\
Auch ist es sehr einfach, auf eine Map zuzugreifen:
$S()
${aMap.aKey}
$S\
Ausdrücke mit der Syntax '${identifier[subexpression]}' werden folgendermassen ausgewertet:
* Werte den identifier und den subexpression aus; wenn einer von beiden null ergibt
ist der Gesamtausdruck null
* Falls es sich beim identifier um eine BEAN handelt:
Die subexpression wird als String umgewandelt. Dieser String wird als eine Bean Property
Eigenschaft angesehen. Als Ergebnis wird der Wert der Propertie ausgegeben.
So wird für ${name.["lastName"]} der Wert der Methode name.getLastName() ausgewertet.
* Falls es sich beim Identifier um ein ARRAY handelt:
Die subexpression wird zu einem int Wert umgewandelt. Das Ergebnis des Gesamtausdrucks
ist dann der Wert des entsprechenden Elements des Arrays.
z.B: colors["3"] ist identisch mit colors[3].
* Falls es sich beim Identifier um eine Liste handelt:
Dies ist identisch mit dem Umgang zu einem Array. Die subexpression wird als Integer umgewandelt,
und der Gesamtausdruck enthält das entsprechende Element der Liste.
* Falls es sich beim identifier eine MAP handelt.
Die subexpression wird als key einer Map angesehen. Sie wird nicht umgewandelt, da als key
jedes Objekt sein kann. Ist subexpression kein String, wird versucht den key in der
in einer der Scopes der JSP zu finden.
$T(caption,lll,20.25.55)
Identifier type | Example use | Method invoked ||
JavaBean | ${colorBean.red}
${colorBean["red"]}
${colorBean['red']} | colorBean.getRed() ||
Array | ${colorArray[2]}
${colorArray["2"]} | Array.get(colorArray, 2) ||
List | ${colorList[2]}
${colorList["2"]} | colorList.get(2) ||
Map | ${colorMap[red]} | colorMap.get(pageContext.findAttribute("red")) ||
| ${colorMap["red"]}
${colorMap.red} | colorMap.get("red") ||
$T\
$KK(Operatoren)
$R(Objective)
Given a scenario, write EL code that uses the following operators: aritmetic operators,
relational operators, and logical operators.
$R\
$KKK(Arithmetische Operatoren)
Es existieren die gewohnten arithmetischen Operatoren: '+', '-', '*', '/', '%'.
Für die Division kann man ausser '/' auch div benutzen.
Für Modulo kann man ausser '%' auch mod benutzen.
$R(Source)
6 + 7 = ${6+7}
8 x 9 = ${8*9}
$R\
Bei einer Division durch 0, wird keine Exception geworfen sondern der String 'Infinity' zurückgegeben.
$KKK(Relationale Operatoren)
Die relationalen Operatoren sind in folgender Tabelle zusammengefasst:
$T(caption,cc)
Symbol version | Text Version ||
== | eq ||
!= | ne ||
< | lt ||
> | gt||
>= | ge ||
<= |le ||
$T\
Hier sind einige Beispiele:
$S()
Is 1 less than 2? ${1<2}
Does 5 equal 5? ${5==5}
Is 6 greater than 7? ${6 gt 7}
$S\
$KKKK(Logische Operatoren)
Die logischen Operatoren entsprechen denen von Java. Für jeden operator gibt es auch eine
textuelle Variante:
$T(caption,cc)
Symbol | version Text Version ||
&& | and ||
II | or ||
! | not ||
$T\
Da es in EL kein null Wert gibt, wurde der empty Operator eingefügt.
Beispiel
Dieser Operator wird true fall:
* Eine Objketreferenzen nicht existiert, d.h. null ist
* Ein String nicht existiert oder von der Länge 0 ist
* Ein Array nicht existiert oder von der Länge 0 ist
* Eine Liste nicht existiert oder von der Länge 0 ist
* Eine Map nicht existiert bzw. keine Einträge hat.
Der Operator wird folgendermassen aufgerufen:
$R(Source)
empty variableName
$R\
$KK(Funktionen nutzen und definieren)
$R(Objective)
Given a scenario, write EL code that uses a function; write code for an EL function; and
configure the EL function in a tag library descriptor.
$R\
Die Expression Language lässt sich um eigene Funktionen erweitern. Eine Funktion besteht aus
einem Präfix, dem Funktionsnamen und ggf. einigen Parametern.
$S()
ns:func(a1, a2, ..., an)
$S\
Es muss eine taglib Direktive existieren, die dem Prefix (ns) eine TagLibDescripiton
Datei zuordnet.
z.B:
$S()
<%@ taglib prefix="ns" uri="http://myUrl.com/some-taglib" %>
$S\
In dieser TLD Datei wird die Schnittstelle der Funktionen definiert.
$B(Bilder,tagFunction.gif,Definieren einer eigenen EL Funktion)
Die Java Klasse muss in der tld-Datei voll qualifiziert angegeben werden.
Die eigentliche Funktion ist eine statische Funktion der angegebenen Java Klasse.
Die Bedeutung von function-extension und extension-element ist mir selbst
noch unklar, wird aber wahrscheinlich für die Zertifizierung nicht benötigt.
Hier ein Beispiel einer selbstgeschriebenen concat-Funktion
$S()
1.0
Concatenates two strings
concat
com.example.MyELFunctions
java.lang.String concat(java.lang.String, java.lang.String)
$S\
$S()
package com.example;
public class MyELFunctions {
public static String concat(String str1, String str2) {
return str1 + str2;
}
}
$S\
Tritt beim Ausführen der Funktion eine Exception auf, so wird diese Exception in eine ELException gewrapped,
und diese ELException wird geworfen.