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相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为
a∗b+c,正常情况下会先计算a∗b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为{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>