JSP——EL表达式
2016-07-07 16:06
495 查看
1.什么是EL表达式
EL全名为Expression Language,它主要用于替换JSP页面中的脚本表达式<%= %>,从各种类型的Web域中检索Java对象、获取数据。它可以很方便地访问JavaBean属性,访问数组,访问List集合和Map集合等。
EL表达式借鉴了JavaScript多类型转换无关性的特点,在使用EL从scope中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。Web服务器对于request域中的属性是以Object类型来存储的,在得到该属性时使用的Java语言脚本就应该是
(Object)request.getAttribute("xxx"),它对于实际应用还必须进行强制类型转换。而EL就将用户从这种类型转换的繁琐工作脱离出来,允许用户直接使用EL表达式取得的值,而不用关心它是什么类型的。
【注意】EL表达式是JSP2.0规范中的一门技术,所以,要想正确解析EL表达式,需要使用支持Servlet2.4/JSP2.0技术的WEB服务器。Tomcat6以上的服务器都可以解析EL表达式。
2.EL表达式语法
2.1 语法结构
${requestScope.user.age}
所有的EL都是这么写的:
${***},上述例子的意思是从request域对象中,取得user这个对象的年龄。如果我们不使用EL表达式,而是采用JSP Scriptlet的写法,那么应该如下:
User user = (User)request.getAttribute("user"); int age = user.getAge();
可以看到,不使用EL表达式,我们需要从request域中取出,再进行类型转换,非常麻烦。EL表达式简化了这些步骤,更加方便和简洁。
2.2 []
和.
运算符
EL提供[]和
.两种运算符来导航数据。如下例:
${requestScope.user.sex}
${requestScope.user["sex"]}
这两者是等价的。如何使用这两种方法需要知道以下三点:
(1)
[]和
.可以同时混合使用
假设request域对象中放了一个User类的数组,我们使用EL表达式获取到了第2个人的年龄:
<% User user1 = new User("小明",18); User user2 = new User("小亮",17); User user3 = new User("小红",20); User[] users = new User[]{user1,user2,user3}; request.setAttribute("users", users); %> ${requestScope.users[1].age}
(2)当要存取的属性名称中包含一些特殊字符,比如点号
.或者横杠
-等非字母或数字的符号,就必须要使用
[]
比如,
${user.my-age}这种用法不正确,应当使用
${user["my-age"]}
(3)使用
[]可以动态获取数据
比如:
${requestScope.user[data]}
此时,data是一个变量,假如data=”age”,那么上述语句就等价于
${requestScope.user.age},假如data=”name”,它就等价于
${requestScope.user.name}.
因此,要动态取值时,就要使用
[]来做,使用点号
.无法做到。
3.隐式对象
JSP本身定义了9个内置对象。而EL表达式也定义了11个隐式对象,使用这些隐式对象可以很方便地获取Web开发中的一些常见对象,并读取这些对象的数据。比如,在上文中我们已经使用了requestScope这个隐式对象。所有的隐式对象如下:隐含对象 | 说明 |
---|---|
pageScope | 代表page域,可以用来获取page域中的属性 |
reqeustScope | 代表reqeust域,可以用来获取reqeust域中的属性 |
sessionScope | 代表session域,可以用来获取session域中的属性 |
applicationScope | 代表application域,可以用来获取application域中的属性 |
pageContext | 代表pageContext对象,注意和pageScope进行区分 |
param | 代表请求参数组成的map集合${param.username},如同 request.getParameter(String name)。回传String类型的值 |
paramValues | 代表请求参数组成的map集合,但是此集合的value是String[],用来获取一个多值的param.如同request.getParameterValues(String name)。回传String[]类型的值 |
header | 获取所有HTTP请求字段的map对象。如同request.getHeader(String name)。回传String类型的值 |
headerValues | 同上,获取请求头组成的map,但是value是一个String[]。如同request.getHeaders(String name)。回传String[]类型的值 |
cookie | 获取cookie组成的map对象,此map的值是一个cookie对象,${cookie.cookieName.value}返回cookie的值 |
initParam | 以map封装的web.xml中配置的整个web应用的初始化参数。如同ServletContext.getInitParameter(String name)。回传String类型的值 |
3.1 属性(Attribute)与范围(Scope)
与范围有关的EL隐式对象有四个,分别是:pageScope,
requestScope,
sessionScope和
applicationScope,它们和JSP中的
pageContext,
request,
session和
application一样。不过要注意的是,这四个隐式对象只能用来取得范围属性值,即JSP中的
getAttribute(String name),却不能取得其他相关信息,比如它不能获取请求参数。
举例,比如我们在request中放入一个属性,名称为name,在JSP中使用
request.getAttribute("name")来取得name的值,但是在EL中,则是使用
${requestScope.name}来取得其值。
【注意】如果不写范围,直接获取name,
${name},那么EL会先去pageScope中找,再去requestScope,sessionScope和applicationScope中找,直到找到这个属性,如果没有找到,则不返回任何值,但是不会报错。
3.2 param和paramValues
在取得用户参数时,通常使用的是:request.getParameter(String name); request.getParameterValues(String name);
在EL中,则可以使用param和paramValues两者来取得数据。
${param.name} ${paramValues.name}
3.3 pageContext
我们可以使用${pageContext}来取得其他有关用户要求或页面的详细信息。比较常用的如下:
表达式 | 说明 |
---|---|
${pageContext.request.queryString} | 取得请求的参数字符串 |
${pageContext.request.requestURL} | 取得请求的URL,但不包括请求之参数字符串 |
${pageContext.request.method} | 取得HTTP的方法(GET、POST) |
${pageContext.request.protocol} | 取得使用的协议(HTTP/1.1、HTTP/1.0) |
${pageContext.request.remoteAddr} | 取得用户的IP地址 |
${pageContext.session.id} | 取得session的ID |
4.EL算术运算
EL支持算术运算,下表是它所支持的算术运算符:操作符 | 说明 |
---|---|
+ | 数学运算符,加操作 |
- | 数学运算符,减操作,或者对一个值取反 |
* | 数学运算符,乘操作 |
/或者div | 数学运算符,除操作 |
%或者mod | 数学运算符,取余操作 |
${1.2+90} ${(requestScope.index + 30)*2}
5.EL关系运算
EL中的关系运算符如下:运算符 | 说明 | 举例 |
---|---|---|
== 或 eq | 判断符号左右两端是否相等,如果相等返回 true ,否则返回 false | ${5 == 5}或者 ${5 eq 5} |
!= 或 ne | 判断符号左右两端是否不相等,如果不相等返回 true ,否则返回 false | ${5 != 5}或者 ${5 ne 5} |
< 或 lt | 判断符号左边是否小于右边,如果小于返回 true ,否则返回 false | ${3 < 5}或者 ${3 lt 5} |
>或 gt | 判断符号左边是否大于右边,如果大于返回 true ,否则返回 false | ${3 > 5}或者 ${3 gt 5} |
<=或 le | 判断符号左边是否小于或者等于右边,如果小于或者等于返回 true ,否则返回 false | ${3 <= 5}或者 ${3 le 5} |
>=或 ge | 判断符号左边是否大于或者等于右边,如果大于或者等于返回 true ,否则返回 false | ${3 >= 5}或者 ${3 ge 5} |
${param.index1} == ${param.indexs}
而应该写成:
${param.index1 == param.index2}
6.EL逻辑运算
运算符 | 说明 |
---|---|
&& 或 and | 与操作赋。如果左右两边同为 true 返回 true ,否则返回 false |
\\(双竖线,非斜线)或 or | 或操作赋。如果左右两边有任何一边为 true 返回 true ,否则返回 false |
! 或 not | 非操作赋。如果对 true 取运算返回 false ,否则返回 true |
(1)EL中也支持三目运算符:
${A?B:C}
(2)Empty运算符
用来对一个空变量值进行判断 : null 、一个空 String 、空数组、 空 Map 、没有条目的 Collection 集合
${empty var}
相关文章推荐
- html5 javascript 小型计算器
- JS正则表达式-test()方法的使用
- 【推荐】代码高亮JS框架之HelloWorld
- javascript代理模式(proxy)
- 实现JavaScript 的Math.round,Math.ceil,Math.floor函数功能 CodeWars 打怪日记
- 调用百度地图api (javascript)
- js操作数组
- JavaScript中判断对象类型的种种方法
- BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)
- javascript 基础篇
- 深入浅出zeptojs中tap事件
- 介绍Json
- JS不间断横/纵向滚动
- js 身份证号码验证、邮箱校验
- 对json数据进行排序
- 计算当前时间的到晚上00:00:00的相差时间
- JS中的prototype属性实现继承
- ACE.js自定义提示实现方法
- Servlet的相对路径与绝对路径的详解
- js笔记--事件