JSP - EL (Expression Language) 1. Introduction EL offre la possibilité d’écrire

JSP - EL (Expression Language) 1. Introduction EL offre la possibilité d’écrire des expressions qui vont être évaluées dynamiquement à l’exécution de la page. Une expression peut être un accès à une variable, une opération sur des variables, ou une invocation de méthode. Voici un exemple d’utilisation d’une expression EL : 1 2 3 4 5 6 <% request.setAttribute("x", 5); request.setAttribute("y", 10); %> ${x*y} <!-- expression arithmétique EL --> Voici le code Java généré par le container de servlets : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public void _jspService( final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { // ... request.setAttribute("x", 5); request.setAttribute("y", 10); out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${x*y}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); // ... } La valeur de l’expression ${x*y} est passée en paramètre à la méthode proprietaryEvaluate. À l’exécution de la page JSP l’expression va être évaluée et la valeur résultante de l’exécution de cette expression va être écris dans la sortie. Une expression EL est placée entre deux accolades "{" et "}" avec le caractère "$" placé avant la première accolade ouvrante : ${EL_Expression} À noter que les expressions EL ne permettent pas d'écrire des instructions de flux de commande (conditions, boucles). 2. Les littéraux du langage EL Le typage n’est pas explicite avec EL, il est inféré par le compilateur dépendamment de la valeur de l’expression. Il y a cependant cinq catégories de littéraux qui sont mappés avec cinq types correspondants du langage Java. 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ | littéral | Exemple | Commentaire | +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ | true|false | ${true == (4 == 4)} | Équivalents aux littéraux Java "true" et "false". | | | | Comme pour Java, il faut respecter la casse. | +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ | Nombres | ${10000 + 25.87} | Nombres entiers et réels. | +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ | Chaînes de caractères | ${"chaîne de caractères"} | Les caractères sont placés entre deux guillemets (") ou deux apostrophes ('). | +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ | null | ${null} | Équivalent au littéral Java "null". | | | | Comme pour Java, il faut respecter la casse. | | | | Génère une chaine vide sur la sortie. | +-----------------------+---------------------------+-------------------- -----------------------------------------------------------+ Notes : - Pour les littéraux "true", "false", et "null", il faut respecter la casse sinon l’évaluateur des expressions EL va considérer qu’il s’agit d’un nom de variable. - Pour les chaines de caractères, il est possible d’utiliser le caractère d’échappement "\" pour échapper les caractères ("), ('), et (\) : (\"), (\'), (\\). 3. Opérateurs du langage EL 3.1) Les opérateurs arithmétiques EL offre les opérateurs d’addition (+), soustraction (-), division (/ ou div), modulo (% ou mod), changement de signe (-). Ces opérateurs ont le même comportement que ceux du langage Java, à l’exception des cas suivants :  L’opérateur d’addition (+) s’applique uniquement aux nombres, et il n’est pas possible de l’utiliser avec des chaînes de caractères pour faire la concaténation, comme c’est le cas en Java. Ainsi l’opération ${"abc" + "12"} génère une exception java.lang.NumberFormatException : java.lang.NumberFormatException: For input string: "abc".  Les opérandes de ces opérateurs peuvent être des littéraux ou des variables et leurs valeurs peuvent être des nombres mais aussi des chaînes de caractères à condition que la chaîne de caractères soit convertible en une valeur numérique, par exemple l’opération ${"5" - "4"} donne le résultat "1". Vous obtiendrez l’exception vu ci-dessus si la conversion de un des opérandes de ces opérateurs échoue.  Si la variable est inexistante ou que sa valeur est nulle, alors par défaut l’évaluateur des expressions EL la traite comme si sa valeur est "0". Cela s’applique aussi au littéral null qui est considéré comme "0" lorsqu’il est utilisé comme opérande de ces opérateurs. Ainsi l’opération ${null + "4"} donne le résultat "4".  La division sur la valeur "0" ne génère pas une exception puisqu’elle est considérée une division réelle. Et donc le résultat de l’opération ${"5" / "0"} est la valeur "Infinity" (comme c’est le cas pour Java lorsque la division est réelle).  L’opérateur modulo performe une opération entière si les deux opérandes sont des valeurs entière, sinon, si un des opérandes et réel alors l’opérateur modulo performe une opération réelle. Ainsi l’opération ${"5" % 2} donne le résultat "1". Et l’opération ${"5" % "2.0"} donne le résultat "1.0".  L’opérateur unaire "-" permet de changer le signe d’un opérande (nombre) à la négative ou positive selon le signe du nombre. Ainsi l’opération ${- (4)} donne le résultat "-4". Et l’opération ${- (-5)} donne le résultat "5". 3.2) Les opérateurs relationnels Nom de l’opérateur EL EL (syntaxe java) égale à eq (exemple : ${5 eq 2}) == (exemple : ${5 == 2}) différent de ne (exemple : ${5 ne 2}) != (exemple : ${5 != 2}) plus grand que gt (exemple : ${5 gt 2}) > (exemple : ${5 > 2}) plus grand ou égale à ge (exemple : ${5 ge 2}) >= (exemple : ${5 >= 2}) plus petit que lt (exemple : ${5 lt 2}) < (exemple : ${5 < 2}) plus petit ou égale à le (exemple : ${5 le 2}) <= (exemple : ${5 <= 2}) Ces opérateurs s’appliquent autant sur des nombres que des chaînes de caractères. Le type de l’opération de comparaison dépend du type des opérandes :  Si les deux opérandes sont des nombres alors la comparaison est numérique. Exemple : ${5 le 22}. Résultat : "true".  Si un des opérandes est un nombre et la valeur du deuxième opérande est convertible en valeur numérique alors la comparaison est numérique. Exemple : ${5 le "22"}. Résultat : "true".  Si les deux opérandes sont des chaînes de caractères alors la comparaison est faite sur des chaînes de caractères. Exemple (1) : ${"5" le "22"}. Résultat : "false". Exemple (2) : ${"abc" le "xyz"}. Résultat : "true".  Sinon, si un des opérandes est un nombre et la valeur du deuxième opérande n’est pas convertible en valeur numérique alors l’évaluateur des expressions EL génère une exception javax.el.ELException. Exemple : ${5 le "abc"}. Résultat : javax.el.ELException: Cannot convert abc of type class java.lang.String to class java.lang.Long. 3.3) Les opérateurs logiques Nom de l’opérateur EL Évaluation de la condition négation NOT not Exemple (1) : ${not x} Exemple (2) : ${! x} la condition est vraie si x est false la condition est fausse si x est true ! opérateur AND and Exemple (1) : ${x and y} Exemple (2) : ${x && y} && la condition est vraie si x et y sont true la condition est fausse si x ou/et y sont false opérateur OR or Exemple (1) : ${x or y} Exemple (2) : ${x || y} la condition est vraie si x ou/et y sont true la condition est fausse si x et y sont false || Notes : L’évaluation d’une valeur qui n’est pas « true » est toujours fausse. Cela s’applique autant pour des chaînes de caractères (à l’exception de la chaîne de caractères "true"), des valeurs numériques, des variables non définies, et le littéral null. Exemples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <% request.setAttribute("x1", "true"); request.setAttribute("x2", "aaa"); request.setAttribute("x3", "1"); request.setAttribute("x4", "0"); %> ${not x1} <!-- résultat de l’évaluation : "false" --> ${not x2} <!-- résultat de l’évaluation : "true" --> ${not x3} <!-- résultat de l’évaluation : "true" --> ${not x4} <!-- résultat de l’évaluation : "true" --> ${not x5} <!-- résultat de l’évaluation : "true" --> ${not null} <!-- résultat de l’évaluation : "true" --> 3.4) L’opérateur ternaire "? :" (COND ? STMT1 : STMT2) L'opérateur ternaire utilise une expression conditionnelle, qui retourne true ou false, pour déterminer l’expression à exécuter. L’opérateur est équivalemment à une instruction if...else : if(COND) STMT1; else STMT2; 1 2 3 4 5 <% request.setAttribute("attr0", 4); %> ${( attr0 mod 2 eq 0) ? "EVEN NUMBER" : "ODD NUMBER"} 3.5) L’opérateur empty L’application de l’opérateur empty est évaluée à vraie si l’opérande est null, l’opérande est une chaîne de caractères vide, l’opérande est une variable non définie, ou l’opérande est une variable dont la valeur est null. L’évaluation est aussi vraie si l’opérande est un tableau vide ou une collection vide. Autrement l’évaluation est fausse. Exemples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <% request.setAttribute("y1", ""); request.setAttribute("y2", null); request.setAttribute("y3", new int[0]); request.setAttribute("y4", new Integer[0]); request.setAttribute("y5", new ArrayList()); %> ${empty y1} <!-- résultat de l’évaluation : "true" --> ${empty y2} <!-- résultat de l’évaluation : "true" --> ${empty y3} <!-- résultat de l’évaluation : "false" --> ${empty y4} <!-- résultat de l’évaluation : "true" --> ${empty y5} <!-- résultat de l’évaluation : "true" --> ${empty y6} <!-- résultat de l’évaluation : "true" --> ${empty null} <!-- résultat de l’évaluation : "true" --> 3.6) Les opérateurs d’accès "." et "[]" les opérateurs "." et "[]" uploads/s3/ jsp-el-expression-language.pdf

  • 32
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager