Introduzione a JSF EL 2

1. Introduzione

Expression Language (EL), è un linguaggio di scripting che è stato adottato in molti framework Java, come Spring con SpEL e JBoss con JBoss EL.

In questo articolo, ci concentreremo sull'implementazione da parte di JSF di questo linguaggio di scripting: Unified EL.

EL è attualmente nella versione 3.0, un importante aggiornamento che consente di utilizzare il motore di elaborazione in modalità standalone, ad esempio sulla piattaforma Java SE. Le versioni precedenti dipendevano da un server delle applicazioni o da un web container conforme a Jakarta EE. Questo articolo discute EL versione 2.2.

2. Valutazione immediata e differita

La funzione principale di EL in JSF è connettere la vista JSF (solitamente markup XHTML) e il back-end basato su java. Il back-end può essere bean gestiti creati dall'utente o oggetti gestiti dal contenitore come la sessione HTTP.

Prenderemo in esame EL 2.2. EL in JSF è disponibile in due forme generali, sintassi immediata EL e sintassi differita EL.

2.1. Sintassi immediata EL

Altrimenti noto come JSP EL, questo è un formato di script che è un residuo dei giorni JSP dello sviluppo di applicazioni web java.

Le espressioni JSP EL iniziano con il segno del dollaro ( $ ), quindi seguite dalla parentesi graffa sinistra ( { ), quindi seguite dall'espressione effettiva e infine si chiudono con la parentesi graffa destra ( } ):

${ELBean.value > 0}

Questa sintassi:

  1. Viene valutato solo una volta (all'inizio) nel ciclo di vita di una pagina. Ciò significa che il valore che è. Il fatto di essere letto dall'espressione nell'esempio sopra deve essere impostato prima che la pagina venga caricata.
  2. Fornisce accesso in sola lettura ai valori del bean.
  3. Di conseguenza, richiede l'adesione alla convenzione di denominazione JavaBean.

Per la maggior parte degli usi, questa forma di EL non è molto versatile.

2.2. Esecuzione differita EL

Deferred Execution EL è l'EL progettato per JSF corretto. La sua principale differenza sintattica con JSP EL è che è contrassegnato con un " #" invece di un " $ ".

#{ELBean.value > 0}

EL differito:

  1. È sincronizzato con il ciclo di vita JSF. Ciò significa che un'espressione EL in EL differita viene valutata in diversi punti nel rendering di una pagina JSF (all'inizio e alla fine).
  2. Fornisce accesso in lettura e scrittura ai valori del bean. Ciò consente di impostare un valore in un backing-bean JSF (o in qualsiasi altro luogo) utilizzando EL.
  3. Consente a un programmatore di invocare metodi arbitrari su un oggetto e, a seconda della versione di EL, passare argomenti a tali metodi.

Unified EL è la specifica che unifica sia EL differito che JSP EL, consentendo entrambe le sintassi nella stessa pagina.

3. EL unificato

Unified EL consente due tipi generali di espressioni, espressioni di valore ed espressioni di metodo.

E una breve nota: le sezioni seguenti mostreranno alcuni esempi, che sono tutti disponibili nell'app (vedi il collegamento Github alla fine) navigando su:

//localhost:8080/jsf/el_intro.jsf

3.1. Espressioni di valore

Un'espressione di valore ci consente di leggere o impostare una proprietà del bean gestito, a seconda di dove è posizionata.

La seguente espressione legge una proprietà del bean gestito sulla pagina:

Hello, #{ELBean.firstName}

La seguente espressione, tuttavia, ci consente di impostare un valore sull'oggetto utente:

La variabile deve seguire la convenzione di denominazione JavaBean per essere idonea per questo tipo di trattamento. Affinché il valore del bean venga sottoposto a commit, è sufficiente salvare il modulo che lo racchiude.

3.2. Espressioni di metodo

Unified EL fornisce espressioni di metodo per eseguire metodi pubblici e non statici dall'interno di una pagina JSF. I metodi possono o non possono avere valori di ritorno.

Ecco un rapido esempio:

Il metodo save () a cui si fa riferimento è definito su un backing bean denominato ELBean.

A partire da EL 2.2, puoi anche passare argomenti al metodo a cui si accede utilizzando EL. Questo può permetterci di riscrivere il nostro esempio così:

Quello che abbiamo fatto qui, è creare un'espressione di associazione con ambito di pagina per il componente inputText e passare direttamente l' attributo value all'espressione del metodo.

Si noti che la variabile viene passata al metodo senza alcuna notazione speciale, parentesi graffe o caratteri di escape.

3.3. Oggetti EL impliciti

Il motore JSF EL fornisce l'accesso a diversi oggetti gestiti dal contenitore. Alcuni di loro sono:

  • # {Application} : disponibile anche come # {servletContext} , questo è l'oggetto che rappresenta l'istanza dell'applicazione web
  • # {applicationScope} : una mappa di variabili accessibile a livello di applicazione web
  • # {Cookie} : una mappa delle variabili dei cookie HTTP
  • # {facesContext} : l'istanza corrente di FacesContext
  • # {flash} : l'oggetto JSF Flash con ambito
  • # {header} : una mappa delle intestazioni HTTP nella richiesta corrente
  • # {initParam} : una mappa delle variabili di inizializzazione del contesto dell'applicazione web
  • # {param} : una mappa dei parametri di query della richiesta HTTP
  • #{request}: the HTTPServletRequest object
  • #{requestScope}: a request-scoped map of variables
  • #{sessionScope}: a session-scoped map of variables
  • #{session}: the HTTPSession object
  • #{viewScope}: a view (page-) scoped map of variables

The following simple example lists all the request headers and values by accessing the headers implicit object:

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

4. What You Can Do in EL

In its versatility, EL can be featured in Java code, XHTML markup, Javascript and even in JSF configuration files like the faces-config.xml file. Let's examine some concrete use-cases.

4.1. Use EL in Page Markup

EL can be featured in standard HTML tags:

4.2. Use EL in JavaScript

EL will be interpreted when encountered in Javascript or tags:

 var theVar = #{ELBean.firstName};

A backing bean variable will be set as a javascript variable here.

4.3. Evaluate Boolean Logic in EL Using Operators

EL supports fairly advanced comparison operators:

  • eq equality operator, equivalent to “==.”
  • lt less than operator, equivalent to “<.”
  • le less than or equal to operator, equivalent to “<=.”
  • gt greater than operator, equivalent to “>.”
  • ge greater than or equal, equivalent to “>=.

4.4. Evaluate EL in a Backing Bean

From within the backing bean code, one can evaluate an EL expression using the JSF Application. This opens up a world of possibilities, in connecting the JSF page with the backing bean. You could retrieve implicit EL objects, or retrieve actual HTML page components or their value easily from the backing bean:

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

This allows the developer a great deal of flexibility in interacting with a JSF page.

5. What You Can Not Do in EL

EL < 3.0 does have some limitations. The following sections discuss some of them.

5.1. No Overloading

EL doesn’t support the use of overloading. So in a backing bean with the following methods:

public void save(User theUser); public void save(String username); public void save(Integer uid);

JSF EL will not be able to properly evaluate the following expression

The JSF ELResolver will introspect the class definition of bean, and pick the first method returned by java.lang.Class#getMethods (a method that returns the methods available in a class). The order of the methods returned is not guaranteed and this will inevitably result in undefined behaviour.

5.2. No Enums or Constant Values

JSF EL < 3.0, doesn’t support the use of constant values or Enums in the script. So, having any of the following

public static final String USER_ERROR_MESS = "No, you can’t do that"; enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

means that you won’t be able to do the following

5.3. No Built-in Null Safety

JSF EL < v3.0 doesn’t provide implicit null safe access, which some may find odd about a modern scripting engine.

So if person in the expression below is null, the entire expression fails with an unsightly NPE

Hello Mr, #{ELBean.person.surname}"

6. Conclusion

Abbiamo esaminato alcuni dei fondamenti di JSF EL, punti di forza e limiti.

Questo è in gran parte un linguaggio di scripting versatile con margini di miglioramento; è anche il collante che lega la vista JSF, al modello JSF e al controller.

Il codice sorgente che accompagna questo articolo è disponibile su GitHub.