Introduksjon til JSF EL 2

1. Introduksjon

Expression Language (EL), er et skriptspråk som er tatt i bruk i mange Java-rammer, for eksempel Spring med SpEL og JBoss med JBoss EL.

I denne artikkelen vil vi fokusere på JSFs implementering av dette skriptspråket - Unified EL.

EL er for tiden i versjon 3.0, en større oppgradering som gjør at prosesseringsmotoren kan brukes i frittstående modus - for eksempel på Java SE-plattformen. Tidligere versjoner var avhengig av en Jakarta EE-kompatibel applikasjonsserver eller webcontainer. Denne artikkelen diskuterer EL versjon 2.2.

2. Umiddelbar og utsatt evaluering

Den primære funksjonen til EL i JSF er å koble JSF-visningen (vanligvis XHTML-markering) og den java-baserte back-enden. Back-end kan være brukeropprettede administrerte bønner, eller container-administrerte objekter som HTTP-økten.

Vi skal se på EL 2.2. EL i JSF kommer i to generelle former, umiddelbar syntaks EL og utsatt syntaks EL.

2.1. Umiddelbar syntaks EL

Ellers kjent som JSP EL, er dette et skriptformat som er en holdover fra JSP-dagene med java-webapplikasjonsutvikling.

JSP EL-uttrykkene starter med dollartegnet ($), etterfulgt av venstre krøllbrakett ({), deretter fulgt av selve uttrykket, og til slutt lukket med høyre krøllete brakett (}):

$ {ELBean.value> 0}

Denne syntaksen:

  1. Evalueres bare en gang (i begynnelsen) i livssyklusen til en side. Hva dette betyr er at verdien som er. Å bli lest av uttrykket i eksemplet ovenfor må settes før siden lastes inn.
  2. Gir lesetilgang til bønneverdier.
  3. Og som et resultat krever overholdelse av JavaBean navngivningskonvensjonen.

For de fleste bruksområder er denne formen for EL ikke veldig allsidig.

2.2. Utsatt utførelse EL

Utsatt utførelse EL er EL designet for riktig JSF. Den viktigste syntaktiske forskjellen med JSP EL er at den er merket med en#” i stedet for en “$“.

# {ELBean.value> 0}

Utsatt EL:

  1. Er synkronisert med JSF-livssyklusen. Dette betyr at et EL-uttrykk i utsatt EL blir evaluert på forskjellige punkter i gjengivelsen av en JSF-side (i begynnelsen og slutten).
  2. Gir lese- og skrivetilgang til bønneverdier. Dette gjør at man kan angi en verdi i en JSF-bakbønne (eller hvor som helst annet) ved hjelp av EL.
  3. Tillater en programmerer å påberope vilkårlige metoder på et objekt, og avhengig av versjonen av EL, sende argumenter til slike metoder.

Unified EL er spesifikasjonen som forener både utsatt EL og JSP EL, slik at begge syntaksene på samme side.

3. Enhetlig EL

Unified EL tillater to generelle smaker av uttrykk, verdiuttrykk og metodeuttrykk.

Og en rask merknad - de følgende avsnittene viser noen eksempler, som alle er tilgjengelige i appen (se Github-lenken på slutten) ved å navigere til:

//localhost:8080/jsf/el_intro.jsf

3.1. Verdiuttrykk

Et verdiuttrykk lar oss enten lese eller angi en administrert bønneegenskap, avhengig av hvor den er plassert.

Følgende uttrykk leser en administrert bønneegenskap på siden:

Hei, # {ELBean.firstName}

Følgende uttrykk lar oss imidlertid sette en verdi på brukerobjektet:

Variabelen må følge JavaBean navngivningskonvensjon for å være kvalifisert for denne typen behandling. For at verdien av bønnen skal bli forpliktet, må det vedlagte skjemaet bare lagres.

3.2. Metodeuttrykk

Unified EL gir metodeuttrykk for å utføre offentlige, ikke-statiske metoder fra en JSF-side. Metodene kan eller ikke ha returverdier.

Her er et raskt eksempel:

De lagre() metoden det refereres til, er definert på en ryggbønne som heter ELBean.

Fra EL 2.2 kan du også sende argumenter til metoden du bruker EL. Dette kan tillate oss å skrive eksemplet vårt slik:

Det vi har gjort her, er å lage et sidebindende bindende uttrykk for inputText komponent og passere direkte verdi attributt til metodeuttrykket.

Merk at variabelen sendes til metoden uten noen spesiell notasjon, krøllete bukseseler eller unnslippe tegn.

3.3. Implisitte EL-objekter

JSF EL-motoren gir tilgang til flere containerstyrte objekter. Noen av dem er:

  • #{Applikasjon}: Også tilgjengelig som # {servletContext}, dette er objektet som representerer forekomsten av webapplikasjonen
  • # {applicationScope}: et kart over variabler som er tilgjengelige på nettet
  • #{Kjeks}: et kart over HTTP Cookie-variablene
  • # {ansikterContext}: den nåværende forekomsten av AnsikterKontekst
  • #{blits}: JSF Flash-scoped-objektet
  • #{Overskrift}: et kart over HTTP-overskriftene i den gjeldende forespørselen
  • # {initParam}: et kart over kontekstinitialiseringsvariablene til webapplikasjonen
  • # {param}: et kart over parametrene for HTTP-forespørsel
  • #{be om}: den HTTPServletRequest gjenstand
  • # {requestScope}: et forespørsel-kart over variabler
  • # {sessionScope}: et sesjonskart over variabler
  • #{økt}: den HTTPSesjon gjenstand
  • # {viewScope}: et oversikt (side-) omfang av kart over variabler

Følgende enkle eksempel viser alle forespørselsoverskrifter og verdier ved å gå til topptekster implisitt objekt:

# {header.key}# {header.value}

4. Hva du kan gjøre i EL

I sin allsidighet kan EL vises i Java-kode, XHTML-markering, Javascript og til og med i JSF-konfigurasjonsfiler som ansikter-config.xml fil. La oss undersøke noen konkrete brukssaker.

4.1. Bruk EL i sidemarkering

EL kan vises i standard HTML-koder:

4.2. Bruk EL i JavaScript

EL vil bli tolket når det oppstår i Javascript eller tagger:

 var theVar = # {ELBean.firstName};

En bønnervariabel vil bli angitt som en javascript-variabel her.

4.3. Evaluer boolsk logikk i EL ved hjelp av operatører

EL støtter ganske avanserte sammenligningsoperatører:

  • ekv likhetsoperatør, tilsvarer “==.”
  • lt mindre enn operatør, tilsvarer “<.”
  • le mindre enn eller lik operatør, tilsvarer “<=.”
  • gt større enn operatøren, tilsvarer “>.”
  • ge større enn eller lik, tilsvarer “>=.

4.4. Evaluer EL i en bakbønne

Fra baksidebønnekoden kan man evaluere et EL-uttrykk ved hjelp av JSF-applikasjonen. Dette åpner en verden av muligheter ved å koble JSF-siden med bakebønnen. Du kan hente implisitte EL-objekter, eller hente faktiske HTML-sidekomponenter eller verdien deres lett fra bakebønnen:

FacesContext ctx = FacesContext.getCurrentInstance (); Søknad app = ctx.getApplication (); String firstName = app.evaluateExpressionGet (ctx, "# {firstName.value}", String.class); HtmlInputText firstNameTextBox = app.evaluateExpressionGet (ctx, "# {firstName}", HtmlInputText.class);

Dette gir utvikleren stor fleksibilitet i å samhandle med en JSF-side.

5. Hva du ikke kan gjøre i EL

EL <3.0 har noen begrensninger. De følgende avsnittene diskuterer noen av dem.

5.1. Ingen overbelastning

EL støtter ikke bruk av overbelastning. Så i en bakebønne med følgende metoder:

offentlig ugyldig lagring (bruker brukeren); offentlig ugyldig lagring (streng brukernavn); offentlig ugyldig lagring (heltal uid);

JSF EL vil ikke kunne evaluere følgende uttrykk riktig

JSF ELResolver vil introspektere klassedefinisjonen av bønne, og velg den første metoden som returneres av java.lang.Class # getMethods (en metode som returnerer metodene som er tilgjengelige i en klasse). Rekkefølgen av metodene som returneres er ikke garantert, og dette vil uunngåelig resultere i udefinert oppførsel.

5.2. Ingen Enums eller konstante verdier

JSF EL <3.0, støtter ikke bruk av konstante verdier eller Enums i skriptet. Så, har noe av det følgende

public static final String USER_ERROR_MESS = "Nei, du kan ikke gjøre det"; enum Days {Sat, Sun, Man, Tir, Wed, Thu, Fri};

betyr at du ikke kan gjøre følgende

5.3. Ingen innebygd null sikkerhet

JSF EL <v3.0 gir ikke implisitt null sikker tilgang, noe noen kan synes rart med en moderne skriptmotor.

Så hvis person i uttrykket nedenfor er null, mislykkes hele uttrykket med en skjemmende NPE

Hei herr, # {ELBean.person.sname} "

6. Konklusjon

Vi har undersøkt noen av de grunnleggende faktorene i JSF EL, styrker og begrensninger.

Dette er stort sett et allsidig skriptspråk med noe rom for forbedring; det er også limet som binder JSF-visningen til JSF-modellen og kontrolleren.

Kildekoden som følger med denne artikkelen, er tilgjengelig på GitHub.