EL 表达式


EL 表达式


EL(Expression Language,表达式语言),是为了便于存取数据而定义的一种语言
JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,
这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式。
JSP2.0开始,不让再使用Java脚本,而是使用EL表达式和动态标签来替代Java脚本。
语法很简单:以“${”起始,以“}”终止
具体格式:${expression}
EL替代的是<%=…%>,也就是说,EL只能做输出,不能做设置

特点:

EL表达式,具有以下特点:
可以获得命名空间PageContext对象,它是页面中所有内置对象的最大范围的集成对象,通过它可以访问其他内置对象;
可以访问一般变量,还可以访问JavaBean类中的属性以及嵌套属性和集合对象;
可以执行关系、逻辑和算术等运算;
可以访问JSP的作用域,request、session、application以及page;
扩展函数可以与Java类的静态方法进行映射。

EL中的标识符:

EL表达式中的标识符可以由任意的大小写字母、数字和下划线组成
为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范:
不能以数字开头;
不能是EL中的保留字,如and、or、gt;
不能是EL隐式对象,如pageContext;
不能包含单引号(‘)、双引号(“)、减号(-)和正斜杠(/)等特殊字符。

EL中的变量:

EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上,具体示例如下所示:
在这里插入图片描述在上述示例中,product就是一个变量。EL表达式中的变量不用事先定义就可以直接使用,例如,表达式${product}就可以访问变量product的值。

EL表达式中的常量又称字面量,它是不能改变的数据。在EL表达式中包含多种常量
布尔常量 true和false
整型常量 Long.MIN_VALUE 和Long.MAX_VALUE之间
浮点数常量 Double.MIN_VALUE到Double.MAX_VALUE之间
字符串常量 用单引号或双引号引起来的一连串字符。转义符:反斜杠(\) 
Null常量 Null常量用于表示变量引用的对象为空,它只有一个值,用null表示。

普通方法获取值和EL获取值相比较

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	request.setAttribute("username", "zangsan");
	request.setAttribute("password", "123");
%>

	用户名:<%=request.getAttribute("username") %><br>
	密  码:<%=request.getAttribute("password") %><br>
	<hr/>
	使用EL 表达式:<br>
	用户名:${ username }<br>
	密  码:${ password }<br>
	

</body>
</html>

在这里插入图片描述

EL中的运算符:
1.点运算符(.)
EL表达式中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象、List集合、Array数组等,其语法格式如下:
在这里插入图片描述
在上述语法格式中,表达式${customer.name}中点运算符的作用就是访问customer对象中的name属性。

2.方括号运算符([])
EL表达式中的方括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”或“?”等并非字母或数字的符号,就只能使用方括号运算符来访问该属性,其语法格式如下:
在这里插入图片描述
需要注意的是,在访问对象的属性时,通常情况都会使用点运算符作为简单的写法,但实际上,方括号运算符比点运算符应用更加广泛。

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

3.算术运算符
EL表达式中的算术运算符用于对整数和浮点数的值进行算术运算。使用这些算术运算符可以非常方便地在JSP页面进行算术运算,并且可以简化页面的代码量。接下来通过表来列举EL表达式中所有的算术运算符。
在这里插入图片描述

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

4.比较运算符
EL表达式中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的运算符执行的结果都是布尔类型。接下来通过表来列举EL表达式中所有的比较运算符。
在这里插入图片描述

为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL表达式中通常使用括号内的表示方式,例如,使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如 $ {1lt 2},但后面如果有其他符号时则可以不加空格,例如${1lt(1+1)}。

5.逻辑运算符
EL表达式中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。接下来通过表来列举EL表达式中所有的逻辑运算符。
在这里插入图片描述

上表中,列出了EL表达式中的3种逻辑运算符,需要注意的是,在使用&&运算符时,如果有一个表达式结果为false,则结果必为false,在使用||运算符时,如果有一个表达式的结果为true,则结果必为true。

6.empty运算符

EL表达式中的empty运算符用于判断某个对象是否为null或””,结果为布尔类型,其基本的语法格式如下所示:
在这里插入图片描述
需要注意的是,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语句,其语法格式如下:
在这里插入图片描述

8.“( ) ”运算符

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

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


EL中隐式对象


在学习JSP技术时,提到过隐式对象的应用。在EL技术中,同样提供了隐式对象。EL中的隐式对象共有11个,具体如表所示。
在这里插入图片描述
1.pageContext对象
为了获取JSP页面的隐式对象,可以使用EL表达式中的pageContext隐式对象。pageContext隐式对象的示例代码如下:
在这里插入图片描述
在上述示例中,pageContext对象用于获取response对象中的characterEncoding属性。

<h3>IP地址:${pageContext.request.remoteAddr}</h3>
<h3>SESSION ID: ${pageContext.session.id}</h3>
<h3>是否是新session: ${pageContext.session.isNew()}</h3>

上面称之为——“反射机制”

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	session ID : <%=session.getId() %><br>
	EL表达式:<br>
	session ID : ${ pageContext.session.id }<br>    <!-- java的反射机制 -->
	IP地址 : ${ pageContext.request.remoteAddr }<br>
	contentType响应头信息 : ${ pageContext.response.contentType }<br>
	servlet注册名® : ${ pageContext.servletConfig.servletName }<br>
	项目发布路径 : ${ pageContext.request.contextPath }<br>

</body>
</html>

在这里插入图片描述

2.Web 域相关对象
在EL表达式中,为了获取指定域中的数据,即前面的 4种属性范围(page、request、session、application)中的属性内容,提供了pageScope、requestScope、sessionScope和applicationScope4个隐式对象,示例代码如下:
在这里插入图片描述

如果不指明何种属性范围,则将按照如下顺序查找:
page➡️request➡️session➡️application

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	request.setAttribute("info", "request属性范围");
	pageContext.setAttribute("info", "page属性范围");
	session.setAttribute("info", "session属性范围");
	application.setAttribute("info", "application属性范围");
%>

	<h3>request属性内容:${ requestScope.info }</h3><br>
	<h3>page属性内容:${ pageScope.info }</h3><br>
	<h3>session属性内容:${ sessionScope.info }</h3><br>
	<h3>application属性内容:${ applicationScope.info }</h3><br>
	表达式\${ info }的值为:${ info }<br>

</body>
</html>

在这里插入图片描述
3.param和paramValues对象
在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL表达式提供了param和paramValues两个隐式对象,这两个隐式对象专门用于获取客户端访问JSP页面时传递的请求参数。接下来针对这两个对象进行讲解,具体如下:
param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。param对象的语法格式比较简单,具体示例如下:在这里插入图片描述如果一个请求参数有多个值,可以使用paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用如下代码:
在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="text_el04.jsp" method="post">
	用户名:<input type="text" name="username"><br>
	兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
	   	 <input type="checkbox" name="inst" value="游泳">游泳
	   	 <input type="checkbox" name="inst" value="看书">看书<br>
	 <input type="submit" value="提交">
</form>

</body>
</html>

text_el04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<% request.setCharacterEncoding("utf-8"); %>
<h3>用户名:${ param.username }</h3><br>
<h3>兴趣1:${ paramValues.inst[0] }</h3><br>
<h3>兴趣2:${ paramValues.inst[1] }</h3><br>
<h3>兴趣3:${ paramValues.inst[2] }</h3><br>

</body>
</html>

在这里插入图片描述
在这里插入图片描述

4. initParam对象

web.xml文件中添加内容:

<context-param>
  <param-name>webSite</param-name>
  <param-value>www.weihaicollege.com</param-value>
  </context-param>
初始化参数webSite的值为: <br>
${initParam.webSite }

首先修改xml文件,在xml文件在添加下面代码:
在这里插入图片描述
再运行下面的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	init初始化参数webSite:${ initParam.webSite }

</body>
</html>

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	cookie对象的信息:<br>
	${ cookie.username }<br>
	cookie对象的名称和值:<br>
	${ cookie.username.name } = ${ cookie.username.value }<br>
	<% response.addCookie(new Cookie("username","shandong")); %>

</body>
</html>

在这里插入图片描述

上面的结果一开始没赋上值,是因为赋值语句的执行顺序在输出语句之后,所以一开始不显示,重新运行才会显示出来。

在这里插入图片描述

完全关闭浏览器之后再运行,cookie值才会发生变化。


EL表达式集合操作


1.List 集合

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	List<String> all = new ArrayList<String>();
	all.add("我骄傲");
	all.add("我高兴");
	all.add("www.weihai");
	request.setAttribute("allinfo", all);
%>

<%
	List<String> mylist = (ArrayList<String>)request.getAttribute("allinfo");
	int i = 1 ;
	for(String m : mylist){
		%><%=i %>个元素:<%=m %><br>
		<%
		i++;
	}
%>

	<h3>第一个元素:${allinfo[0]}</h3>
	<h3>第二个元素:${allinfo[1]}</h3>
	<h3>第三个元素:${allinfo[2]}</h3>
	

</body>
</html>

在这里插入图片描述

2.map 集合

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	
<%
	Map<String,String> map = new HashMap<String,String>();
	map.put("name", "刘德华");
	map.put("email", "www.sohu");
	request.setAttribute("info",map);
%>
	<h3>KEY 为name 的内容:${info["name"]}</h3>
	<h3>KEY 为email 的内容:${info["email"]}</h3>
		


</body>
</html>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值