Introduction à JSF EL 2

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 avecSpEL et JBoss avec JBoss EL.

Dans cet article, nous nous concentrerons sur l’implémentation par JSF de ce langage de script - Unified EL.

EL est actuellement en version 3.0, une mise à niveau majeure qui permet d'utiliser le moteur de traitement 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 JavaEE. Cet article traite de la version 2.2 d'EL.

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

La fonction principale de EL dans JSF consiste à connecter la vue JSF (généralement le balisage XHTML) et le back-end java. Le back-end peut être des beans gérés créés par l'utilisateur ou des objets gérés par conteneur tels que la session HTTP.

Nous examinerons EL 2.2. EL en 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

Également connu sous le nom de JSP EL, il s’agit d’un format de script qui a été conservé des jours JSP de 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 c'est la valeur qui est. La lecture par 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, il faut adhérer à 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 l'EL conçu pour JSF proprement dit. La principale différence syntaxique avec JSP EL réside dans le fait qu’il est marqué par un "#” au lieu de"$ ".

#{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ée est évaluée à différents moments 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 bean de sauvegarde JSF (ou n'importe où ailleurs) à l'aide de EL.

  3. Permet à un programmeur d'appeler des méthodes arbitraires sur un objet et, en fonction de la version de EL, de transmettre des arguments à de telles méthodes.

Unified EL est la spécification qui unit à la fois les EL différées et les EL JSP, permettant ainsi la syntaxe dans la même page.

3. EL unifié

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

Et une note rapide - les sections suivantes vont montrer quelques exemples, qui sont tous disponibles dans l'application (voir le lien Github à la fin) en naviguant jusqu'à:

http://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é, en fonction de son emplacement.

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

Hello, #{ELBean.firstName}

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

La variable doit suivre la convention de nommage JavaBean pour pouvoir bénéficier de ce type de traitement. Pour que la valeur du bean soit validée, il suffit de sauvegarder le formulaire englobant.

3.2. Expressions de méthode

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

Voici un exemple rapide:

La méthodesave() à laquelle il est fait référence est définie sur un backing bean nomméELBean.

À partir de EL 2.2, vous pouvez également passer des arguments à la méthode accessible via 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 composantinputText et de transmettre directement l'attributvalue à l'expression de méthode.

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

3.3. Objets EL implicites

Le moteur JSF EL donne accès à plusieurs objets gérés par le 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 deFacesContext

  • #{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}: l'objetHTTPServletRequest

  • #{requestScope}: une carte de variables étendue à la demande

  • #{sessionScope}: une carte de variables à l'échelle de la session

  • #{session}: l'objetHTTPSession

  • #{viewScope}: une mappe de variables de vue (page)

L'exemple simple suivant répertorie tous les en-têtes et valeurs de demande en accédant à l'objet impliciteheaders:


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

4. Ce que vous pouvez faire en EL

Dans sa polyvalence, EL peut être présenté dans le code Java, le balisage XHTML, Javascript et même dans les fichiers de configuration JSF comme le fichierfaces-config.xml. Examinons quelques cas d’utilisation concrets.

4.1. Utiliser EL dans le balisage de page

EL peut figurer dans les balises HTML standard:

4.2. Utiliser EL dans JavaScript

EL sera interprété s'il est rencontré dans les balises Javascript ou

Une variable de haricot de sauvegarde sera définie comme une variable javascript ici.

4.3. Évaluer la logique booléenne dans EL à l'aide d'opérateurs

EL supporte des opérateurs de comparaison assez avancés:

  • Opérateur d'égalitéeq, équivalent à «==.”

  • lt inférieur à l'opérateur, équivalent à «<».

  • le inférieur ou égal à l'opérateur, équivalent à «⇐».

  • gt supérieur à l'opérateur, équivalent à «>».

  • ge supérieur ou égal, équivalent à «>=.»

4.4. Évaluer EL dans un Backing Bean

À partir du code de haricot de base, vous pouvez évaluer une expression EL à l’aide de l’application JSF. Cela ouvre un monde de possibilités, en reliant la page JSF au bean backing. Vous pouvez récupérer des objets EL implicites ou des composants de page HTML réels ou leur valeur facilement à partir du bean de support:

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);

Cela donne au développeur beaucoup de souplesse pour interagir avec une page JSF.

5. Ce que vous ne pouvez pas faire en EL

EL <3.0 a quelques limitations. Les sections suivantes traitent de certaines d’entre elles.

5.1. Pas de surcharge

EL ne prend pas en charge l’utilisation de la surcharge. Donc, dans un haricot de sauvegarde avec les méthodes suivantes:

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

JSF EL ne pourra pas évaluer correctement l'expression suivante

Le JSFELResolver introspectera la définition de classe debean et choisira la première méthode retournée parjava.lang.Class#getMethods (une méthode qui retourne les méthodes disponibles dans une classe). L'ordre des méthodes retournées n'est pas garanti et cela entraînera inévitablement un comportement indéfini.

5.2. Pas d'énumérations ou de valeurs constantes

JSF EL <3.0, ne prend pas en charge l’utilisation de valeurs constantes ou d’énums dans le script. Donc, ayant l'un des éléments suivants

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

signifie que vous ne pourrez pas faire ce qui suit


5.3. Pas de sécurité nulle intégrée

JSF EL

Donc siperson dans l'expression ci-dessous est nul, l'expression entière échoue avec un NPE disgracieux

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 le ciment qui lie la vue JSF au modèle et au contrôleur JSF.

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