`

EL表达式

阅读更多
EL表达式
     EL全名为Expression Language,它原来是JSTL1.0为了方便存取数据所定义的语言。到了JSP2.0以后,EL正式纳入成为标准规范之一。只要是支持Servlet2.4/JSP2.0的Container,都可以在JSP网页中直接使用EL。
通过本章的学习,读者应该能够完成如下几个目标。
熟练掌握使用EL运算符
熟练掌握EL内置对象
熟练掌握使用EL存取器

1  EL运算符
     EL提供了多种运算符操作,比如算术运算符、关系运算符、逻辑运算符、验证运算符等。本节将对这些运算符进行详细的讲解。

1.1 算术运算符
  通过EL提供算术运算符,开发者可以非常方便的在JSP页面进行算术操作。而且使用算术运算符和Java的算术运算符非常相视,开发者能很熟练的使用这些算术运算符来进行开发,从而简化了页面代码量。
常用的算术运算符有加、减、乘、除、求余,如下表所示。

算术运算符 说明 示例 结果
+ 加 ${1 + 1} 2
- 减 ${1 - 1} 0
* 乘 ${1 * 2} 2
/或div 除 ${3 / 2} 1.5
%或mod 取余 ${3 % 2} 1

1.2 关系运算符
  关系运算符主要用来进行比较操作。EL提供了关系运算符,使开发者能很方便的在JSP页面进行比较操作。
常用的关系运算符有等于、不等于、小于、大于、小于或等于、大于或等于,如下表所示。

关系运算符 说明 示例 结果
= = 或 eq 等于 ${1 = = 1}或${1 eq 1} true
!= 或ne 不等于 ${1 != 1}或${1 ne 1} false
< 或 lt 小于 ${1 < 2}或${1 lt 1} true
> 或 gt 大于 ${1 > 2}或${1 gt 1} false
<= 或 le 小于或者等于 ${1 <= 2}或${1 le 1} true
>= 或 ge 大于或者等于 ${1 >= 2}或${1 ge 1} false

1.3 逻辑运算符
  逻辑运算符主要用来进行逻辑操作,如:交集、并集、非。EL提供了关系运算符,使开发者能很方便的在JSP页面进行逻辑操作。需要注意的是运算符两边的表达式必须是布尔类型的。

逻辑运算符 说明 示例 结果
&& 或 and 交集 ${A && B}或${A and B} 当A和B都为true时为true,其他情况为false
|| 或 or 并集 ${A || B}或${A or B} 当A和B都为false时为false,其他情况为true
! 或 not 非 ${!A} 或${not A} 当A为true时,为false 当A为false时,为true

1.4 条件运算符
  前面提到了大量的预算符,下面还将介绍一个可以节省大量代码的条件运算符。条件运算符的格式如下。
${A ? B : C}
如果A为true时,执行B代码;而如果A为false时,则执行C代码。

1.5 验证运算符
  EL提供了验证运算符empty,其对于验证数据特别有用。empty运算符采用单个表达式作为其变量即${empty input},并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为null的表达式被认为是空,如无元素的集合或数组。如果参数是对长度为零的String求值所得的结果,则empty 运算符也将返回 true。

1.6 括号运算符以及运算符的优先级
括号运算符主要用来改变运算的优先级,例如${(3+2)*8},执行结果为40。如果去掉括号,那么结果将为19。从而可以看出在括号中内容将会先执行。




低 从高到低
[] , .
()
-(负) 、 not 、 ! 、 empty
* 、 / 、 div 、 % 、 mod
+ 、-(减)
< 、 > 、 <= 、 >= 、 lt 、 gt 、 le 、 ge
== 、 != 、 eq 、 ne
&& 、 and
|| 、 or
${A ? B : C}

2 EL内置对象
  EL表达式非常简单,在前面已经介绍过EL的运算符。所有的EL表达式都是以“${”开始“}”为结尾的。如:“${applicationScope.user.userName}”。
如果按照以前的JSP Scriptlets的写法代码如下。
User user = (User)application.getAttribute(“user”);
String username = user.getUserName();

2.1 .与[ ]运算符
  EL通过.与[ ]运算符来存取数据。比如:
${applicationScope.user.userName}
等价于
${applicationScope.user[“userName”] }
.和[ ]也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传的结果为shoppingCart中第一项物品的价格。
接下来介绍两者的差异。

(1)如果存取的属性名称包含一些特殊的符号,如“.”或者是“-”等非字母或数字的符号时,就必须使用[ ],例如。
applicationScope.user.usert-Name
这样写是错误的,必须使用[ ],代码如下。
applicationScope.user[“user-Name”]
(2)如果使用变量来传入,那么也就只能使用[ ]。例如。
<%String data = “userName”;%>
${applicationScope.user[data]}
这样做的效果等于于上面代码。
${applicationScope.user.userName}

2.2 与储存有关的内置对象
前面几章介绍了JSP中有内置对象,同样在EL中也有自己的隐含对象。
首先介绍4个与存储范围有关的隐含对象,分别是applicationScope、sessionScope、requestScope、pageScope。这些隐含对象使用时来和JSP中的pageContext,request,session,application一样。但是这四个隐含对象只能用来取得某个范围的属性值。即JSP中的getAttribute(String name),不能取得其他的信息。比如在JSP中request对象除了能够存取属性外,还可以用来接受参数和表头信息等。
(1)applicationScope对象,用来取得application范围属性值。
(2)sessionScope对象,用来取得session范围属性值。
(3)requestScope对象,用来取得request范围属性值。
(4)pageScope对象,用来取得page范围属性值。
如果不指定范围,如使用${name}。其意思是去取某一范围中名称为name的属性。因为并没有指定哪一个属性范围的name,所以它的默认值会从page范围内找,如果找不到,再依次到request、session、application范围中找。如果没有找到就返回null。在网页中也就没有显示。

2.3 与输入有关的内置对象
    与输入有关的隐含对象有两个param和paramValues,用来取得用户的请求参数。在使用EL之前可以使用如下代码取得用户的请求参数。
request.getParameter(String name);
request.getParameterValues(name);
在使用EL时则可以使用param和paramValues两者来取得用户请求参数。其中使用param接收的参数只有一个值,而如果参数有几个值,就必须使用paramValues来接受参数。

2.4 cookie内置对象
    下面来介绍EL其他的隐含对象cookie、header、headerValues、iniParam、pageContext。
cookie以key-value(键值对)的形式存储在浏览器的缓存区内。EL中没有提供设定cookie的操作(这些操作一般都是后端开发者去做的),只能通过cookie对象设置cookie中的值。

2.5 header内置对象
     header储存用户浏览器和服务器用来沟通的数据。当用户浏览器请求服务器的页面时,会传送出一个记载信息的标头文件。而服务器端可以通过header或者headerValues来取得这些值。其中header用来取得同一标头名称只有一个值的信息,而headerValues用来取得同一标头名称拥有不同的值的信息。

2.6 initParam内置对象
     initParam可以取得在web站点中设置的环境参数(context)值。

03 <context-param>
04 <param-name>username</param-name>
05 <param-value>James</param-value>
06 </context-param>

2.7 pageContext内置对象
pageContext用来取得有关用户请求和页面的详细信息。

取得请求的参数字符串    ${pageContext.request.queryString}
取得请求URL                  ${pageContext.request.requestURL}
取得web应用名称           ${pageContext.request.contextPath}
取得HTTP请求方式(GET or POST)pageContext.request.method}
取得使用的协议              ${pageContext.request.protocol}
取得用户IP地址              ${pageContext.request.remoteAddr}
判断session是否为新     ${pageContext.session.new}
取得sessionID                ${pageContext.session.id}

3 EL存取器
      使用EL存取器(也称作导航)可以访问JavaBean、Map、对象数组和List等中的数据。EL对数据的访问比使用Scriptlets有着代码量少,易维护的特点。

使用存取器读取JavaBean中的数据
使用存取器读取Map中的数据
使用存取器读取数组中的数据
存取器复杂应用

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics