1.作用
让jsp书写起来更加的方便。简化在jsp中获取作用域或者请求数据的写法。也会搭配Jstl来进行使用。计算和输出Java对象。本质是在JSP脚本编制元素范围外使用运行时表达式的功能。
2.特点
语法简单,使用方便。举个例子
${sessionScope.user.sex}
(所有EL都是以${为起始、以}为结尾的。)上述EL范例的意思是:从Session的范围中,取得
用户的性别。假若依照之前JSP Scriptlet的写法如下:
User user =(User)session.getAttribute("user");
String sex =user.getSex( );
两者相比较之下,可以发现EL 的语法比传统JSP Scriptlet 更为方便、简洁。
3. .与 [ ] 运算符
EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}等于${sessionScope.user["sex"]}
总结来说在写法上 . 不需要用双引号括起变量名,而[]需要
. 和 [ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1)有特殊字符时使用[]
当要存取的属性名称中包含一些特殊字符,如“. ”或 “–” 等并非字母或数字的符号,就一定要使用 [ ],
例如:${user.CD.Name }
上述是不正确的方式,应当改为:${user["CD.Name"] }
(2). 无法做到动态取值,而[]可以做到动态取值。
我们来考虑下列情况:
${sessionScope.user[data]}
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};
假若data 的值为"name"时,它就等于${sessionScope.user.name}。
因此,如果要动态取值时,就可以用上述的方法来做,但. 无法做到动态取值。
3.应用[ ]运算符可以获取数组的指定元素,但用.运算符不可以
4.应用[ ]运算符可以获取Ust集合中的元素
5.应用‘”’运算符可以可以获取Map集合中的指定元素
4.EL的使用条件
5.EL的存取范围
pageContext、request、session、application四个对象中的数据,其他数据一概不理会
找到了则获取返回,找不到则什么都不做,也不报错 。默认查找顺序:
pageConext–>request—>session—>application。每次查找都是从小到大进行查找,找到了则获取,不再继续找了。找不到返回null.
6.通过EL访问数据
EL获取请求头数据和Cookie数据
请求头数据
${header}–>返回所有的请求头数据
${header[“键名”]}—>返回指定的键名的请求头数据
${hedaerValues[“键名”]}—>返回指定的键名(同键不同值)的值的数组。
获取Cookie数据
${cookie}—>返回存储了所有的cookie对象的map集合
${cookie.键名}---->返回指定的cookie对象
${cookie.键名 .name}—>返回指定的cookie对象存储的数据的键名。
${cookie.键名.value}—>返回指定的cookie对象存储的数据的值。
7.关系运算符
${逻辑表达式}:&& 与 || 非 ! 非 "? :" 条件运算
${算术表达式}:+,-,*,/
${关系表达式}:>,<,>=,==,!=,%
特殊:三目运算
注:
+表示加法运算,不表示字符链接。使用EL表达式进行字符链接会报错
8.EL隐含对象
隐含对象 | 类型 | 说明 |
PageContext | javax.servlet.ServletContext | 表示此JSP的PageContext |
PageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
RequestScope | java.util.Map | 取得Request范围的属性名称所对应的值 |
sessionScope | java.util.Map | 取得Session范围的属性名称所对应的值 |
applicationScope | java.util.Map | 取得Application范围的属性名称所对应的值 |
param | java.util.Map | 如同ServletRequest.getParameter(String name)。回传String类型的值 |
paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。回传String[]类型的值 |
header | java.util.Map | 如同ServletRequest.getHeader(String name)。回传String类型的值 |
headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。回传String[]类型的值 |
cookie | java.util.Map | 如同HttpServletRequest.getCookies() |
initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。回传String类型的值 |
不过有一点要注意的是如果你要用EL输出一个常量的话,字符串要加双引号,不然的话EL会默认把你认为的常量当做一个变量来处理,
这时如果这个变量在4个声明范围不存在的话会输出空,如果存在则输出该变量的值。