7-2-EL表达式

目录

前言

一、初识EL

案例:对比使用Java代码与EL表达式获取信息

二、EL中的标识符

三、EL中的保留字

四、EL中的变量

五、EL中的常量

六、EL中的运算符

七、EL隐式对象

  总结


前言

在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式。EL是Expression Language的缩写,它是一种简单的数据访问语言。


一、初识EL

EL表达式的语法非常简单,都是以“${”符号开始,以“}”符号结束的,具体格式如下:

${表达式}

案例:对比使用Java代码与EL表达式获取信息

二、EL中的标识符

在EL表达式中,经常需要使用一些符号来标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。EL表达式中的标识符可以由任意的大小写字母、数字和下划线组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范:

不能以数字开头;

不能是EL中的保留字,如and、or、gt;

不能是EL隐式对象,如pageContext;

不能包含单引号(')、双引号(")、减号(-)和正斜线等特殊字符。

三、EL中的保留字

保留字就是编程语言里事先定义好并赋予了特殊含义的单词,和其他语言一样,EL表达式中也定义了许多保留字,如false、not等,接下来就列举EL中所有的保留字,具体如下:

四、EL中的变量

EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上,具体示例如下所示:

${product} 

在上述示例中,product就是一个变量。EL表达式中的变量不用事先定义就可以直接使用,例如,表达式${product}就可以访问变量product的值。

五、EL中的常量

EL表达式中的常量又称字面量,它是不能改变的数据。在EL表达式中包含多种常量,接下来分别对这些常量进行介绍。

1.布尔常量 布尔常量用于区分一个事物的正反两面,它的值只有两个,分别是true和false。

2.整型常量 整型常量与Java中的十进制的整型常量相同,它的取值范围是Java语言中定义的常量Long.MIN_VALUE到Long.MAX_VALUE之间,即-2^{63}~2^{63}-1之间的整数。

3.浮点数常量 浮点数常量用整数部分加小数部分表示,也可以用指数形式表示,例如,1.2E4和1.2都是合法的浮点数常量。它的取值范围是Java语言中定义的常量Double.MIN_VALUE到Double.MAX_VALUE之间,即4.9E-324~1.8E308之间的整数。

4.字符串常量 字符串常量是用单引号或双引号引起来的一连串字符。由于字符串常量需要用单引号或双引号引起来,所以字符串本身包含的单引号或双引号需要用反斜杠(\)进行转义,即用“\'”表示字面意义上的单引号,用“\"”表示字面意义上的双引号。如果字符串本身包含反斜杠(\),也要进行转义,即用“\\”表示字面意义上的一个反斜杠。

需要注意的是,只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义,例如"ab'4c\"d5\\e"表示的字符串是ab'4c"d5\e。

5.Null常量 Null常量用于表示变量引用的对象为空,它只有一个值,用null表示。

六、EL中的运算符

EL表达式支持简单的运算,例如,加(+)、减(-)、乘(*)、除(/)等。为此,在EL中提供了多种运算符,根据运算方式的不同,EL中的运算符包括以下几种。

1.点运算符(.)

EL表达式中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象、List集合、Array数组等,其语法格式如下:

${customer.name}

在上述语法格式中,表达式${customer.name}中点运算符的作用就是访问customer对象中的name属性。

2.方括号运算符([])

EL表达式中的方括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”或“?”等并非字母或数字的符号,就只能使用方括号运算符来访问该属性,其语法格式如下:

${user[My-Name]}

需要注意的是,在访问对象的属性时,通常情况都会使用点运算符作为简单的写法,但实际上,方括号运算符比点运算符应用更加广泛。

接下来就对比一下这两种运算符在实际开发中的应用,具体如下:

点运算符和方括号运算符在某种情况下可以互换,如${student.name}等价于${student["name"]}。 方括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}用于访问集合或数组中第一个元素。在这种情况下,只能使用方括号运算符,而不能使用点运算符。 方括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].userName}可以访问集合或数组中的第一个元素的userName属性。

3.算术运算符

EL表达式中的算术运算符用于对整数和浮点数的值进行算术运算。使用这些算术运算符可以非常方便地在JSP页面进行算术运算,并且可以简化页面的代码量。

表中,列举了EL表达式中所有的算术运算符,这些运算符相对来说比较简单。在使用这些运算符时需要注意两个问题,“-”运算符即可以作为减号,也可以作为负号,“/”或“div”运算符在进行除法运算时,商为小数。

4.比较运算符

EL表达式中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的运算符执行的结果都是布尔类型。

 表中,列举了EL表达式中所有的比较运算符,在使用这些运算符时需要注意两个问题,具体如下: 比较运算符中的“==”是两个等号,千万不可只写一个等号。 为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL表达式中通常使用括号内的表示方式,例如,使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如${1lt 2},但后面如果有其他符号时则可以不加空格,例如${1lt(1+1)}。

5.逻辑运算符

EL表达式中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。

6.empty运算符

EL表达式中的empty运算符主要用于判断某个对象是否为null或””,结果为布尔类型,其基本的语法格式如下所示:

${empty var} 

需要注意的是,empty运算符可以判定变量(或表达式)是否为null或””。

例如,empty运算符的返回值为true:

        var变量不存在,即没有定义,例如表达式${empty name},如果不存在name变量,就返回true。

        var变量的值为null,例如表达式${empty customer.name},如果customer.name的值为null,就返回true。

        var变量引用集合(Set、Map和List)类型对象,并且在集合对象中不包含任何元素。

7.条件运算符

EL表达式中条件运算符用于执行某种条件判断,它类似于Java语言中的if-else语句,其语法格式如下:

${A?B:C}

在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B并返回B的值;如果表达式A的计算结果为false,就执行表达式C并返回C的值,例如表达式${(1==2)?3:4}的结果就为4。

8.“( ) ”运算符

EL表达式中的圆括号用于改变其他运算符的优先级,例如表达式${a*b+c},正常情况下会先计算a*b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为${a*(b+c)},这样则先计算b与c的和,再将计算的结果与a相乘。

 需要注意的是,EL表达式中的运算符都有不同的运算优先级,当EL表达式中包含多种运算符时,它们必须按照各自优先级的大小来进行运算。

表列举了不同运算符各自的优先级大小。对于初学者来说,这些运算符的优先级不必刻意的去记忆。为了防止产生歧义,建议读者尽量使用“()”运算符来实现想要的运算顺序。

注意: 在应用EL表达式取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。  

七、EL隐式对象

EL中的隐式对象共有11个,具体如表所示。

1.pageContext对象                                                                                                                            为了获取JSP页面的隐式对象,可以使用EL表达式中的pageContext隐式对象。pageContext隐式对象的示例代码如下: 

${pageContext.response.characterEncoding}

在上述示例中,pageContext对象用于获取response对象中的characterEncoding属性。

案例:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head></head>
<body>
	请求URI为:${pageContext.request.requestURI} <br />
	Content-Type响应头:${pageContext.response.contentType} <br /> 
	服务器信息为:${pageContext.servletContext.serverInfo} <br /> 
	Servlet注册名为:${pageContext.servletConfig.servletName} <br />
</body>
</html>

 需要注意的是,只有pageContext对象是EL和JSP所共有的隐式对象。

2.Web域相关对象

在Web开发中,PageContext、HttpServletRequest、HttpSession和ServletContext这四个对象之所以可以存储数据,是因为它们内部都定义了一个Map集合,这些Map集合是有一定作用范围的,例如,HttpServletRequest对象存储的数据只在当前请求中可以获取到。习惯性的,我们把这些Map集合称为域,这些Map集合所在的对象称为域对象。在EL表达式中,为了获取指定域中的数据,提供了pageScope、requestScope、sessionScope和applicationScope4个隐式对象。

需要注意的是,EL表达式只能在这4个作用域中获取数据。

案例:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head></head>
<body>
	<% pageContext.setAttribute("userName", "itcast"); %>
	<% request.setAttribute("bookName", "Java Web"); %>
	<% session.setAttribute("userName", "itheima"); %>
	<% application.setAttribute("bookName", "Java 基础"); %>
	表达式\${pageScope.userName}的值为:${pageScope.userName} <br /> 
	表达式\${requestScope.bookName}的值为:${requestScope.bookName} <br /> 
	表达式\${sessionScope.userName}的值为:${sessionScope.userName} <br />
	表达式\${applicationScope.bookName}的值为:${applicationScope.bookName} 
     <br /> 
	表达式\${userName}的值为:${userName}
</body>
</html>

需要注意的是,假如不指定查找域,那么在page、request、session、application域内依次查找。 

3.param和paramValues对象

在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL表达式提供了param和paramValues两个隐式对象,这两个隐式对象专门用于获取客户端访问JSP页面时传递的请求参数。

param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。

param对象的语法格式: 

${param.num}

如果一个请求参数有多个值,可以使用paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用如下代码:

${paramValues.num[0]}

案例:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head></head>
<body style="text-align: center;">
	<form action="${pageContext.request.contextPath}/param.jsp">
		num1:<input type="text" name="num1"><br /> 
		num2:<input type="text" name="num"><br /> 
		num3:<input type="text" name="num"><br /> <br />
		<input type="submit" value="提交" />&nbsp;&nbsp;
		<input type="submit" value="重置" />
		<hr>
		num1:${param.num1}<br />
		num2:${paramValues.num[0]}<br />
		num3:${paramValues.num[1]}<br />
	</form>
</body>
</html>

需要注意的是使用param返回请求参数的第一个值

4.cookie对象

在JSP开发中,经常需要获取客户端的Cookie信息,为此,在EL表达式中,提供了Cookie隐式对象,该对象是一个代表所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象,具体示例如下:

案例:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head></head>
<body>
	Cookie对象的信息:<br /> 
	${cookie.userName } <br /> 
	Cookie对象的名称和值:<br /> 
	${cookie.userName.name }=${cookie.userName.value }
	<% response.addCookie(new Cookie("userName", "itcast")); %>
</body>
</html>

 第一次访问不带cookie,第二次会带上cookie


  总结

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值