Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

1 Unified Expression Language Copyright © Lund & Bendsen A/S Unified Expression Language.

Lignende præsentationer


Præsentationer af emnet: "1 Unified Expression Language Copyright © Lund & Bendsen A/S Unified Expression Language."— Præsentationens transcript:

1 1 Unified Expression Language Copyright © Lund & Bendsen A/S Unified Expression Language

2 2 Copyright © Lund & Bendsen A/S Historien bag Unified Expression Language JSF 1.0 og 1.1 havde deres eget Expression Language, kaldet JSF-EL JSTL 1.0 havde sit eget Expression Language, kaldet JSTL-EL. I JSP 2.1 (JSR-245) blev der introduceret et Unified Expression Language, som siden har erstattet både JSF-EL og JSTL-EL. I de senere versioner af både JSF og JSTL er det Unified Expresion Language, der benyttes. I det følgende gennemgår vi Unified Expression Language, som vi fremover blot betegner EL.

3 3 Unified Expression Language Copyright © Lund & Bendsen A/S Formålet med EL EL er et selvstændigt scripting sprog, dvs. det er ikke Java-baseret EL giver mulighed for at udtrykke dynamiske attribut-værdier og overflødiggør dermed Request Time Expressions, som det kendes fra JSP, fx, som med EL kan udtrykkes: ${customer.address} EL kan tilgå JavaBeans, Collections og Maps og en række implicitte objekter i en web-applikation, fx request og session. EL har alle de kendte aritmetiske operatorer (+, -, *...), logiske operatorer (and, or, not) og sammenligningsoperatorer (==,...) EL giver mulighed for at angive metodekald, fx #{customerBean.delete}

4 4 Unified Expression Language Copyright © Lund & Bendsen A/S EL-terminologi Et EL-udtryk kan angives på 2 måder: –som et eval expression, dvs. et udtryk, der skal parses og evaluerer til en eller anden værdi – fx #{user.name}, som måske evaluerer til ”Peter Larsen”. –som et literal expression, dvs. et udtryk, der ikke skal parses og evaluerer til sin literale værdi – fx Hej, der evaluerer til ”Hej” Et composite expression er et udtryk der består af 2 eller flere eval expression og literal expressions, fx: Velkommen #{user.name}! Det er dit besøg nr #{user.requests}. Et value expression er et udtryk der ultimativt evaluerer til en String eller en objektreference. Et method expression er et udtryk, der udpeger en metode. Metodens præcise signatur afhænger af sammenhængen. Et eksempel: #{user.validate}, som udpeger en metode i den managed bean, der er bundet under navnet user. Et lvalue-udtryk, er et udtryk, der både kan læses og opdateres (og derfor kunne stå på venstresiden af et værditildelingsudtryk (a=b)), fx #{user.name} Et rvalue-udtryk er et udtryk der kun kan læses og derved kun kan stå på højresiden af en værditildeling, fx udtrykket Hej #{user.name}, som det ikke giver mening at tildele en værdi.

5 5 Unified Expression Language Copyright © Lund & Bendsen A/S Evalueringstidspunkt EL har 2 forskellige syntakser for udtryk: –#{...} –${...} De to syntakser evalueres på præcis samme måde (dvs. at deres værdi er den samme), men det kan ske på forskellige tidspunkter – alt afhængigt af det framework, der fortolker EL-udtrykkene. I Web-applikationer betyder ${...}, at udtrykket skal fortolkes når JSP-siden eksekveres – kaldet immediate evaluation. Det er fint til udtryk, som det giver mening at evaluere på dette tidspunkt, men til mange konstruktioner i JSF duer det ikke. #{...} fortolkes af web applikationer med såkaldt deferred evaluation, dvs. at udtrykket først fortolkes, når der rent faktisk er brug for værdien, fx når en JSF-knap skal kalde sin actionlistener eller når et input-felt skal rendere sin værdi, som er bundet til udtrykket #{user.name}. Generelt til udtryk, der har med JSF-komponenter at gøre (specielt managed beans) skal man bruge #{}. I JSTL vil man typisk bruge ${}-syntaksen, da JSTL-komponenter er taglibs, der kan evalueres når JSP-siden eksekveres.

6 6 Unified Expression Language Copyright © Lund & Bendsen A/S Eksempler på EL Vi vælger at vise eksempler på begge syntakser (#{}, ${}) og oftest vil man kunne erstatte den ene syntaks med den anden. #{12}Returnerer værdien 12, deferred evaluation ${12}Returnerer værdien 12, immediate evaluation #{LoginBean.username}binder til username-egenskaben i den Bean, der er erklæret med navnet ’LoginBean’. Alternativt kan LoginBean være et Map og værdien gemt under nøglen username læses/opdateres da. #{LoginBean[’username’]}Samme som ovenstående #{aList[0]}Returnerer objektet på 1. plads i en liste #{aList[0].person.name}Svarer til: aList.get(0).getPerson().getName() #{LoginBean.username==’x’}Returnerer true, hvis username er ”x”

7 7 Unified Expression Language Copyright © Lund & Bendsen A/S Eksempler på EL #{LoginBean.loginAttempts==4}Returnerer true, hvis loginAttempts er 4 #{(5+5) > (20/2)}Returnerer false Hej #{LoginBean.username}Returnerer ”Hej ” + username #{ (1==1) ? ’sand’ : ’falsk’ }Svarer til Javas ’ternary if’. Returnerer altid ’sand’. #{LoginBean.login}Returnerer værdien af login()-metodekaldet #{empty(colors)} Returnerer true, hvis samlingen (fx en liste) colors er tom #{((empty(colors) && profile.color>0) ? ’fejl’ : profile.color)} returnerer ’fejl’, hvis samlingen colors er tom OG profile.color er større end 0 og ellers returneres profile.color

8 8 Unified Expression Language Copyright © Lund & Bendsen A/S Literaler LiteraltypeEksempel på literalEksempel på EL booleanstrue, false${msg.error==false} heltal-1,1,2,3${1} floating point1, 3.14, 1.2e4, 1.2E4${1.2 + 1e2 + 1E2} null-literalennull${user==null} strenge’hej’, ”hej”, ’\”’\ er escape-karakter: \’, \”, fx ${'Her er et gåseøje: \"'} Eksempel på brug i JSTL:

9 9 Unified Expression Language Copyright © Lund & Bendsen A/S Operatorer OperatorEksempelEksempel med EL unary minus-${-1} addition+${1.2 + 1e2 + 1E2}, returnerer 0 hvis A eller B er null subtraktion-${1.2 - 1e2 - 1E2}, returnerer 0 hvis A eller B er null multiplikation*${2*2}, returnerer 0 hvis A eller B er null division/ eller div ${2/2}, ${2 div 2}, returnerer 0 hvis A eller B er null modulo% eller mod ${100 % 30}, ${100 mod 30},, returnerer 0 hvis A eller B er null empty ${empty(customer.orders)} – tester om en samling er tom. Operatorerne klarer selv konvertering. For de dyadiske operatorer (dem med 2 operander) gælder, at såfremt begge operander er heltal er resultatet en long. Ellers er det en double.. div og mod er indført for at forhindre at JSP-sider udtrykt i XML-syntaks fører til mal-formede XML-dokumenter

10 10 Unified Expression Language Copyright © Lund & Bendsen A/S Sammenligning, logik TypeEksempelEksempel i EL lighed==, eq ${1+1 == 2}, ${1+1 eq 2} ulighed!=, ne ${1-1 != 1}, ${1-1 ne 2} mindre end<, lt ${1 < 2}, ${1 lt 2} større end>, gt ${1 > 2}, ${1 gt 2} mindre end, lig <=, le ${1 <= 2}, ${1 le 2} større end, lig >=, ge ${1 >= 2}, ${1 ge 2} og&&, and${1+1 == 2 && 2<3}, ${1+1 == 2 and 2<3} eller||, or${1+1 == 2 || 2>3}, ${1+1 == 2 || 2>3} negering!, not${!(1+1 == 2 && 2<3), ${not(1+1 == 2 and 2<3)} Parenteser () kan brugs til at ændre præcedens ganske som det kendes fra Java.

11 11 Unified Expression Language Copyright © Lund & Bendsen A/S Indeces ’[’ og ’]’ kan bruges til at tilgå objekter i Collections eller arrays. Eksempel på ELTilsvarende Java-kode ${customer.orders[0].text}customer.getOrders().get(0).getText() ${customerlist[1].orders[2].text}customerlist.get(1).getOrders().get(2).getText()

12 12 Unified Expression Language Copyright © Lund & Bendsen A/S Operatorpræcedens Highest to lowest, left-to-right. 1. [ ]. 2. () 3. - (unary) not ! empty 4. * / div % mod 5. + - (binary) 6. = lt gt le ge 7. == != eq ne 8. && and 9. || or

13 13 Unified Expression Language Copyright © Lund & Bendsen A/S Implicit variabelEksempelTilsvarende Java-kode applicationScope#{applicationScope.LoginBean.login- Attempts} getServletContext().getAttribute(”LoginBean” ).getLoginAttempts() cookie#{cookie.sessionID} request.getCookies() //Cookie[] – find cookie //med navn sessionID facesContext#{facesContext} FacesContext.getCurrentInstance() header#{header[’referer’]} request.getHeaders(”referer”) headerValues#{headerValues[’Accept-encoding’][0]} request.getHeaderValues(...)[0] initParam#{initParam.webmaster} getServletContext().getInitParameter(”webm aster”) param#{param.jsessionid]} request.getParameter(”jsessionid”) EL definerer en række implicitte variable, dvs. variable, der altid er til rådighed. Implicitte variable (1/2)

14 14 Unified Expression Language Copyright © Lund & Bendsen A/S Implicit variabelEksempelTilsvarende kode i servlet-API’et paramValues#{paramValues.phone[0]} request.getParameterValues()[0] requestScope#{requestScope.LoginBean.loginAtte mpts} request.getAttribute(”LoginBean”).getLoginAt tempts() sessionScope#{sessionScope.LoginBean.loginAtte mpts} request.getSession(). getAttribute(”LoginBean”).getLoginAttempts() view#{view.locale} FacesContext.getCurrentInstance().getView Root().getLocale() Implicitte variable (2/2)

15 15 Unified Expression Language Copyright © Lund & Bendsen A/S Variabelnavne og scopes Når udtrykket ${customer.name} evalueres, søges de 4 scopes igennem efter attributten med navnet ’customer’. Søgerækkefølgen er: page, request, session, application, så det er muligt at ’overskygge’ variable. Såfremt variablen ikke findes i noget scope returneres null. dot-notationen bruges på samme måde som i Java, dvs. at ${person.parent.parent.name} svarer til person.getParent().getParent().getName().

16 16 Unified Expression Language Copyright © Lund & Bendsen A/S Scoped Variable vs. Scripting Variable EL kan kun arbejde på Scoped Variable – ikke Scripting Variable Scoped Variable er Objekter, der er bundet i page, request, session eller application-scope, fx med request.setAttribute(”customer”, new Customer(...)); Scripting Variable er variable oprettet af Tags og de implicitte objekter i JSP (request, response, session, exception, page, application etc.) EL har dog egne implicitte objekter, fx requestScope og sessionScope

17 17 Unified Expression Language Copyright © Lund & Bendsen A/S Scoped Variable vs. Scripting Variable Umiddelbart virker det som om fx JSTL-tags opretter Scripting Variable Imidlertid bliver alle variable oprettet som Scoped Variable, dvs de bliver tilføjet til et af de 4 scopes (page, request, session, application) under et navn og det er dette navn, man reelt refererer til row er ikke en scripting variabel – det er et objekt bundet under navnet ”row” i et scope

18 18 Unified Expression Language Copyright © Lund & Bendsen A/S Yderligere info Se JSP 2.1 specifikationen (JSR-245) kapitel 2 for en uddybende gennemgang af EL-sproget.


Download ppt "1 Unified Expression Language Copyright © Lund & Bendsen A/S Unified Expression Language."

Lignende præsentationer


Annoncer fra Google