180 likes | 296 Views
Unified Expression Language. 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 .
E N D
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.
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 <%= customer.getAddress() %>, 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}
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.
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 immediateevaluation. 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 deferredevaluation, 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 managedbeans) skal man bruge #{}. I JSTL vil man typisk bruge ${}-syntaksen, da JSTL-komponenter er taglibs, der kan evalueres når JSP-siden eksekveres.
Eksempler på EL • Vi vælger at vise eksempler på begge syntakser (#{}, ${}) og oftest vil man kunne erstatte den ene syntaks med den anden.
Literaler Eksempel på brug i JSTL: <c:out value="${1}" /><br/> <c:out value="${1+1}" /><br/> <c:out value="${12345 % 2 == 0}" /><br/> <c:out value="${1.2 + 1e2 + 1E2}"/><br/> <c:out value="${user==null}"/><br/> <c:out value="${'Her er et gåseøje:\"'}"/><br/>
Operatorer 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
Sammenligning, logik Parenteser () kan brugs til at ændre præcedens ganske som det kendes fra Java.
Indeces ’[’ og ’]’ kan bruges til at tilgå objekter i Collections eller arrays.
Operatorpræcedens • Highest to lowest, left-to-right. • [ ] . • () • - (unary) not ! empty • * / div % mod • + - (binary) • < > <= >= ltgt le ge • == != eqne • && and • || or
Implicitte variable (1/2) EL definerer en række implicitte variable, dvs. variable, der altid er til rådighed.
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().
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
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 <c:forEach var="row" items="${customers.rows}"> <c:out value="${row.lastName}"/> </c:forEach> row er ikke en scripting variabel – det er et objekt bundet under navnet ”row” i et scope
Yderligere info • Se JSP 2.1 specifikationen (JSR-245) kapitel 2 for en uddybende gennemgang af EL-sproget.