Introduktion til JSF EL 2
1. Introduktion
Expression Language (EL) er et script-sprog, der ses vedtagelse inden for mange Java-rammer, såsom Spring med SpEL og JBoss med JBoss EL.
I denne artikel vil vi fokusere på JSF's implementering af dette scriptingsprog - Unified EL.
EL er i øjeblikket i version 3.0, en større opgradering, der gør det muligt at bruge processormotoren i standalone-tilstand - for eksempel på Java SE-platformen. Tidligere versioner var afhængige af en Jakarta EE-kompatibel applikationsserver eller webcontainer. Denne artikel diskuterer EL version 2.2.
2. Umiddelbar og udsat evaluering
ELs primære funktion i JSF er at forbinde JSF-visningen (normalt XHTML-markering) og den java-baserede back-end. Back-enden kan være brugeroprettede administrerede bønner eller containerstyrede objekter som HTTP-sessionen.
Vi vil se på EL 2.2. EL i JSF findes i to generelle former, øjeblikkelig syntaks EL og udskudt syntaks EL.
2.1. Umiddelbar syntaks EL
Ellers kendt som JSP EL, er dette et scriptformat, der er tilbageholdende fra JSP-dage med Java-webapplikationsudvikling.
JSP EL-udtrykkene starter med dollartegnet ($), efterfulgt af venstre krøllede parentes ({), derefter efterfulgt af det aktuelle udtryk og til sidst lukket med den højre krøllede parentes (}):
$ {ELBean.value> 0}
Denne syntaks:
- Evalueres kun en gang (i starten) i en sides livscyklus. Hvad dette betyder er, at den værdi, der er. At blive læst af udtrykket i eksemplet ovenfor skal indstilles, før siden indlæses.
- Giver skrivebeskyttet adgang til bønneværdier.
- Og som et resultat kræver overholdelse af JavaBean navngivningskonventionen.
Til de fleste anvendelser er denne form for EL ikke særlig alsidig.
2.2. Udskudt udførelse EL
Udskudt udførelse EL er EL designet til korrekt JSF. Det er den største syntaktiske forskel med JSP EL, at den er markeret med en "#” i stedet for en “$“.
# {ELBean.value> 0}
Udskudt EL:
- Er synkroniseret med JSF-livscyklussen. Dette betyder, at et EL-udtryk i udskudt EL vurderes på forskellige punkter i gengivelsen af en JSF-side (i begyndelsen og slutningen).
- Giver læse- og skriveadgang til bønneværdier. Dette giver en mulighed for at indstille en værdi i en JSF-bagbønne (eller andre steder) ved hjælp af EL.
- Tillader en programmør at påberåbe sig vilkårlige metoder på et objekt og, afhængigt af versionen af EL, videregive argumenter til sådanne metoder.
Unified EL er specifikationen, der forener både udskudt EL og JSP EL, hvilket tillader begge syntaks på samme side.
3. Unified EL
Unified EL tillader to generelle varianter af udtryk, værdiudtryk og metodeudtryk.
Og en hurtig note - de følgende sektioner viser nogle eksempler, som alle er tilgængelige i appen (se Github-linket i slutningen) ved at navigere til:
//localhost:8080/jsf/el_intro.jsf
3.1. Værdiudtryk
Et værdiudtryk giver os mulighed for enten at læse eller indstille en administreret bønneegenskab, afhængigt af hvor den er placeret.
Følgende udtryk læser en administreret bønneegenskab på siden:
Hej, # {ELBean.firstName}
Følgende udtryk tillader os dog at indstille en værdi på brugerobjektet:
Variablen skal følge JavaBean navngivningskonvention for at være berettiget til denne form for behandling. For at værdien af bønnen skal begås, skal den vedlagte formular bare gemmes.
3.2. Metodeudtryk
Unified EL giver metodeudtryk til at udføre offentlige, ikke-statiske metoder fra en JSF-side. Metoderne har eller måske ikke returværdier.
Her er et hurtigt eksempel:
Det Gemme() den metode, der henvises til, er defineret på en navngivet bagbønne ELBean.
Fra EL 2.2 kan du også videregive argumenter til den metode, der er adgang til ved hjælp af EL. Dette kan give os mulighed for at omskrive vores eksempel således:
Det, vi har gjort her, er at oprette et bindingsudtryk, der er sideomfanget inputText komponent og passere direkte værdi attribut til metodeudtrykket.
Bemærk, at variablen sendes til metoden uden nogen speciel notation, krøllede seler eller flugttegn.
3.3. Implicitte EL-objekter
JSF EL-motoren giver adgang til flere containeradministrerede objekter. Nogle af dem er:
- #{Ansøgning}: Fås også som # {servletContext}, dette er objektet, der repræsenterer webapplikationsforekomsten
- # {applicationScope}: et kort over variabler, der er tilgængelige over hele webapplikationen
- # {Cookie}: et kort over HTTP-cookievariablerne
- # {ansigterContext}: den aktuelle forekomst af AnsigterKontekst
- #{blitz}: JSF Flash-scoped-objektet
- #{header}: et kort over HTTP-overskrifter i den aktuelle anmodning
- # {initParam}: et kort over kontekstinitialiseringsvariablerne for webapplikationen
- # {param}: et kort over HTTP-anmodningsparametre
- #{anmodning}: det HTTPServletRequest objekt
- # {requestScope}: et kort med variabler, der er anmodet om
- # {sessionScope}: et session-scoped kort over variabler
- #{session}: det HTTPSession objekt
- # {viewScope}: et oversigtsoversigt (side-) over variabler
Følgende enkle eksempel viser alle anmodningsoverskrifter og værdier ved at få adgang til overskrifter implicit objekt:
# {header.key} # {header.value}
4. Hvad du kan gøre i EL
I sin alsidighed kan EL vises i Java-kode, XHTML-markering, Javascript og endda i JSF-konfigurationsfiler som ansigter-config.xml fil. Lad os undersøge nogle konkrete brugssager.
4.1. Brug EL i sidemarkering
EL kan vises i standard HTML-tags:
4.2. Brug EL i JavaScript
EL fortolkes, når de opstår i Javascript eller tags:
var theVar = # {ELBean.firstName};
En baggrundsbønne-variabel vil blive indstillet som en javascript-variabel her.
4.3. Evaluer boolsk logik i EL ved hjælp af operatører
EL understøtter ret avancerede sammenligningsoperatører:
- ækv ligestillingsoperatør, svarende til “==.”
- lt mindre end operatør, svarende til “<.”
- le mindre end eller lig med operator, svarende til "<=."
- gt større end operatøren, svarende til ">."
- ge større end eller lig, svarende til “>=.“
4.4. Evaluer EL i en bagbønne
Inden for baggrundsbønnekoden kan man evaluere et EL-udtryk ved hjælp af JSF-applikationen. Dette åbner en verden af muligheder ved at forbinde JSF-siden med bagbønnen. Du kan nemt hente implicitte EL-objekter eller nemt hente faktiske HTML-sidekomponenter eller deres værdi fra bagbønnen:
FacesContext ctx = FacesContext.getCurrentInstance (); Applikationsapp = ctx.getApplication (); String firstName = app.evaluateExpressionGet (ctx, "# {firstName.value}", String.class); HtmlInputText firstNameTextBox = app.evaluateExpressionGet (ctx, "# {firstName}", HtmlInputText.class);
Dette giver udvikleren stor fleksibilitet i at interagere med en JSF-side.
5. Hvad du ikke kan gøre i EL
EL <3.0 har nogle begrænsninger. De følgende afsnit diskuterer nogle af dem.
5.1. Ingen overbelastning
EL understøtter ikke brugen af overbelastning. Så i en bagbønne med følgende metoder:
offentlig ugyldig gem (bruger brugeren); offentlig ugyldig gemme (streng brugernavn); offentlig ugyldig gemme (heltal uid);
JSF EL kan ikke korrekt evaluere følgende udtryk korrekt
JSF ELResolver vil introspektere klassedefinitionen af bønne, og vælg den første metode, der returneres af java.lang.Class # getMethods (en metode, der returnerer de tilgængelige metoder i en klasse). Rækkefølgen af de returnerede metoder er ikke garanteret, og dette vil uundgåeligt resultere i udefineret adfærd.
5.2. Ingen enums eller konstante værdier
JSF EL <3.0 understøtter ikke brugen af konstante værdier eller Enums i scriptet. Så med et af følgende
public static final String USER_ERROR_MESS = "Nej, det kan du ikke"; enum dage {lør, søn, man, ti, ons, tor, fre};
betyder, at du ikke kan gøre følgende
5.3. Ingen indbygget nul sikkerhed
JSF EL <v3.0 giver ikke implicit nul sikker adgang, som nogle måske finder underligt ved en moderne scriptmotor.
Så hvis person i nedenstående udtryk er null, hele udtrykket mislykkes med en grim NPE
Hej hr. # {ELBean.person.sname} "
6. Konklusion
Vi har undersøgt nogle af de grundlæggende i JSF EL, styrker og begrænsninger.
Dette er stort set et alsidigt manuskriptsprog med noget plads til forbedring; det er også limen, der binder JSF-visningen til JSF-modellen og controlleren.
Kildekoden, der ledsager denne artikel, er tilgængelig på GitHub.