EL表达式
a)什么是EL表达式,EL表达式的作用?
EL表达式的是 expression language是表达式语言。
EL表达式有什么作用?EL表达式主要是替代jsp页面中的脚本在jsp页面中的输出。
因为EL表达式在输出数据时候,要比jsp的表达式脚本要简洁许多
EL表达式的格式是:${表达式}
EL表达式在输出null的时候,输出的是空串,jsp表达式脚本输出null值的时候,输出的是null字符串
b)EL表达式搜索域数据的顺序
EL表达式主要是在jsp页面中输出数据,主要是输出域对象中的数据,
当四个域中都有相同的key的值的域对象时候,EL表达式的按照四个域的从小到大的顺序进行搜索,找到就输出
pageContext—request----session—application
c)EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性
1.需求—输出Bean的普通属性,数组属性,List集合属性,map集合属性
c.jsp
<%@ page import="com.atguigu.pojo.person" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/14
Time: 20:43
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("赵宸");
person.setPhones(new String[]{"11111","22222","233421"});
ArrayList<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("广州");
cities.add("深圳");
person.setCities(cities);
Map<String,Object> map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
person.setMap(map);
pageContext.setAttribute("person",person);
%>
输出person,${ person }<br/> <%--输出person,com.atguigu.pojo.person@75d18fe4 输出的是对象--%>
输出person中的name属性:${person.name} <br/>
输出person的phones数组属性名:${person.phones[0]}<br/>
输出person的cities的集合值中的元素值${person.cities}<br/>
输出person的List的集合值中的个别元素值${person.cities[0]}<br/>
输出person中的map属性 ${person.map}<br/>
输出person中map集合中某个key的值${person.map.key1}<br/>
输出person中get方法返回值为18的age属性 ${person.age}<br/>
EL表达式在找属性的时候 找的是属性的get方法
</body>
</html>
person.java
package com.atguigu.pojo;
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;
private int age ;
public int getAge() {
return 18;
}
public void setAge(int age) {
this.age = age;
}
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;
}
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;
}
}
d)EL表达式—运算
1) 关系运算
关系运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | ${5 == 5} 或 ${5 eq 5} | true |
!= 或 ne | 不等于 | ${5 != 5} 或 ${5 ne 5} | false |
< 或 lt | 小于 | ${3<5} 或 ${3 lt 5} | true |
> 或 gt | 大于 | ${2 >10} 或 ${2 gt 10} | false |
<= 或 le | 小于等于 | ${5 >= 12} 或 ${5 le 12 } | true |
>= 或 ge | 大于等于 | ${3 >= 5 }或 ${3 ge 5 } | false |
2)逻辑运算
逻辑运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
&& 或 and | 与运算 | ${12 == 12 && 12<11} 或 ${12 == 12 and 12 <11} | false |
Ⅱ Ⅱ Ⅱ或 or | 或运算 | ${12 == 12 Ⅱ Ⅱ Ⅱ 12<11 }或 ${12 == 12 or 12 <11} | true |
! 或 not | 取反运算 | ${!true} 或 ${not ture} | false |
3)算术运算
算数运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加法 | ${12+18} | 30 |
- | 减法 | ${18 - 8} | 10 |
* | 乘法 | ${12*12} | 144 |
/ 或 div | 除法 | ${144 /12 }或 ${144 div 12} | 12 |
% 或 mod | 取模 | $ {144 %10 }或${144 div 10} | 4 |
i empty 运算
empty运算可以判断一个数据是否为空,如果为空,贼输出为true,不为空,输出false
以下几种情况为空:
1.值为null的时候,为空
2.值为空串的时候,为空
3.值是object类型数组,长度为零的时候
4. list集合,元素个数为领
5. map集合元素个数为零
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/14
Time: 22:18
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>
<%
// 1.值为null的时候,为空
request.setAttribute("emptyNull",null);
// 2.值为空串的时候,为空
request.setAttribute("emptyStr","");
// 3.值是object类型数组,长度为零的时候
request.setAttribute("emptyArr",new Object[]{});
// 4. list集合,元素个数为领
List<String> list = new ArrayList<String>();
request.setAttribute("emptyList",list);
// 5. map集合元素个数为零
Map<String,Object> map = new HashMap<String,Object>();
request.setAttribute("emptyMap",map);
%>
${empty emptyNull}<br/>
${empty emptyStr}<br/>
${empty emptyArr}<br/>
${empty emptyList}<br/>
${empty emptyMap}<br/>
</body>
</html>
ii 三元运算
表达式1 ?表达式2 :表达式3
如果表达式1的值为真,返回表达式2的值,如果表达式1的值为假,返回表达式3的值,
<hr>
${12 == 12 ? "hello" : "world"}
iii."."点运算和【】中括号运算符
.点运算,可以输出bean对象中,某个属性的值,
【】中括号运算,可以输出有序集合中某个元素的值
并且中括号运算,还可以输出map集合中key集合含有特殊字符的key的值
f.jsp
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/15
Time: 20:57
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>
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("a.a.a","aaavalue");
map.put("b+b+b","bbbvalue");
map.put("c-c-c","cccvalue");
request.setAttribute("map",map);
%>
${map['a.a.a']}<br/>
${map['b+b+b']}<br/>
${map['c-c-c']}<br/>
</body>
</html>
e)EL表达式的11个隐藏对象
EL表达式中的11个隐藏对象是表达式中自己定义的,可以直接使用
变量 | 类型 | 作用 |
---|---|---|
pageContext | pageContextImpl | 它可以获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取pageContext域中的数据 |
requestScope | Map<String,Object> | 它可以获取request域中的数据 |
sessionScope | Map<String,Object> | 它可以获取session域中的数据 |
applicationScope | Map<String,Object> | 它可以获取servletContext域中的数据 |
param | Map<String,String> | 他可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值,获取多个值的时候使用 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取多个值的情况 |
cookie | Map<String,cookie> | 他可以获取当前请求的cookie信息 |
initParam | Map<String,String> | 他可以获取在web.xml中配置的上下文参数 |
1.EL获取四个特定域中的属性
pageScope ===== pageContext域
requestScope ===== request域
sessionScope ==== session域
applicationScope ===== ServletContext域
scope.jsp
<%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/15
Time: 21:36
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>
<%
pageContext.setAttribute("key1","pageContext1");
pageContext.setAttribute("key2","pageContext2");
session.setAttribute("key1","session1");
application.setAttribute("key1","application1");
request.setAttribute("key1","request1");
%>
${pageContext.ket1}
${requestScope.key1}
${applicationScope.key1}
${sessionScope.key1}
</body>
</html>
ii. pageContext 对象的使用
pageContext.jsp
<%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/15
Time: 21:43
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.getScheme()它可以获取请求的协议
request.getServerName()获取请求的服务器ip或域名
request.getServletPath()获取请求的服务器端口号
request.getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式 get或者post
request.getRemoteHost() 获取客户端的ip地址
request.getSession() 获取会话的唯一标识
--%>
<%=request.getScheme()%>
<%=request.getServerName()%>
<%=request.getServletPath()%>
<%=request.getContextPath()%>
<%=request.getMethod()%>
<%=request.getRemoteHost()%>
<%=request.getSession()%>>
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.request.session}
</body>
</html>
iii. EL 表达式其他隐含对象的使用
<%--
Created by IntelliJ IDEA.
User: 26523
Date: 2021/9/15
Time: 22:25
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/>
输出请求参数password的值${param.password}<br/>
${paramValues.hobbies[0]}<br/>
${paramValues.hobbies[1]}<br/>
<hr>
输出请求头【User-Agent】的值${header['User-Agent']}<br/>
输出请求头【Connection】的值${header.Connection}<br/>
输出请求头【Connection】的值 ${headerValues["User-Agent"][0]}
</body>
</html>
<hr>
获取cookie的名称:${cookie.JSESSIONID.name}<br/>
获取cookie的值:${cookie.JSESSIONID.value}<br/>
<hr>
输出context-param的值是${initParam}