EL 是 Expression Language 的简称,意思是表达式语言。它是JSP 2.0 中引入的一种计算和输出Java对象的简单语言,为不熟悉Java语言页面开发的人员提供了一种开发JSP应用程序的新途径。
使用EL表达式的前提条件
只要安装的Web服务器能够支持Servlet 2.4/JSP 2.0,就可以在JSP页面中直接使用EL表达式。
由于在JSP2.0以前不存在EL表达式,为了和以前的规范兼容,JSP特意提供了禁用EL表达式。为了保证页面能正常解析EL表达式,需要确认EL表达式没有被禁用。
JSP中提供了3种禁用EL表达式的方法,只有确认JSP中没有通过以下3种方法禁用EL表达式,才可以正确解析EL表达式,否则EL表达式的内容将原样显示到页面中。
- 使用斜杠“\”符号:即在$前加\ eg:\${username} 该方法适合只是禁用页面的一个或几个EL表达式的情况
- 使用JSP的page指令:<%@ page isELlgnored = "true|false" %> 如果值为true则忽略页面中的EL表达式,否则将解析页面中的EL表达式。该方法适用于禁用一个页面中的EL表达式
- 在web.xml文件中配置<el-lgnored>元素:该方法适用于禁用Web应用中所有的JSP页面。
配置代码如下:
1
2
3
4
5
6
|
< jsp-config > < jsp-property-group > < url-parttrn >
*.jsp</ url-pattern > < el-lgnored >true</ el-lgnored > <!--将此处设为false,表示使用EL表达式--> </ jsp-property-group > </ jsp-config > |
EL表达式的基本语法
EL表达式的语法很简单,它以"${”开头,以"}"结尾,中间为合法的表达式。即形如:${表达式}
在EL表达式要输出一个字符串,可以将此字符串放在一对单引号或双引号内。
EL表达式特点
- 在EL表达式中可以获取命名空间(PageContext 对象,它是页面中所有其他内置对象的最大范围的集成对象,通过它可以访问其他内置对象)。
- EL表达式不仅可以访问一般变量,而且可以访问JavaBean中的属性以及嵌套属性和集合对象。
- 在EL表达式中可以执行关系运算,逻辑运算和算术运算等。
- 扩展函数可以与Java类的静态方法进行映射。
- 在表达式中可以访问JSP的作用域(request,session,application和page)。
- EL表达式可以与JSTL结合使用,也可以与JavaScript语句结合使用。
EL表达式的存取范围
当EL表达式中的变量没有指定范围时,系统默认从page范围中查找,然后依次在request,session和application范围内查找。如果在此过程中找到指定变量,则直接返回,否则返回null。另外,EL表达式提供了指定存取范围的方法。在要输出表达式的前面加入指定存取范围的前缀即可指定该变量的存取范围。这里所说的前缀,实际上就是EL表达式提供的用于访问作用域的隐含对象。
范围 | 前缀 | 举例说明 |
---|---|---|
page | pageScope | 例如:${pageScope.username}表示在page范围内查找变量username,若找不到直接返回null |
request | requestScope | 例如:${requestScope.username}表示在request范围内查找变量username,若找不到直接返回null |
session | sessionScope | 例如:${sessionScope.username}表示在session范围内查找变量username,若找不到直接返回null |
application | applicationScope | 例如:${applicationScope.username}表示在application范围内查找变量username,若找不到直接返回null |
- 存取数据运算符:获取对象属性。
- 算术运算符
- 关系运算符
- 逻辑运算符
- empty运算符
- 条件运算符
存取数据运算符"[]"和"."
例如:${user.name}或者${user[name]}都是表示获取对象user的name属性值。通常情况下,获取指定对象的属性使用的是"."运算符。
但是当属性名中包含一些特殊符号(如 "." 或者"-"等非字母或者数字符号)时,就只能使用"[]"来访问属性值。
例如:${sessionScope.user[user-name]}是正确的,而${sessionScope.user.user-name}是错误的。
EL表达式中可以使用"[]"运算符来读取数组,Map,List或者对象中的数据。
- 数组元素的获取
- List集合元素的获取
- Map集合元素的获取
数组元素的获取
1
2
3
4
5
|
<% String[]
arrFruit={"苹果","西瓜","芒果","荔枝"};//定义数组 request.setAttribute("fruit",arrFruit);//将数组保存到request对象中 %> ${requestScope.fruit[1]} <!--输出数组中的第二个元素--> |
1
2
3
4
5
6
7
8
|
<% List
list=new ArrayList(); list.add("苹果"); list.add("西瓜"); list.add("芒果"); session.setAttribute("fruitList",list);//将List集合保存到session对象中 %> ${sessionScope.fruitList[1]} |
Map集合元素的获取
1
2
3
4
5
6
7
8
|
<% Map
map=new HashMap(); map.put("1","苹果"); map.put("2","西瓜"); map.put("3","芒果"); application.setAttribute("fruitMap",map);//将Map集合保存到application对象中 %> ${applicationScope.fruitMap[1]} |
算术运算符
运算符 | 功能 | 举例说明 |
---|---|---|
+ | 加 | ${6+1},返回值为7 |
- | 减 | ${7-1},返回值为6 |
* | 乘 | ${23.5*10},返回值为235.0 |
/或div | 除 | ${16/2}或${16 div 2},返回值为8.0 |
%或mod | 取余 | ${15%4}或者${15 mod 4},返回值为3 |
EL表达式无法像Java一样将两个字符串用"+"运算符连接在一起("明"+"日"),所以${"明"+"日"}的写法是错误的。但是,可以采用${"明"}${"日"}的形式来表示。
关系运算符
运算符 | 功能 | 举例说明 |
---|---|---|
=或eq | 等于 | ${10=10}或${10 eq 10},返回true ${"A"="a"}或${"A" eq "a"},返回false |
!=或ne | 不等于 | ${10!=10}或${10 ne 10},返回fasle ${"A"!="A"}或${"A" ne "A"},返回false |
<或lt | 小于 | ${5<3}或${5 lt 3},返回false ${"A"<"B"}或${"A" lt "B"},返回true |
>或gt | 大于 | ${5>3}或${5 gt 3},返回true ${"A">"B"}或${"A" gt "B"},返回false |
<=或le | 小于等于 | ${3<=4}或${3 le 4},返回true ${"A"<="A"}或${"A" le "A"},返回true |
>=或ge | 大于等于 | ${3>=4}或${3 ge 4},返回fasle ${"A">="B"}或${"A" ge "B"},返回false |
在使用EL表达式关系运算符时,不能写成如下形式:
${param.pwd1}==${param.pwd2}
或
${${param.pwd1}==${param.pwd2}}
而应写成
${param.pwd1==param.pwd2}
逻辑运算符
EL表达式提供了与,或,非3种逻辑运算符。
- "&&"或and运算符
- "||"或or运算符
- "!"或not运算符
"&&"或and运算符
"&&"或and运算符为与运算符,只有在两个操作数的值均为true时,才返回true,否则返回false。
${username =="mr" &&pwd =="mrsoft"}
与运算符在执行的过程中,只要表达式的值可以确定,就会停止执行。例如:进行多个与运算时,如果遇到其中一个操作数的值为false,则停止执行,并返回false。
"||"或or运算符
"||"或or运算符为或运算符,只要有一个操作数的值为true,就返回true,只有全部操作数均为false,才返回false。
${username =="mr" || pwd =="mrsoft"}
或运算符同与运算符一样,在执行过程中,只要表达式的值可以确定,就会停止执行,例如:进行多个或运算时,如果遇到其中一个操作数的值为true,则停止执行,并返回true。
"!"或not运算符
"!"或not运算符为非运算符,对操作数进行取反。如果原来操作数的值为true,则返回false。
${!username =="mr"}
empty运算符
该运算符是一个前缀(prefix)运算符。即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。
empty运算符格式如下:
${empty expression} expression:用于指定要判断的变量或对象。
一个变量或对象为null或空代表的是不同含义:null表示这个变量没有指明任何对象;而空表示这个变量所属的对象其内容为空,例如空字符串,空的数组或者空的List容器。
empty运算符也可以与not运算符结合使用,用于确定一个对象或变量是否为空。
empty运算符也可以与not运算符结合使用,用于确定一个对象或变量是否为空。
例如:判断session域中的变量user不为空,可以使用以下代码:
${not empty sessionScope.user}
条件运算符
语法格式如下:
${条件表达式?计算表达式1:计算表达式2}
如果条件为真,则计算表达式1,否则计算表达式2。
运算符的优先级
运算符的优先级
[] | 高
() |
-(负号) not ! empty |
* / div % and |
+(加号) -(减号) |
()<= >= lt gt le ge |
== != eq ne |
&& and |
|| or |
?: | 低
对于同级的运算符采用从左向右计算的原则。使用()可以改变优先级。
EL表达式中的保留字
and | eq | gt | true | instanceof | div | or | ne |
le | false | lt | empty | mod | not | ge | null |
EL表达式中的隐含对象
java.util.Map
隐含对象 | 对象类型 | 说明 | |
---|---|---|---|
页面上下文对象 | pageContext | java.servlet.jsp.PageContext | 用于访问JSP内置对象 |
param | java.util.Map | 包含页面所有参数的名称和对应值的集合 | |
paramValues | java.util.Map | 包含页面所有参数的名称和对应多个值的集合 | |
访问环境信息的隐含对象 | header | java.util.Map | 包含每个header名和值的集合 |
headerValues | java.util.Map | 包含每个header名和可能的多个值的集合 | |
cookie | java.util.Map | 包含每个cookie名和值的集合 | |
initParam | java.util.Map | 包含Servlet上下文初始参数名和对应值的集合 | |
pageScope | java.util.Map | 包含page(页面)范围内的属性值的集合 | |
访问作用域范围的隐含对象 | requestScope | java.util.Map | 包含request(请求)范围内的属性值的集合 |
sessionScope | java.util.Map | 包含session(会话)范围内的属性值的集合 | |
java.util.Map | 包含application(应用)范围内的属性值的集合 |
PageContext对象的应用
PageContext隐含对象用于访问JSP内置对象,如request,response,out,session,config和servletContext等。
例如,要获取当前session中的变量username可以使用以下EL表达式:
${PageContext.session.username}
param和paramValues对象的应用
param对象用于获取请求参数的值,而如果一个参数名对应多个值时,则需要使用paramValues对象获取请求参数的值。在应用param对象时,返回的结果为字符串;在应用paramValues对象时,返回结果为数组。
例如:在JSP页面中放置一个名为user的文本框
<input name="user" type="text" id="user">
当表单提交后,要获取user文本框的值,可以使用下面EL表达式
${param.user}
如果user文本框可以输入中文,那么使用EL表达式输出其内容前,还需使用"request.setCharacterEncoding("GBK");"语句设置请求的编码GBK,否则将产生乱码。
例如:
<input name="affect" type="checkbox" id="affect" value="体育">体育
<input name="affect" type="checkbox" id="affect" value="美术">美术
<input name="affect" type="checkbox" id="affect" value="音乐">音乐
当表单提交后,要获取affect的值,可以使用以下EL表达式
爱好为:${paramValues.affect[0]}${paramValues.affect[1]}${paramValues.affect[2]}
在应用param或paramValues对象时,如果指定的参数不存在,则返回空的字符串,而不是null。
header和headerValues对象的应用
header对象用于获取HTTP请求的一个具体的header值,但是在某些情况下,可能存在同一个拥有多个不同的值,这时就必须使用headerValues对象。
例如:要获取HTTP请求的header的Host属性,可以使用以下EL表达式:
${header.host}或${header[host]}
输出结果: localhost:8080
要获取HTTP请求的header的Accept-Agent属性,则必须使用以下EL表达式:
${header["user-agent"]}
访问作用域范围的隐含对象
EL表达式中提供了4个用于访问作用域范围的隐含对象:pageScope,requestScope,sessionScope,applicationScope。
4个隐含对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。
${sessionScope.user}
cookie对象的应用
cookie对象用于访问由请求设置的cookie名称。如果在cookie中已经设定一个名为username的值,那么可以使用${cookie.username}来获取cookie对象;但是如果要获取cookie中的值,则需要使用cookie对象的value属性。
所谓的cookie是一个文本文件,它是以key,value的方法将用户会话信息记录在这个文本文件内,并将其暂时存放在客户端浏览器中。
例如:使用response对象设置一个请求有效的cookie对象,然后再使用EL表达式获取cookie对象的值。
<%Cookie cookie = new Cookie("user","mr");
response.addCookie(cookie);
%>
${cookie.user.value}
initParam对象的应用
initParam对象用于获取Web应用初始化参数的值。
例如:在Web应用的web.xml文件中设置一个初始化参数author,用于指定作者。
1
2
3
4
|
< context-param > < param-name >author</ param-name > < param-value >zoe</ param-value > </ context-param > |
应用EL表达式获取该参数
${initParam.author}