一、什么是EL表达式
1、Expression Language表达式语言
2、是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
语法格式:${expression }
二、EL中的基础操作符
| 操作符 | 描述 |
|---|---|
| . | 访问一个Bean属性或者一个映射条目 |
| [] | 访问一个数组或者链表的元素 |
| ( ) | 组织一个子表达式以改变优先级 |
| + | 加 |
| - | 减或负 |
| * | 乘 |
| / or div | 除 |
| % or mod | 取模 |
| == or eq | 测试是否相等 |
| != or ne | 测试是否不等 |
| < or lt | 测试是否小于 |
| > or gt | 测试是否大于 |
| <= or le | 测试是否小于等于 |
| >= or ge | 测试是否大于等于 |
| && or and | 测试逻辑与 |
| || or or | 测试逻辑或 |
| ! or not | 测试取反 |
| empty | 测试是否空值 |
三、EL中的内置对象
| 内置对象 | 描述 |
|---|---|
| pageScope | page 作用域 |
| requestScope | request 作用域 |
| sessionScope | session 作用域 |
| applicationScope | application 作用域 |
| param | Request 对象的参数,字符串 |
| paramValues | Request对象的参数,字符串集合 |
| header | HTTP 信息头,字符串 |
| headerValues | HTTP 信息头,字符串集合 |
| initParam | 上下文初始化参数 |
| cookie | Cookie值 |
| pageContext | 当前页面的pageContext |
四、EL从四大域中获取数据
1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
page<request<session<application
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
<%
pageContext.setAttribute("name","pageContext");
request.setAttribute("name","request");
session.setAttribute("name","session");
application.setAttribute("name","application");
%>
name=${name}
</body>
</html>

2、使用EL内置对象,从指定域中获取数据
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
<%
pageContext.setAttribute("name","pageContext");
request.setAttribute("name","request");
session.setAttribute("name","session");
application.setAttribute("name","application");
%>
pageName=${pageScope.name}<br>
requestName=${requestScope.name}<br>
sessionName=${sessionScope.name}<br>
applicationName=${applicationScope.name}
</body>
</html>

五、pageContext对象
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
${pageContext.request.contextPath}<br>
${pageContext.request.method}<br>
${pageContext.request.requestURL}<br>
</body>
</html>

六、param和paramValues对象
param和paramValues对象用来访问参数值,通过使用request.getParameter方法和request.getParameterValues方法。
param对象返回单一的字符串,而paramValues对象则返回一个字符串数组。
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form action="testEL.jsp" method="post">
用户名:<input name="username" type="text" /><br>
密码:<input name="password" type="password" /><br>
性别:<input name="sex" type="radio" value="男" />男
<input name="sex" type="radio" value="女"/>女<br>
爱好:<input name="hobby" type="checkbox" value="运动"/>运动
<input name="hobby" type="checkbox" value="阅读" />阅读
<input name="hobby" type="checkbox" value="音乐" />音乐
<input name="hobby" type="checkbox" value="其他"/>其他<br>
<input type="submit" value="登录"> <input type="reset" value="重置"><br>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
username=${param.username}<br>
sex=${param.sex}<br>
hobby= ${paramValues.hobby[0]} ${paramValues.hobby[1]}
</body>
</html>

七、header和headerValues对象
header和headerValues对象用来访问信息头,通过使用 request.getHeader方法和request.getHeaders方法
header对象返回单一值,而headerValues则返回一个字符串数组。
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
header=${header["user-agent"]}
</body>
</html>

八、initParam对象
获取初始化参数,其底层调用的是ServletContext.getInitParameter()
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>name</param-name> <param-value>zero-vic</param-value> </context-param> </web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>EL表达式</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
name=${initParam.name}
</body>
</html>

九、empty运算符
empty运算符用于检测一个值是否为null或者空
empty是前缀运算符其运算结果是布尔值
示例:${empty user?“zero”:user.name}
规则:
指向的对象为null或者为“”时,返回true
指向的集合或者数组长度为0时,返回true
指向的Map对象不存在、指定的key不存在、对应的value为空时,返回true
十、EL总结
EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
EL可以对数据进行自动类型转换
EL不会抛出空指针异常,只会不显示
EL不会抛出数组越界异常,只会不显示
EL可以单嵌套
EL中访问存在对象的不存在属性时会抛出propertNotFoundExpectation异常
EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)