1 / 18

Unified Expression Language

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 .

ronli
Download Presentation

Unified Expression Language

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Unified Expression Language

  2. 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. 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}

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

  6. Eksempler på EL • Vi vælger at vise eksempler på begge syntakser (#{}, ${}) og oftest vil man kunne erstatte den ene syntaks med den anden.

  7. Eksempler på EL

  8. 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/>

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

  10. Sammenligning, logik Parenteser () kan brugs til at ændre præcedens ganske som det kendes fra Java.

  11. Indeces ’[’ og ’]’ kan bruges til at tilgå objekter i Collections eller arrays.

  12. Operatorpræcedens • Highest to lowest, left-to-right. • [ ] . • () • - (unary) not ! empty • * / div % mod • + - (binary) • < > <= >= ltgt le ge • == != eqne • && and • || or

  13. Implicitte variable (1/2) EL definerer en række implicitte variable, dvs. variable, der altid er til rådighed.

  14. Implicitte variable (2/2)

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

  18. Yderligere info • Se JSP 2.1 specifikationen (JSR-245) kapitel 2 for en uddybende gennemgang af EL-sproget.

More Related