$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.