第五章 EL表达式语言
EL全名为Expression Language。EL 是从JavaScript脚本语言得到启发的一种表达式语言,它借鉴了JavaScript多类型转换无关性的特点。在使用EL从scope中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。Web服务器对于request 请求参数通常会以String类型来发送,在得到时使用的Java语言脚本是Parameter(“参数名”),但是这样的话,对于实际应用还必须进行强制类型转换。而EL就将用户从这种类型转换的繁琐工作脱离出来,允许用户直接使用EL表达式取得的值,而不用关心它是什么类型。
5.1 EL特点
EL语言是JSTL输出(输入)一个JAVA表达式的表示形式。在JSTL中,EL 语言只能在属性值中使用。EL语言只能通过建立表达式${表达式}来进行调用。在属性值中使用表达式有三种方式。
(1) value属性包含一个表达式
<some:tag value="${expr}"/>
在这种情况下,表达式值被计算出来并根据类型转换规则赋值给value属性。比如:<c:out value="${参数名}" />中的${参数名}就是一个EL,它相当于JSP语句<%=Attribute(“参数名”)%>
或
<%=Attribute(“参数名”)%>
(2) value属性包含一个或多个属性,这些属性被文本分割或围绕
<some:tag value="some${expr1}${expr2}text${expr3}"/>
在这种情况下,表达式从左到右进行计算,并将结果转换为字符串型(根据类型转换规则),并将结果赋值给value属性
(3) value属性仅仅包含文本
<some:tag value="文本内容"/>
在这种情况下,字符串型属性value将根据类型转换规则转换为标签所希望的类型。
接下来更详细地来讨论一些情况,首先假设有一个EL表达式:
${var[“attribute”]}
●如果var为null时,表达式结果为null,不会产生NullPointerException异常。
●如果attribute为null,表达式结果为null。
●如果var是一个Map对象,表达式相当于(attribute),而var对象中没
• 2 •
ASP.NET简明教程
有attribute值得关键字则会返回null。
●如果var为List或Array对象,attribute必须为整数。若attribute不能计算成
整数,则会报错;否则表达式返回List或Array对应attribute值的位置的元
素。比如attribute=0,表达式返回List或Array的第一个元素。若attribute越
界,结果为null。
●如果var是JavaBean对象而attribute是一个var对象的可读属性,表达式返
回该属性的值。否则返回错误。
除了上面描述的内容外,EL还有以下一些特点:
1.EL表达式用${}表示,可用在所有的HTML和JSP标签中作用是代替JSP页
面中复杂的JA V A代码。
2.EL表达式可操作常量变量和隐式对象。最常用的隐式对象有${param}和
${paramValues}。${param}表示返回请求参数中单个字符串的值。
${paramValues}表示返回请求参数的一组值。pageScope表示页面范围的变量。
requestScope表示请求对象的变量。sessionScope表示会话范围内的变量。
applicationScope表示应用范围的变量。
3.<%@ page isELIgnored="true" %>表示是否禁用EL语言,TRUE表示禁止。
FALSE表示不禁止。JSP2.0中默认的启用EL语言。
4.EL语言可显示逻辑表达式如${true and false}结果是false ,关系表达式如
${7>1} 结果是true ,算术表达式如 ${2+2} 结果是4。
5.EL中的变量搜索范围是:page、request、session、application 。点运算符(。)
和"[ ]"都是表示获取变量的值。区别是[ ]可以显示非词类的变量
5.2 EL语法
下面我们就详细介绍一下EL的变量及作用范围、关键字、运算符以及优先级的划分。
5.2.1 EL变量及作用范围
在EL中,与隐式对象无关联的标识符被认为是存储在四个JSP作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符,其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查,然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法,可以将 EL 标识符看作引用限制了作用域的变量。
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username 的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围,假如
不到,再依序到Request、Session、Application范围。假如途中到username,就直接回传,不再继续下去,但是如果全部的范围都没有到时,就回传null。
第1章 ASP.NET概述• 3 •
EL将属性范围分为四个部分:
1.Page范围PageScope
2.Request范围RequestScope
3.Session范围SessionScope
4.Application范围ApplicationScope
EL自动搜索的顺序就按照从上到下进行查,当然,用户也可以指定要取出哪一
个范围的变量。例如:
${pageScope.username} 取出Page 范围的username 变量
${requestScope.username} 取出Request 范围的username 变量
${sessionScope.username} 取出Session 范围的username 变量
${applicationScope.username} 取出Application 范围的username 变量其中,pageScope、requestScope、sessionScope和applicationScope都是EL 的隐含
对象
5.2.2 EL关键字
如其他语言一样,JSP EL同样也有一些保留的关键字,这些关键字是不能表示其
它含义的。EL保留的关键字有16个,见表5-1所示。
表5-1 EL关键字
and gt true null or lt false empty eq ge instanceof div ne not le mod 5.2.3访问运算符“.”和“[ ]”
EL 提供“.”和“[ ]”两种运算符来存取数据。下列两者所代表的意思是一样的:${sessionScope.user.age}
等于
${sessionScope.user[“age"]}
“.”和“ [ ]”也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].value}
这个表达式的含义是回传结果为shoppingCart中第一项的value属性。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如“.”或“–”等并非字母或数字
的符号,就一定要使用 [ ],例如:
${user.My-Name }
上述是不正确的方式,应当改为:
${user["My-Name"] }
(2) 同时“[ ]”运算符比“.”更好的支持动态取值。如:${sessionScope.user[data]},
此时,data是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex}。
假若data 的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动
• 4 •
ASP.NET简明教程
态取值时,就可以用上述的方法来做,但“.”无法做到动态取值。
5.2.4算术运算
EL支持通用的算术运算,包括加(+)、减(-)、乘(*)、除(/)和模(%)运算。在EL中也可以使用div代表除法(/)运算,使用mod代表模(%)运算。
在表达式中同样可以使用括号来改变运算的优先顺序。例如:
${(x + y) * (m - n)}
也可以使用减号(-)来表示一个负数。而且在EL的除法中,如果除以0,返回值为无穷大(Infinity),而不是错误。EL中也有指数运算符(E)。
EL的算术运算符的优先顺序如下。
(1)括号:()
(2)负号:-
(3)乘、除、模:*、/(div)、%(mod)
(4)加、减:+、-
5.2.5 关系运算
EL支持关系运算,包括:等于(= =)、非等于(!=)、小于(<)、大于(>)、不大于(< =)、不小于(> =)等运算。在EL中也可以使用eq、ne、lt、ge、le和ge 分别表示上面的关系运算符。
EL关系表达式返回值为boolean值。例如表达式${x<7},当x小于7时返回true,否则返回false。
EL关系运算的优先顺序低于算术运算,其中关系运算符之间的优先顺序如下。
(1)<,>,<=,>=
(2)= =,!=
5.2.6 逻辑运算
EL支持的逻辑运算包括:与(&&)、或(| |)、非(!)等。在EL中可以使用and、or、not来代替上面的逻辑运算符。下面就是包含逻辑运算的表达式:
${x<7 && y >0 | | !z}
EL逻辑运算的优先顺序低于关系运算,其中逻辑运算符之间的优先顺序如下。
(1)!(not)
(2)&&(and)
(3)| |(or)
同样可以使用括号来改变运算的优先顺序。
5.2.7 empty运算符
EL中有一个特殊的运算符empty,如果操作数值为null返回true,或者操作数本身是一个空的容器、空的数组或长度为0的字符串等也返回true。空容器指的是不包含任何元素的容器。
第1章 ASP.NET 概述 • 5 •
5.2.8 自动类型转换
EL 支持自动类型转换。例如,如果一个JSP 页面需要处理request 对象中的属性attr ,以前的处理用代码表示如下:
String strAttr = (Attribute(“attr”); int attrInt = Interger.parseInt(strAttr);
attrInt = attrint + 1; 其中由于getAttribute()方法返回值的类型为Object ,如果要作为整数使用,需要在代码中进行转换。如果使用EL 表达式,可以直接下面的代码来完成类型自动转换: ${param.attr + 1}
EL 表达式中自动类型转换的规则如下。
(1)Object 转换为数值
● 如果Object 为boolean 类型,出错
● 如果Object= =null ,返回0
● 如果Object= =””,返回0
● 如果Object 为字符串,且字符串可以转换为数值,则返回数值,否则会出错
(2)Object 转换为String
● Object 为数值型数据时,依据其值直接转换字符串,如100.23转换为“100.23” ● 如果Object= =null ,返回长度为0的字符串:“”
● 如果String()产生异常,会出错,否则返回String()
5.2.9算术运算符的优先级
EL 运算符优先级如表5-2所示(自顶到底,从左到右)
表5-2 EL 运算符优先级 [] , .
()
unary - 、 not 、 ! 、 empty
* 、 / 、 div 、 % 、 mod
+ 、binary -
()、 <</code> 、 > 、 <= 、 >= 、 lt 、 gt 、 le 、 ge
== 、 != 、 eq 、 ne
el表达式获取session中的值&& 、 and
|| 、 or
5.3 EL 隐含对象
在EL 中有11个隐含对象,见表5-3所示。
表5-3 EL 隐含对象 变量名称 说明
• 6 •
ASP.NET简明教程
pageContext 一个javax.servlet.jsp.PageContext类的实例, 用来提供访问不同的请求数据param 一个包含所有请求参数的集合 (a java.util.Map),通过每个参数对应一个String 值的方式赋值
paramValues 一个包含所有请求参数的集合 (a java.util.Map),通过每个参数对应一个String 数组的方式赋值
header 一个包含所有请求的头信息的集合,(a java.util.Map) ,通过每个头信息对应一个String值的方式赋值
headerValues 一个包含所有请求的头信息的集合 (a java.util.Map) ,通过每个头信息的值都保存在一个String数组的方式赋值
cookie 一个包含所有请求的 cookie集合 (a java.util.Map),通过每一个cookie (javax.servlet.http.Cookie)对应一个cookie值的方式赋值initParam 一个包含所有应用程序初始化参数的集合(a java.util.Map) ,通过每个参数分别对应一个String值的方式赋值
pageScope 一个包含所有page scope范围的变量集合 (a java.util.Map)
requestScope 一个包含所有request scope范围的变量集合 (a java.util.Map)
sessionScope 一个包含所有session scope范围的变量集合 (a java.util.Map)
applicationScope 一个包含所有application scope范围的变量集合 (a java.util.Map) 5.3.1 pageCentext对象
PageContext对象引用当前页面的页面上下文对象 javax.servlet.ServletContex表示此JSP 的PageCon
text。在PageContext类中有request、response、session、out和servletContext属性及getRequest(),getResponse(),getSession(),getOut(),getServletContext()等方法。因此pageContext可以取得有关用户要求或页面的详细信息,见表5-4所示。
表5-4 pageContext方法及属性
格式说明
${quest.queryString} 取得请求的参数字符串
${questURL} 取得请求的URL,但不包括请求之参数字符串
${tPath} 服务的web application 的名称
${hod} 取得HTTP 的方法(GET、POST)
${quest.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${User} 取得用户名称
${Addr } 取得用户的IP 地址
${ationTime} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
下面的代码详细介绍了pageContext对象的属性。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="java.sun/jsp/jstl/core" %>
<html>
<head>
<title> pageContext对象 </title>
</head>
<body>
<h2>EL隐含对象 pageContext</h2>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论