Vous êtes sur la page 1sur 13

JSP - EL (Expression Language)

1. Introduction
EL offre la possibilit dcrire des expressions qui vont tre values dynamiquement
lexcution de la page.
Une expression peut tre un accs une variable, une opration sur des variables, ou une
invocation de mthode.
Voici un exemple dutilisation dune expression EL :
1<%
2request.setAttribute("x", 5);
3request.setAttribute("y", 10);
4%>
5
6${x*y} <!-- expression arithmtique EL -->
Voici le code Java gnr par le container de servlets :
public void _jspService(
1 final javax.servlet.http.HttpServletRequest request,
2 final javax.servlet.http.HttpServletResponse response)
3 throws java.io.IOException, javax.servlet.ServletException {
4
5 // ...
6
request.setAttribute("x", 5);
7 request.setAttribute("y", 10);
8
9 out.write((java.lang.String)
10org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${x*y}",
11java.lang.String.class,
12(javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
13
// ...
14}
La valeur de lexpression ${x*y} est passe en paramtre la mthode
proprietaryEvaluate.
lexcution de la page JSP lexpression va tre value et la valeur rsultante de lexcution
de cette expression va tre cris dans la sortie.

Une expression EL est place entre deux accolades "{" et "}" avec le caractre "$" plac avant
la premire accolade ouvrante : ${EL_Expression}
noter que les expressions EL ne permettent pas d'crire des instructions de flux de
commande (conditions, boucles).

2. Les littraux du langage EL


Le typage nest pas explicite avec EL, il est infr par le compilateur dpendamment de la
valeur de lexpression.
Il y a cependant cinq catgories de littraux qui sont mapps avec cinq types correspondants
du langage Java.
+-----------------------+---------------------------+--------------------
-----------------------------------------------------------+
| littral | Exemple |
1 Commentaire
2 |
+-----------------------+---------------------------+--------------------
3 -----------------------------------------------------------+
4 | true|false | ${true == (4 == 4)} | quivalents aux
5 littraux Java "true" et "false". |
6 | | | Comme pour Java, il
faut respecter la casse. |
7
+-----------------------+---------------------------+--------------------
8 -----------------------------------------------------------+
9 | Nombres | ${10000 + 25.87} | Nombres entiers et
1 rels. |
0 +-----------------------+---------------------------+--------------------
-----------------------------------------------------------+
1 | Chanes de caractres | ${"chane de caractres"} | Les caractres sont
1 placs entre deux guillemets (") ou deux apostrophes ('). |
1 +-----------------------+---------------------------+--------------------
2 -----------------------------------------------------------+
1 | null | ${null} | quivalent au
littral Java "null". |
3 | | | Comme pour Java, il
1 faut respecter la casse. |
4 | | | Gnre une chaine
vide sur la sortie. |
+-----------------------+---------------------------+--------------------
-----------------------------------------------------------+
Notes :
- Pour les littraux "true", "false", et "null", il faut respecter la casse sinon lvaluateur des
expressions EL va considrer quil sagit dun nom de variable.
- Pour les chaines de caractres, il est possible dutiliser le caractre dchappement "\" pour
chapper les caractres ("), ('), et (\) : (\"), (\'), (\\).

3. Oprateurs du langage EL
3.1) Les oprateurs arithmtiques

EL offre les oprateurs daddition (+), soustraction (-), division (/ ou div), modulo (% ou
mod), changement de signe (-).
Ces oprateurs ont le mme comportement que ceux du langage Java, lexception des cas
suivants :

Loprateur daddition (+) sapplique uniquement aux nombres, et il nest pas possible
de lutiliser avec des chanes de caractres pour faire la concatnation, comme cest le
cas en Java.
Ainsi lopration ${"abc" + "12"} gnre une exception
java.lang.NumberFormatException : java.lang.NumberFormatException: For
input string: "abc".
Les oprandes de ces oprateurs peuvent tre des littraux ou des variables et leurs
valeurs peuvent tre des nombres mais aussi des chanes de caractres condition que
la chane de caractres soit convertible en une valeur numrique, par exemple
lopration ${"5" - "4"} donne le rsultat "1".
Vous obtiendrez lexception vu ci-dessus si la conversion de un des oprandes de ces
oprateurs choue.

Si la variable est inexistante ou que sa valeur est nulle, alors par dfaut lvaluateur
des expressions EL la traite comme si sa valeur est "0".
Cela sapplique aussi au littral null qui est considr comme "0" lorsquil est utilis
comme oprande de ces oprateurs.
Ainsi lopration ${null + "4"} donne le rsultat "4".

La division sur la valeur "0" ne gnre pas une exception puisquelle est considre
une division relle.
Et donc le rsultat de lopration ${"5" / "0"} est la valeur "Infinity" (comme cest
le cas pour Java lorsque la division est relle).

Loprateur modulo performe une opration entire si les deux oprandes sont des
valeurs entire, sinon, si un des oprandes et rel alors loprateur modulo performe
une opration relle.
Ainsi lopration ${"5" % 2} donne le rsultat "1".
Et lopration ${"5" % "2.0"} donne le rsultat "1.0".

Loprateur unaire "-" permet de changer le signe dun oprande (nombre) la


ngative ou positive selon le signe du nombre.
Ainsi lopration ${- (4)} donne le rsultat "-4".
Et lopration ${- (-5)} donne le rsultat "5".

3.2) Les oprateurs relationnels

Nom de loprateur EL EL (syntaxe java)


gale eq ==
(exemple : ${5 eq 2}) (exemple : ${5 == 2})
diffrent 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 oprateurs sappliquent autant sur des nombres que des chanes de caractres.
Le type de lopration de comparaison dpend du type des oprandes :

Si les deux oprandes sont des nombres alors la comparaison est numrique.
Exemple : ${5 le 22}.
Rsultat : "true".

Si un des oprandes est un nombre et la valeur du deuxime oprande est convertible


en valeur numrique alors la comparaison est numrique.
Exemple : ${5 le "22"}.
Rsultat : "true".

Si les deux oprandes sont des chanes de caractres alors la comparaison est faite sur
des chanes de caractres.
Exemple (1) : ${"5" le "22"}.
Rsultat : "false".
Exemple (2) : ${"abc" le "xyz"}.
Rsultat : "true".

Sinon, si un des oprandes est un nombre et la valeur du deuxime oprande nest pas
convertible en valeur numrique alors lvaluateur des expressions EL gnre une
exception javax.el.ELException.
Exemple : ${5 le "abc"}.
Rsultat : javax.el.ELException: Cannot convert abc of type class
java.lang.String to class java.lang.Long.

3.3) Les oprateurs logiques

Nom de loprateur EL valuation de la condition


ngation 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
oprateur 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
oprateur 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 :
Lvaluation dune valeur qui nest pas true est toujours fausse.
Cela sapplique autant pour des chanes de caractres ( lexception de la chane de caractres
"true"), des valeurs numriques, des variables non dfinies, et le littral null.

Exemples :
1
2 <%
3 request.setAttribute("x1", "true");
request.setAttribute("x2", "aaa");
4 request.setAttribute("x3", "1");
5 request.setAttribute("x4", "0");
6 %>
7
8 ${not x1} <!-- rsultat de lvaluation : "false" -->
9
10${not x2} <!-- rsultat de lvaluation : "true" -->
${not x3} <!-- rsultat de lvaluation : "true" -->
11${not x4} <!-- rsultat de lvaluation : "true" -->
12
13${not x5} <!-- rsultat de lvaluation : "true" -->
14
15${not null} <!-- rsultat de lvaluation : "true" -->
16

3.4) Loprateur ternaire "? :" (COND ? STMT1 : STMT2)

L'oprateur ternaire utilise une expression conditionnelle, qui retourne true ou false, pour
dterminer lexpression excuter.
Loprateur est quivalemment une instruction if...else : if(COND) STMT1; else STMT2;
1<%
2request.setAttribute("attr0", 4);
3%>
4
5${( attr0 mod 2 eq 0) ? "EVEN NUMBER" : "ODD NUMBER"}

3.5) Loprateur empty

Lapplication de loprateur empty est value vraie si loprande est null, loprande est
une chane de caractres vide, loprande est une variable non dfinie, ou loprande est une
variable dont la valeur est null.
Lvaluation est aussi vraie si loprande est un tableau vide ou une collection vide.
Autrement lvaluation est fausse.
Exemples :
1
2 <%
3 request.setAttribute("y1", "");
4 request.setAttribute("y2", null);
request.setAttribute("y3", new int[0]);
5 request.setAttribute("y4", new Integer[0]);
6 request.setAttribute("y5", new ArrayList());
7 %>
8
9 ${empty y1} <!-- rsultat de lvaluation : "true" -->
10${empty y2} <!-- rsultat de lvaluation : "true" -->
11
${empty y3} <!-- rsultat de lvaluation : "false" -->
12
13${empty y4} <!-- rsultat de lvaluation : "true" -->
14${empty y5} <!-- rsultat de lvaluation : "true" -->
15
16${empty y6} <!-- rsultat de lvaluation : "true" -->
17
18${empty null} <!-- rsultat de lvaluation : "true" -->
19

3.6) Les oprateurs daccs "." et "[]"

les oprateurs "." et "[]" permettent daccder aux proprits dun objet bean et aux lments
dun tableau ou dune collection de type List ou Map.

Accder aux proprits dun objet bean :


Les proprits correspondent aux mthodes "getter" qui respectent la spcification de
nommage des proprits JavaBeans (les mthodes retournent une valeur et nont pas
de paramtres).
Pour accder aux proprits on spcifi le nom de la mthode sans le prfixe "get".

Loprateur "." peut tre utilis pour accder aux proprits du bean
${REFERENCE_NAME.PROPERTY_NAME}.

De mme loprateur "[]" peut tre utilis pour accder aux proprits du bean : le
nom de la proprit est spcifi entre deux crochets.
Le nom de la proprit peut tre mis soit entre deux quottes doubles
${REFERENCE_NAME["PROPERTY_NAME"]} ou deux quottes simples
${REFERENCE_NAME["PROPERTY_NAME"]}.

1 <%!
public class MyClass {
2 public Integer getProp1() {
3 return 50;
4 }
5
6 public MyClass getInstance() {
return new MyClass();
7 }
8 }
9 %>
10
11<%
MyClass myClass = new MyClass();
12request.setAttribute("attr0", myClass);
13%>
14
15${attr0.prop1} <!-- rsultat de lvaluation : "50" -->
16${attr0["prop1"]} <!-- rsultat de lvaluation : "50" -->
17
18
19

Si la valeur d'une proprit est un objet bean, alors il est possible dutiliser ces
oprateurs pour accder aux proprits du bean rfrenc :
- ${REFERENCE_NAME.PROPERTY_NAME1.PROPERTY_NAME2}
- ${REFERENCE_NAME["PROPERTY_NAME1"]["PROPERTY_NAME2"]}.

1${attr0.instance.prop1} <!-- rsultat de lvaluation : "50" -->


${attr0["instance"]["prop1"]} <!-- rsultat de lvaluation : "50" --
2>

Dans certains cas le nom de la proprit peut provenir dune variable ; par exemple le
nom dun paramtre ou attribut du scope REQUEST. Dans ce cas il est possible
dutiliser loprateur "[]" pour accder la proprit :

1<%
2request.setAttribute("v0", "prop1");
3%>
4
5${attr0[v0]} <!-- rsultat de lvaluation : "50" -->

Accder aux lments dun tableau :


Dclarer un tableau :

1<%
2String[] strArray = {"ABC", "DEF", "GHI"};
3%>

Accder aux lments du tableau :

1<%
2request.setAttribute("attr1", strArray);
3%>
4
5${attr1[0]} <!-- rsultat de lvaluation : "ABC" -->
6${attr1["1"]} <!-- rsultat de lvaluation : "DEF" -->

Accder aux lments du tableau en utilisant un indice variable :

1<%
2request.setAttribute("v1", 2);
3%>
4
${attr1[v1]} <!-- rsultat de lvaluation : "GHI" -->
5

Accder aux lments dune List :


Dclarer une liste :

1<%
2List strLIst = new ArrayList(3);
3
4strLIst.add("ABC");
5strLIst.add("DEF");
6strLIst.add("GHI");
%>
7

Accder aux lments de la liste :

1<%
2request.setAttribute("attr2", strLIst);
3%>
4
5${attr2[0]} <!-- rsultat de lvaluation : "ABC" -->
6${attr2["1"]} <!-- rsultat de lvaluation : "DEF" -->

Accder aux lments de la liste en utilisant un indice variable :

1<%
2request.setAttribute("v2", 2);
3%>
4
5${attr2[v2]} <!-- rsultat de lvaluation : "GHI" -->

Accder aux lments dune Map :


Dclarer une Map :

1<%
2Map strMap = new HashMap();
3
4strMap.put("A", "ABC");
5strMap.put("D", "DEF");
6strMap.put("G", "GHI");
%>
7

Accder aux lments de la Map :

1<%
request.setAttribute("attr3", strMap);
2%>
3
4${attr3["A"]} <!-- rsultat de lvaluation : "ABC" -->
5${attr3.D} <!-- rsultat de lvaluation : "DEF" -->
6

Accder aux lments de la Map en utilisant un indice variable :

1<%
2request.setAttribute("v3", "G");
3%>
4
5${attr3[v3]} <!-- rsultat de lvaluation : "GHI" -->

3.7) Prcdence des oprateurs

Si plusieurs oprateurs sont utiliss sans les parenthses alors la priorit des oprateurs est
rsolue selon lordre prsent ici-bas.
Si des oprateurs sont situs au mme niveau alors la priorit sapplique de droite gauche.

1. [] .

2. ()

3. - (oprateur unaire : changement de signe) not ! empty

4. * / div % mod

5. + - (oprateur binaire : soustraction)

6. < > <= >= lt gt le ge

7. == != eq ne

8. && and
9. || or

10. ? :

4. Objets implicites
EL offre des variables qui rfrencent des objets implicites.
1 +------------------+-----------------------------------------------------
2 ---------------------------------+---------------------------------------
------------------+
3 | Objet |
4 Description
5 | quivalent en JSP |
6 +------------------+-----------------------------------------------------
7 ---------------------------------+---------------------------------------
------------------+
8 | pageContext | Instance de PageContext de la page
9 JSP | objet implicite
1 pageContext |
0 +------------------+-----------------------------------------------------
---------------------------------+---------------------------------------
1 ------------------+
1 | pageScope | Un objet Map des attributs du scope
1 PAGE |
2 pageContext.getAttribute(PAGE_SCOPE) |
+------------------+-----------------------------------------------------
1
---------------------------------+---------------------------------------
3 ------------------+
1 | requestScope | Un objet Map des attributs du scope
4 REQUEST |
1 request.getAttribute() |
+------------------+-----------------------------------------------------
5 ---------------------------------+---------------------------------------
1 ------------------+
6 | sessionScope | Un objet Map des attributs du scope
1 SESSION |
7 session.getAttribute() |
+------------------+-----------------------------------------------------
1 ---------------------------------+---------------------------------------
8 ------------------+
1 | applicationScope | Un objet Map des attributs du scope
9 APPLICATION |
application.getAttribute() |
2 +------------------+-----------------------------------------------------
0 ---------------------------------+---------------------------------------
2 ------------------+
1 | param | Un objet Map des paramtres de la requte http
2 (premire valeur de chaque paramtre) |
request.getParameter() |
2 +------------------+-----------------------------------------------------
2 ---------------------------------+---------------------------------------
3 ------------------+
2 | paramValues | Un objet Map des paramtres de la requte http
4 (toutes les valeurs des paramtres) |
request.getParameterValues() |
2 +------------------+-----------------------------------------------------
5 ---------------------------------+---------------------------------------
------------------+
| initParam | Un objet Map des paramtresd'initialisation de
l'application (ServletContext) |
config.getServletContext().getInitParameter() |
+------------------+-----------------------------------------------------
---------------------------------+---------------------------------------
------------------+
| header | Un objet Map des paramtres de la requte http
(premire valeur de chaque entte) |
request.getHeader() |
+------------------+-----------------------------------------------------
---------------------------------+---------------------------------------
------------------+
| headerValues | Un objet Map des paramtres de la requte http
(toutes les valeurs des enttes) |
request.getHeaders() |
+------------------+-----------------------------------------------------
---------------------------------+---------------------------------------
------------------+
| cookie | Un objet Map des cookies de la requte
http |
request.getCookies() |
+------------------+-----------------------------------------------------
---------------------------------+---------------------------------------
------------------+

4.1) Lobjet "pageContext"

La variable "pageContext" peut tre utilise pour accder aux proprits de l'instance
PageContext de la page JSP.
Les rgles pour accder aux proprits de l'objet sont celles vues avec les operateurs "." et "[]"
pour accder aux proprits dun objet bean s'appliquent aussi pour cette variables.
Donc toutes les mthodes de la classe PageContext qui respectent la nomenclature JavaBeans
sont accessibles.
Par exemple, la classe PageContext dclare la mthode getRequest() qui retourne un objet
de type ServletRequest qui lui-mme dclare la mthode getServerName().
Cette mthode est accessible comme suit :
pageContext.getRequest().getServerName():
1${pageContext.request.serverName}

4.2) Les objets "pageScope", "requestScope", "sessionScope",


"applicationScope"

Ces variables rfrencent des objets, de type Map, qui donnent accs aux attributs des scopes
"PAGE", "REQUEST", "SESSION", et "APPLICATION".
1${requestScope.attr0}
Note : Comme ces objets sont de type Map, donc les mme rgles, vues pour les operateurs
"." et "[]" pour accder aux lments d'une Map, s'appliquent aussi pour ces variables.
1${sessionScope["attr0"]["attr1"]}
Note : Il est possible d'accder aux attributs de ces 4 scopes sans expliciter le scope, par
exemple ${attr0}, dans ce cas la recherche est faite en utilisant la fonction "findAttribute"
de la classe "PageContext" ${PageContext.findAttribute("attr0") qui va chercher
lattribut dans ces 4 scopes.

4.3) Les objets "param", "paramValues"

Ces variables rfrencent des objets, de type Map, qui donnent accs aux paramtres de la
requte http.
La variable "param" peut tre utilise pour lire la valeur d'un paramtre.
La variable "paramValues" reprsente chaque paramtre par un tableau qui contient toutes les
valeurs du paramtre, cela est utile pour lire les valeurs dun paramtre qui a plusieurs
valeurs.
Si la variable "param" est utilise avec un paramtre plusieurs valeur, alors la valeur lue est
celle du premier lment du tableau du paramtre rfrenc par la variable "paramValues".
1${param.myparam1}
2
3${paramValues.myparam2[1]}
4${paramValues.myparam2[2]}
Note : Comme ces objets sont de type Map, donc les mme rgles, vues pour les operateurs
"." et "[]" pour accder aux lments d'une Map, s'appliquent aussi pour ces variables.

4.4) Lobjet "initParam"

Cette variable donne accs aux paramtres d'initialisation de l'application (ServletContext).


1${initParam.myinitparam1}
Note : Comme cet objet est de type Map, donc les mme rgles, vues pour les operateurs "."
et "[]" pour accder aux lments d'une Map, s'appliquent aussi pour cette variable.

4.5) Les objets "header", "headerValues"

Ces variables rfrencent des objets, de type Map, qui donnent accs aux enttes de la requte
http.
La variable "header" peut tre utilise pour lire la valeur d'un entte.
La variable "headerValues" reprsente chaque entte par un tableau qui contient toutes les
valeurs de l'entte, cela est utile pour lire les valeurs dun entte qui a plusieurs valeurs.
Si la variable "header" est utilise avec un entte plusieurs valeur, alors la valeur lue est
celle du premier lment du tableau de l'entte rfrenc par la variable "headerValues".
1${header.myheader1}
2
3${headerValues.myheader2[1]}
Note : Comme ces objets sont de type Map, donc les mme rgles, vues pour les operateurs
"." et "[]" pour accder aux lments d'une Map, s'appliquent aussi pour ces variables.

4.6) Lobjet "cookie"

Cette variable donne accs aux paramtres des cookies de la requte http.
1${cookie.mycookieparam1}
Note : Comme cet objet est de type Map, donc les mme rgles, vues pour les operateurs "."
et "[]" pour accder aux lments d'une Map, s'appliquent aussi pour cette variable.