介绍

全称Expression Language(表达式语言),是为了代替jsp页面中的表达式脚本进行数据的输出,因为EL表达式要比jsp表达式脚本简洁

新建动态web工程09_EL_JSTL,修改tomcat实例名、配置工程访问路径、热部署

<%--
Created by IntelliJ IDEA.
User: xurui
Date: 2021/10/7
Time: 12:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("key", "value");
%>
表达式脚本输出key的值:<%=request.getAttribute("key")%>
EL表达式输出key的值:${key}<br>
<%-- 当输出的值不存在时 --%>
表达式脚本输出key1的值:<%=request.getAttribute("key1")%>
EL表达式输出key1的值:${key1}
<%-- 表达式脚本输出为空串 --%>
表达式脚本输出key1的值:<%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%>
</body>
</html>

当输出的值不存在时,表达式脚本输出null,EL表达式输出为空,显然前者对用户不太友好

11-EL表达式_java

EL表达式搜索四个域的顺序

EL表达式主要是在jsp页面中输出域对象中的数据,当四个域中都有键key时,EL表达式按照四个域从小到大的顺序查找,找到就输出

11-EL表达式_请求参数_02

EL表达式输出复杂的Bean对象

package com.atguigu.pojo;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Person {

private String name;
private String[] phones;
private List<String> cities;
private Map<String, Object> map;

public Person() {
}

public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cities = cities;
this.map = map;
}

// 并没有age属性
public int getAge() {
return 18;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String[] getPhones() {
return phones;
}

public void setPhones(String[] phones) {
this.phones = phones;
}

public List<String> getCities() {
return cities;
}

public void setCities(List<String> cities) {
this.cities = cities;
}

public Map<String, Object> getMap() {
return map;
}

public void setMap(Map<String, Object> map) {
this.map = map;
}

@Override
public String toString() {
return "Person{" +
"name=" + name +
", phones=" + Arrays.toString(phones) +
", cities=" + cities +
", map=" + map +
'}';
}
}
<%@ page import="com.atguigu.pojo.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
Created by IntelliJ IDEA.
User: xurui
Date: 2021/10/7
Time: 17:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Person person = new Person();
person.setName("xx");
person.setPhones(new String[]{"18234544352","15489786756","17623499321"});

List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);

Map<String, Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);

pageContext.setAttribute("p", person);
%>
输出person:${p}<br>
输出person的name属性:${p.name}<br>
输出person的phones数组属性值:${p.phones[2]}<br>
输出person的List集合中的元素值:${p.cities}<br>
输出person的List集合中的某个元素值:${p.cities[2]}<br>
输出person的Map集合:${p.map}<br>
输出person的Map集合中某个key的值:${p.map.key3}<br>
<%-- Person类中没有age属性,p.age实际上是调用属性的get方法获取的值 --%>
输出person的age属性:${p.age}
</body>
</html>

11-EL表达式_ide_03

关系运算

11-EL表达式_ide_04

逻辑运算

11-EL表达式_el表达式_05

算术运算

11-EL表达式_请求参数_06

empty运算

用来判断一个数据是否为空,为空则输出true,否则输出false。这几种情况认为是空:值为null、值为空串、值是Object数组,但长度为0、list集合元素个数为0、map集合元素个数为0

11-EL表达式_ide_07

三元运算、点运算和中括号运算

${ 12 != 12 ? "ABC":"abc" }

之前的${p.phones[2]}就包含点运算和括号运算,点运算输出Bean对象中某个属性的值,中括号运算输出有序集合中某个元素的值且还能输出map集合中key里有特殊字符的key的value值,上面提到的运算符都是特殊字符

11-EL表达式_java_08

11个EL隐含对象的介绍

是EL表达式中定义的可以直接使用的对象。分别为

11-EL表达式_请求参数_09

pageScope、requestScope、sessionScope、applicationScope的示例

11-EL表达式_ide_10

11-EL表达式_html_11

变量之一pageContext演示

获取jsp中的九个内置对象,然后常用来获取协议、服务器ip、服务器端口、工程路径、请求方法、客户端ip、会话的id编号

<%--
Created by IntelliJ IDEA.
User: xurui
Date: 2021/10/8
Time: 1:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 使用表达式脚本,这些方法会返回请求的协议、服务器ip... --%>
<%=request.getScheme()%> <br>
<%=request.getServerName()%> <br>
<%=request.getServerPort()%> <br>
<%=request.getContextPath()%> <br>
<%=request.getMethod()%> <br>
<%=request.getRemoteHost()%> <br>
<%=session.getId()%> <br>

<%
pageContext.setAttribute("req", request);
%>
<%-- 获取到request对象后.cheme,实际上是调用该属性的get方法,即上面的那些get方法 --%>
1.协议:${ req.scheme } <br>
2.服务器ip:${ req.serverName} <br>
3.服务器端口:${ req.serverPort} <br>
4.工程路径:${ req.contextPath} <br>
5.请求方法:${ req.method} <br>
6.客户端ip:${ req.remoteHost} <br>
7.会话id:${ pageContext.session.id} <br>
</body>
</html>

11-EL表达式_ide_12

其他EL隐含对象示例

<%--
Created by IntelliJ IDEA.
User: xurui
Date: 2021/10/8
Time: 11:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
输出请求参数username的值:${ param.username } <br>
输出请求参数username的值:${ paramValues.username[0] } <br>
输出请求参数hobby的值:${ paramValues.hobby[0] } <br>
输出请求参数hobby的值:${ paramValues.hobby[1] } <br>
<hr>
输出请求头中user-agent的值:${ header['User-Agent'] } <br>
输出请求头中connection的值:${ header.Connection } <br>
输出请求头中user-agent的值:${ headerValues['User-Agent'][0] } <br>
<hr>
获取cookie的名称:${ cookie.JSESSIONID.name } <br>
获取cookie的值:${ cookie.JSESSIONID.value } <br>
<hr>
输出&lt;context-param&gt;url的值:${ initParam.url }
</body>
</html>

web.xml,重新部署生效

11-EL表达式_el表达式_13

11-EL表达式_ide_14