Inleiding tot JSF EL 2

1. Inleiding

Expression Language (EL), is een scripttaal die wordt gebruikt in veel Java-frameworks, zoals Spring met SpEL en JBoss met JBoss EL.

In dit artikel zullen we ons concentreren op de implementatie door de JSF van deze scripttaal - Unified EL.

EL is momenteel in versie 3.0, een belangrijke upgrade waarmee de verwerkingsengine in stand-alone modus kan worden gebruikt, bijvoorbeeld op het Java SE-platform. Eerdere versies waren afhankelijk van een Jakarta EE-compatibele applicatieserver of webcontainer. Dit artikel bespreekt EL-versie 2.2.

2. Onmiddellijke en uitgestelde evaluatie

De primaire functie van EL in JSF is om de JSF-weergave (meestal XHTML-markup) en de op Java gebaseerde back-end te verbinden. De back-end kan door de gebruiker gemaakte beheerde bonen zijn, of door containers beheerde objecten zoals de HTTP-sessie.

We zullen kijken naar EL 2.2. EL in JSF komt in twee algemene vormen voor: onmiddellijke syntaxis EL en uitgestelde syntaxis EL.

2.1. Onmiddellijke syntaxis EL

Ook wel bekend als JSP EL, dit is een scriptindeling die een overblijfsel is van de JSP-dagen van de ontwikkeling van Java-webapplicaties.

De JSP EL-uitdrukkingen beginnen met het dollarteken ($), gevolgd door de linker accolade ({), gevolgd door de eigenlijke uitdrukking, en tenslotte afgesloten met de rechter accolade (}):

$ {ELBean.value> 0}

Deze syntaxis:

  1. Wordt slechts één keer (aan het begin) geëvalueerd in de levenscyclus van een pagina. Wat dit betekent is dat de waarde dat is. Worden gelezen door de uitdrukking in het bovenstaande voorbeeld moet worden ingesteld voordat de pagina wordt geladen.
  2. Biedt alleen-lezen toegang tot bean-waarden.
  3. En als gevolg hiervan is naleving van de JavaBean-naamgevingsconventie vereist.

Voor de meeste toepassingen is deze vorm van EL niet erg veelzijdig.

2.2. Uitgestelde uitvoering EL

Uitgestelde uitvoering EL is de EL die is ontworpen voor JSF. Het belangrijkste syntactische verschil met JSP EL is dat het is gemarkeerd met een "#” inplaats van een "$“.

# {ELBean.value> 0}

Uitgestelde EL:

  1. Is synchroon met de JSF-levenscyclus. Dit betekent dat een EL-uitdrukking in uitgestelde EL wordt geëvalueerd op verschillende punten in de weergave van een JSF-pagina (aan het begin en aan het einde).
  2. Biedt lees- en schrijftoegang tot bean-waarden. Hierdoor kan men een waarde instellen in een JSF-steunboon (of waar dan ook) met EL.
  3. Hiermee kan een programmeur willekeurige methoden op een object aanroepen en, afhankelijk van de versie van EL, argumenten aan dergelijke methoden doorgeven.

Unified EL is de specificatie die zowel uitgestelde EL als JSP EL verenigt, waardoor beide syntaxis op dezelfde pagina staan.

3. Unified EL

Unified EL staat twee algemene smaken van uitdrukkingen toe: waarde-uitdrukkingen en methode-uitdrukkingen.

En een korte opmerking - de volgende secties zullen enkele voorbeelden tonen, die allemaal beschikbaar zijn in de app (zie de Github-link aan het einde) door te navigeren naar:

//localhost:8080/jsf/el_intro.jsf

3.1. Waarde-uitdrukkingen

Een waarde-uitdrukking stelt ons in staat om een ​​beheerde bean-eigenschap te lezen of in te stellen, afhankelijk van waar deze is geplaatst.

De volgende uitdrukking leest een beheerde bean-eigenschap op de pagina:

Hallo, # {ELBean.firstName}

Met de volgende uitdrukking kunnen we een waarde instellen voor het gebruikersobject:

De variabele moet de JavaBean-naamgevingsconventie volgen om in aanmerking te komen voor dit soort behandeling. Om de waarde van de boon vast te leggen, hoeft u alleen het bijgevoegde formulier op te slaan.

3.2. Methode-uitdrukkingen

Unified EL biedt methode-expressies om openbare, niet-statische methoden uit te voeren vanuit een JSF-pagina. De methoden kunnen al dan niet retourwaarden hebben.

Hier is een snel voorbeeld:

De sparen() de methode waarnaar wordt verwezen, wordt gedefinieerd op een ondersteuningsboon met de naam ELBean.

Vanaf EL 2.2 kunt u ook argumenten doorgeven aan de methode waartoe toegang wordt verkregen met EL. Dit kan ons toelaten om ons voorbeeld als volgt te herschrijven:

Wat we hier hebben gedaan, is een bindingsexpressie met paginabereik maken voor de inputText component en ga direct over de waarde attribuut aan de methode-expressie.

Merk op dat de variabele wordt doorgegeven aan de methode zonder speciale notatie, accolades of escape-tekens.

3.3. Impliciete EL-objecten

De JSF EL-engine biedt toegang tot verschillende door containers beheerde objecten. Sommige ervan zijn:

  • #{Toepassing}: Ook verkrijgbaar als # {servletContext}, dit is het object dat het exemplaar van de webtoepassing vertegenwoordigt
  • # {applicationScope}: een kaart met variabelen die voor de hele webtoepassing toegankelijk zijn
  • #{Koekje}: een kaart van de HTTP-cookievariabelen
  • # {facesContext}: het huidige exemplaar van FacesContext
  • #{flash}: het JSF Flash scoped-object
  • # {header}: een kaart van de HTTP-headers in het huidige verzoek
  • # {initParam}: een kaart van de variabelen voor contextinitialisatie van de webapplicatie
  • # {param}: een overzicht van de queryparameters voor HTTP-verzoeken
  • #{verzoek}: de HTTPServletRequest voorwerp
  • # {requestScope}: een kaart met variabelen op verzoek
  • # {sessionScope}: een sessie-scoped kaart van variabelen
  • #{sessie}: de HTTPSessie voorwerp
  • # {viewScope}: een weergave (pagina) scoped kaart van variabelen

In het volgende eenvoudige voorbeeld worden alle aanvraagheaders en waarden weergegeven door de headers impliciet object:

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

4. Wat u kunt doen in EL

Door zijn veelzijdigheid kan EL worden gebruikt in Java-code, XHTML-markup, Javascript en zelfs in JSF-configuratiebestanden zoals de faces-config.xml het dossier. Laten we enkele concrete use-cases onderzoeken.

4.1. Gebruik EL in pagina-opmaak

EL kan worden weergegeven in standaard HTML-tags:

4.2. Gebruik EL in JavaScript

EL zal worden geïnterpreteerd wanneer ze worden aangetroffen in Javascript of tags:

 var theVar = # {ELBean.firstName};

Een backing bean-variabele wordt hier ingesteld als een javascript-variabele.

4.3. Evalueer de Booleaanse logica in EL met behulp van operators

EL ondersteunt redelijk geavanceerde vergelijkingsoperatoren:

  • eq gelijkheidsoperator, gelijk aan "==.”
  • lt kleiner dan operator, gelijk aan "<."
  • le kleiner dan of gelijk aan operator, gelijk aan "<=."
  • gt groter dan operator, gelijk aan '>'.
  • ge groter dan of gelijk, gelijk aan ">=.

4.4. Evalueer EL in een Backing Bean

Vanuit de backing bean-code kan men een EL-expressie evalueren met behulp van de JSF-applicatie. Dit opent een wereld van mogelijkheden door de JSF-pagina te verbinden met de achtergrondboon. U kunt impliciete EL-objecten ophalen, of feitelijke HTML-paginacomponenten of hun waarde eenvoudig ophalen uit de ondersteunende bean:

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

Dit geeft de ontwikkelaar veel flexibiliteit bij de interactie met een JSF-pagina.

5. Wat u niet kunt doen in EL

EL <3.0 heeft enkele beperkingen. In de volgende secties worden enkele ervan besproken.

5.1. Geen overbelasting

EL ondersteunt het gebruik van overbelasting niet. Dus in een steunboon met de volgende methoden:

openbare leegte opslaan (gebruiker de gebruiker); public void save (String gebruikersnaam); public void save (Integer uid);

JSF EL zal de volgende uitdrukking niet goed kunnen evalueren

De JSF ELResolver zal de klassendefinitie van Boonen kies de eerste methode die wordt geretourneerd door java.lang.Class # getMethods (een methode die de methoden retourneert die beschikbaar zijn in een klasse). De volgorde van de geretourneerde methoden is niet gegarandeerd en dit zal onvermijdelijk resulteren in ongedefinieerd gedrag.

5.2. Geen opsommingen of constante waarden

JSF EL <3.0 ondersteunt het gebruik van constante waarden of Enums in het script niet. Dus met een van de volgende

public static final String USER_ERROR_MESS = "Nee, dat kun je niet doen"; opsomming dagen {za, zo, ma, di, wo, do, vr};

betekent dat u het volgende niet kunt doen

5.3. Geen ingebouwde nulbeveiliging

JSF EL <v3.0 biedt geen impliciete null-veilige toegang, wat sommigen misschien vreemd vinden aan een moderne script-engine.

Dus als persoon in de onderstaande uitdrukking nul is, mislukt de hele uitdrukking met een onooglijke NPE

Hallo meneer, # {ELBean.persoon.achternaam} "

6. Conclusie

We hebben enkele basisprincipes van JSF EL, sterke punten en beperkingen, onderzocht.

Dit is grotendeels een veelzijdige scripttaal met enige ruimte voor verbetering; het is ook de lijm die de JSF-weergave bindt aan het JSF-model en de controller.

De broncode die bij dit artikel hoort, is beschikbaar op GitHub.