07. EL表达式
一、EL表达式
1.1、什么是EL表达式
??EL 表达式的全称是:Expression Language。它是表达式语言。EL 表达式的作用是:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
??EL 表达式的格式是:${表达式};EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
request.setAttribute("key","value");
%>
表达式脚本输出key的值是:<%= request.getAttribute("key") %>
EL表达式输出key的值是:${key}
表达式脚本输出key的值是:<%= request.getAttribute("key1") %>
EL表达式输出key的值是:${key1}
1.2、EL表达式搜索域数据的顺序
??EL 表达式主要是在 jsp 页面中输出数据。 主要是输出域对象中的数据。当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
${key}
1.3、EL表达式输出Bean对象
<%@ page import="star.light.el.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
Person person = new Person();
person.setName("Sakura");
person.setPhones(new String[]{"10086","10000","10010"});
List hobbyies = new ArrayList<>();
hobbyies.add("Unreal Engine");
hobbyies.add("Java");
hobbyies.add("Python");
hobbyies.add("Hormony");
hobbyies.add("STM32");
person.setHobby(hobbyies);
Map map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("p",person);
%>
输出Person:${p}
输出Person的name属性:${p.name}
输出Person的age属性:${p.age}
输出Person的数组具体的属性值:${p.phones[0]}
输出Person的List集合:${p.hobby}
输出Person的List集合中具体的元素值:${p.hobby[0]}
输出Person的Map集合:${p.map}
输出Person的Map集合中具体的元素值:${p.map.key1}
package star.light.el;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private int age;
private String[] phones;
private List hobby;
private Map map;
public Person() {
}
public Person(String name, int age, String[] phones, List hobby, Map map) {
this.name = name;
this.age = age;
this.phones = phones;
this.hobby = hobby;
this.map = map;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return 9;
}
public void setAge(int age) {
this.age = age;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
public List getHobby() {
return hobby;
}
public void setHobby(List hobby) {
this.hobby = hobby;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", phones=" + Arrays.toString(phones) +
", hobby=" + hobby +
", map=" + map +
'}';
}
}
在EL表达式中输出对象的属性是通过getXxx()来实现的
二、EL表达式进行运算
2.1、关系运算
关系运算符 | 说明 |
---|---|
== 或 eq | 等于 |
!= 或 ne | 不等于 |
< 或 lt | 小于 |
> 或 gt | 大于 |
<= 或 le | 小于等于 |
>= 或 ge | 大于等于 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
3 ==3:${3 == 5} 或 ${3 eq 5}
3 != 5:${3 != 5} 或 ${3 ne 5}
3 < 5:${3 < 5} 或 ${3 lt 5}
3 > 5:${3 > 5} 或 ${3 gt 5}
3 <= 5:${3 <= 5} 或 ${3 le 5}
3 >= 5:${3 >= 5} 或 ${3 ge 5}
2.2、逻辑运算
逻辑运算符 | 说明 | 结果 |
---|---|---|
&& 或 and | 与运算 | 只有运算符两边都为真,结果才为真;否则为假 |
|| 或 or | 或运算 | 只要运算符两边有一个为真,结果为真;否则结果为假 |
! 或 not | 取反运算 | 如果表达式为真,则运算结果为假;否则为真 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
(3 < 5) && (3 > 7):${(3 < 5) && (3 > 7)} 或 ${(3 lt 5) and (3 gt 7)}
(3 > 5) && (3 > 7):${(3 > 5) && (3 > 7)} 或 ${(3 gt 5) and (3 gt 7)}
(3 < 5) && (3 < 7):${(3 < 5) && (3 < 7)} 或 ${(3 lt 5) and (3 lt 7)}
(3 < 5) || (3 > 7):${(3 < 5) || (3 > 7)} 或 ${(3 lt 5) or (3 gt 7)}
(3 > 5) || (3 > 7):${(3 > 5) || (3 > 7)} 或 ${(3 gt 5) or (3 gt 7)}
(3 < 5) || (3 < 7):${(3 < 5) || (3 < 7)} 或 ${(3 lt 5) or (3 lt 7)}
!(3 == 5):${!(3 == 5)} 或 ${not(3 eq 5)}
!(3 != 5):${!(3 != 5)} 或 ${not(3 ne 5)}
2.3、算数运算符
算数运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ 或 div | 除法 |
% 或 mod | 取模 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
3 + 5:${3 + 5}
3 - 5:${3 - 5}
3 * 5:${3 * 5}
3 / 5:${3 / 5} 或 ${3 div 5}
3 % 5:${3 % 5} 或 ${3 mod 5}
2.4、empty运算
??empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。以下几种情况为空:
- 值为 null 值的时候,为空
- 值为空串的时候,为空
- 值是 Object 类型数组,长度为零的时候
- list 集合,元素个数为零
- map 集合,元素个数为零
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
//值为null值的时候
request.setAttribute("emptyNull",null);
//值为空串的时候
request.setAttribute("emptyStr","");
//值是Object类型数组,长度为零的时候
request.setAttribute("emptyArr",new Object[]{});
//list集合,元素个数为零
request.setAttribute("emptyList",new ArrayList<>());
//map集合,元素个数为零
request.setAttribute("emptyMap",new HashMap<>());
%>
${empty emptyNull}
${empty emptyStr}
${empty emptyArr}
${empty emptyList}
${empty emptyMap}
2.5、三元运算
??表达式 1?表达式 2:表达式 3 如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
3 == 5:${(3 == 5)?"true":"false"}
3 != 5:${(3 != 5)?"true":"false"}
2.6、“.”点运算 和 [] 中括号运算符
??.点运算,可以输出 Bean 对象中某个属性的值。 []中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
Map map = new HashMap<>();
map.put("aaa","value1");
map.put("a.a.a","value2");
map.put("a+a+a","value3");
request.setAttribute("map",map);
%>
${map}
${map.aaa}
${map["a.a.a"]}
${map['a+a+a']}
三、EL表达式的11个隐含对象
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map |
它可以获取 pageContext 域中的数据 |
requestScope | Map |
它可以获取 Request 域中的数据 |
sessionScope | Map |
它可以获取 Session 域中的数据 |
applicationScope | Map |
它可以获取 ServletContext 域中的数据 |
param | Map |
它可以获取请求参数的值 |
paramValues | Map |
它也可以获取请求参数的值,获取多个值的时候使用 |
header | Map |
它可以获取请求头的信息 |
headerValues | Map |
它可以获取请求头的信息,它可以获取多个值的情况 |
cookie | Map |
它可以获取当前请求的 Cookie 信息 |
initParam | Map |
它可以获取在 web.xml 中配置的 |
3.1、EL表达四获取四个特定域中的属性
- pageScope --->> pageContext 域
- requestScope --->> Request 域
- sessionScope --->> Session 域
- applicationScope --->> ServletContext 域
3.1.1、. pageContext对象的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%--
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
1. 协议:${pageContext.request.scheme}
2. 服务器 ip:${pageContext.request.serverName}
3. 服务器端口:${pageContext.request.serverPort}
4. 获取工程路径:${pageContext.request.contextPath}
5. 获取请求方法:${pageContext.request.method}
6. 获取客户端 ip 地址:${pageContext.request.remoteHost}
7. 获取会话的 id 编号:${pageContext.session.id}
3.2、EL表达式其他隐含对象的使用
- param Map
它可以获取请求参数的值 - paramValues Map
它也可以获取请求参数的值,获取多个值的时候使用 - header Map
它可以获取请求头的信息 - headerValues Map
它可以获取请求头的信息,它可以获取多个值的情况 - cookie Map
它可以获取当前请求的 Cookie 信息 - initParam Map
它可以获取在 web.xml 中配置的 上下文参数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%-- 请求地址:http://localhost:8080/el_expression/?username=sakura&username=kinomoto&password=27185 --%>
${param}
输出请求参数username的值:${param.username}
输出请求参数passwrod的值:${param.password}
${paramValues}
输出请求参数username的值:${paramValues.username[1]}
${header}
输出请求头【User-Agent】:${header['User-Agent']}
输出请求头【User-Agent】:${headerValues['User-Agent'][0]}
${cookie}
获取Cookie的名称:${cookie.JSESSIONID.name}
获取Cookie的值:${cookie.JSESSIONID.value}
${initParam}
输出<Context-param>username的值:${initParam.username}
输出<Context-param>password:${initParam.password}
??其中【web】下【WEB-INF】的【web.xml】的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
username
sakura
password
27185