Introduction à JSF EL 2

1. Introduction

Expression Language (EL), est un langage de script qui a été adopté dans de nombreux frameworks Java, tels que Spring avec SpEL et JBoss avec JBoss EL.

Dans cet article, nous allons nous concentrer sur l'implémentation JSF de ce langage de script - Unified EL.

EL est actuellement en version 3.0, une mise à jour majeure qui permet au moteur de traitement d'être utilisé en mode autonome - par exemple, sur la plate-forme Java SE. Les versions précédentes dépendaient d'un serveur d'applications ou d'un conteneur Web compatible Jakarta EE. Cet article décrit EL version 2.2.

2. Évaluation immédiate et différée

La fonction principale d'EL dans JSF est de connecter la vue JSF (généralement le balisage XHTML) et le back-end basé sur Java. Le back-end peut être des beans gérés créés par l'utilisateur ou des objets gérés par des conteneurs comme la session HTTP.

Nous examinerons EL 2.2. EL dans JSF se présente sous deux formes générales, la syntaxe immédiate EL et la syntaxe différée EL.

2.1. Syntaxe immédiate EL

Autrement connu sous le nom de JSP EL, il s'agit d'un format de script hérité des jours JSP du développement d'applications Web Java.

Les expressions JSP EL commencent par le signe dollar ( $ ), puis suivi de l'accolade gauche ( { ), puis de l'expression réelle, et enfin fermées par l'accolade droite ( } ):

${ELBean.value > 0}

Cette syntaxe:

  1. Est évalué une seule fois (au début) dans le cycle de vie d'une page. Cela signifie que la valeur qui est. La lecture de l'expression de l'exemple ci-dessus doit être définie avant le chargement de la page.
  2. Fournit un accès en lecture seule aux valeurs de bean.
  3. Et par conséquent, nécessite le respect de la convention de dénomination JavaBean.

Pour la plupart des utilisations, cette forme d'EL n'est pas très polyvalente.

2.2. Exécution différée EL

Exécution différée EL est le EL conçu pour JSF proprement dit. La différence syntaxique majeure avec JSP EL est qu'elle est marquée d'un « au lieu d'un « $ ».

#{ELBean.value > 0}

EL différé:

  1. Est synchronisé avec le cycle de vie JSF. Cela signifie qu'une expression EL en EL différé est évaluée à différents points du rendu d'une page JSF (au début et à la fin).
  2. Fournit un accès en lecture et en écriture aux valeurs de bean. Cela permet de définir une valeur dans un backing-bean JSF (ou n'importe où ailleurs) en utilisant EL.
  3. Permet à un programmeur d'appeler des méthodes arbitraires sur un objet et, selon la version d'EL, de transmettre des arguments à ces méthodes.

Unified EL est la spécification qui unifie à la fois EL différée et EL JSP, permettant les deux syntaxes dans la même page.

3. EL unifié

Unified EL permet deux types généraux d'expressions, d'expressions de valeur et d'expressions de méthode.

Et une note rapide - les sections suivantes montreront quelques exemples, qui sont tous disponibles dans l'application (voir le lien Github à la fin) en accédant à:

//localhost:8080/jsf/el_intro.jsf

3.1. Expressions de valeur

Une expression de valeur nous permet de lire ou de définir une propriété de bean géré, selon l'endroit où elle est placée.

L'expression suivante lit une propriété de bean géré sur la page:

Hello, #{ELBean.firstName}

L'expression suivante nous permet cependant de définir une valeur sur l'objet utilisateur:

La variable doit suivre la convention de dénomination JavaBean pour être éligible à ce type de traitement. Pour que la valeur du bean soit validée, le formulaire englobant doit simplement être enregistré.

3.2. Expressions de méthode

Unified EL fournit des expressions de méthode pour exécuter des méthodes publiques et non statiques à partir d'une page JSF. Les méthodes peuvent ou non avoir des valeurs de retour.

Voici un exemple rapide:

La méthode save () à laquelle il est fait référence est définie sur un bean de sauvegarde nommé ELBean.

À partir de EL 2.2, vous pouvez également passer des arguments à la méthode accessible en utilisant EL. Cela peut nous permettre de réécrire notre exemple ainsi:

Ce que nous avons fait ici, c'est de créer une expression de liaison à l' échelle de la page pour le composant inputText et de transmettre directement l' attribut value à l'expression de méthode.

Notez que la variable est transmise à la méthode sans aucune notation spéciale, accolades ou caractères d'échappement.

3.3. Objets EL implicites

Le moteur JSF EL permet d'accéder à plusieurs objets gérés par conteneur. Certains d'entre eux sont:

  • # {Application} : également disponible en tant que # {servletContext} , il s'agit de l'objet représentant l'instance de l'application Web
  • # {applicationScope} : une carte de variables accessible à l'échelle de l'application Web
  • # {Cookie} : une carte des variables HTTP Cookie
  • # {facesContext} : l'instance actuelle de FacesContext
  • # {flash} : l'objet de portée Flash JSF
  • # {header} : une carte des en-têtes HTTP dans la requête courante
  • # {initParam} : une carte des variables d'initialisation du contexte de l'application Web
  • # {param} : une carte des paramètres de requête 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

Nous avons examiné certains des principes fondamentaux de JSF EL, ses forces et ses limites.

Il s'agit en grande partie d'un langage de script polyvalent avec une certaine marge d'amélioration; c'est aussi la colle qui lie la vue JSF, au modèle et contrôleur JSF.

Le code source qui accompagne cet article est disponible sur GitHub.