EL 表达式,Expression Language,是表达式语言。
作用:代替 jsp 的表达式脚本,在 jsp 页面中进行数据的输出。
格式:${ 表达式 }
EL 表达式在输出 null 值时,输出的是空串,而 jsp 的表达式脚本输出 null 值时,输出的是 null 字符串。
当四个域中都有相同的 key 的数据时,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>
<%--
当四个域中都有相同的key时,EL表达式会按照四个域的从小到大的顺序进行搜索,找到就输出。
pageContext < request < session < application
--%>
<%
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session. setAttribute("key", "session");
application.setAttribute("key", "application");
%>
${
key } <%-- pageContext --%>
</body>
</html>
使用EL 表达式输出数组、List 集合,map 集合以及JavaBean 对象的属性。
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="pojo.Person"%>
<%@ 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>
<%-- 向Person对象中传入数据,并通过EL表达式取出 --%>
<%
Person p = new Person();
p.setAge(20);
p.setName(new String[]{
"No1", "No2", "No3"});
List<String> list = new ArrayList<String>();
list.add("123");
list.add("456");
list.add("789");
p.setPhone(list);
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "辽宁");
map.put("key2", "吉林");
map.put("key3", "黑龙江");
p.setLocation(map);
pageContext.setAttribute("person", p);
%>
<%-- 通过EL表达式取出Person中的各部分内容 --%>
<%-- 取出age值 --%>
${
person.age }<br> <!-- 20 -->
<%-- 取出name值 --%>
${
person.name }<br> <!-- [Ljava.lang.String;@3bc3d737 -->
${
person.name[0] }<br> <!-- No1 -->
<%-- 取出phone值 --%>
${
person.phone }<br> <!-- [123, 456, 789] -->
${
person.phone[1] }<br> <!-- 456 -->
<%-- 取出location值 --%>
${
person.location }<br> <!-- {
key1=辽宁, key2=吉林, key3=黑龙江} -->
${
person.location.key1 }<br> <!-- 辽宁 -->
<%--
注意:在EL表达式中,数组和集合取出元素的方法都使用 [] 和下标完成,
在Java中,数组使用 []和下标,集合使用get()方法。
--%>
<%--
键值person代表Person p,但person.age后的age不代表Perosn类的age属性,
EL表达式通过查找getXxx()方法,查找有无与age对应的getAge()方法,进而根据getAge()方法返回值,
因此,即使在Person类中没有定义age属性,但有getAge()方法,仍然可以获取到age的值
--%>
<%--p中没有定义value属性,但是有getValue()方法,因此可以取出value值 --%>
${
person.value }
</body>
</html>
Person.java
package pojo;
import java.util.List;
import java.util.Map;
public class Person {
private int age;
private String[] name;
private List<String> phone;
private Map<String, String> location;
//方法中没有value属性,但是有getValue()方法,仍然可以通过EL表达式取出value的值
public Person() {
super();
}
public Person(int age, String[] name, List<String> phone, Map<String, String> location) {
super();
this.age = age;
this.name = name;
this.phone = phone;
this.location = location;
}
public int getValue() {
return 1;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
public List<String> getPhone() {
return phone;
}
public void setPhone(List<String> phone) {
this.phone = phone;
}
public Map<String, String> getLocation() {
return location;
}
public void setLocation(Map<String, String> location) {
this.location = location;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
}
注意:
键值person代表Person p,但person.age后的age不代表Perosn类的age属性,
EL表达式通过查找getXxx()方法,查找有无与age对应的getAge()方法,进而根据getAge()方法返回值,
因此,即使在Person类中没有定义age属性,但有getAge()方法,仍然可以获取到age的值。
empty 运算可以判断数据是否为空,如果为空,则输出 true,否则输出 false。
格式:${ empty 值 }
以下几种情况为空:
格式:${ exp1 ? exp2 : exp3 }
如果 exp1 的值为真,返回 exp2 的值,如果 exp1 的值为假,返回 exp3 的值。
点运算,可以输出 JavaBean 对象中某个属性的值,
[ ]运算,可以输出数组中某个元素的值,以及 map 集合中 key 里含有特殊字符的 key 的值。
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ 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("key1", "val1");
map.put("k.ey2", "val2");
map.put("-key3", "val3");
request.setAttribute("map", map);
%>
${
map.key1 }<br>
${
map["k.ey2"] }<br>
${
map['-key3'] }<br>
</body>
</html>
EL 表达式中有 11 个隐含对象,是 EL 表达式自定义的,可以直接使用。
变量 | 类型 | 作用 |
---|---|---|
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 中配置的 |
对象 | 域 |
---|---|
pageScope | pageContext 域 |
requestScope | Request 域 |
sessionScope | Session 域 |
applicationScope | ServletContext 域 |
<%@ 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>
<%--
pageScope pageContext 域
requestScope Request 域
sessionScope Session 域
applicationScope ServletContext 域
--%>
<%
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
request.setAttribute("key2", "request");
session.setAttribute("key2", "session");
application.setAttribute("key2", "application");
%>
<%--
现在想取出request域中键值为key2的value值,直接使用EL表达式会默认先在PageContext中寻找,
因此要使用下面的方法输出指定域中的数据
--%>
${
requestScope.key2 }
</body>
</html>
<%@ 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.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
request.getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
把get去掉,剩下的部分就是EL表达式中的键值
--%>
<%
pageContext.setAttribute("req", request);
%>
<%=request.getScheme() %> <br>
1.协议: ${
req.scheme }<br>
2.服务器 ip:${
req.serverName }<br>
3.服务器端口:${
pageContext.request.serverPort }<br>
4.获取工程路径:${
pageContext.request.contextPath }<br>
5.获取请求方法:${
pageContext.request.method }<br>
6.获取客户端 ip 地址:${
pageContext.request.remoteHost }<br>
7.获取会话的 id 编号:${
pageContext.session.id }<br>
</body>
</html>
<%@ 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>
<%--
param Map<String,String> 它可以获取请求参数的值
paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。
--%>
<%-- 假设浏览器地址栏中是:
http://localhost:8080/jspWeb/EL/获取请求参数.jsp?username=mcc&password=123456
--%>
${
param.username }<br><%-- mcc --%>
${
param.password }<br><%-- 123456 --%>
<%-- 假设浏览器地址栏中是:
http://localhost:8080/jspWeb/EL/获取请求参数.jsp?username=mcc&password=123456&hobby=java&hobby=python
--%>
${
paramValues.username }<br> <%-- [Ljava.lang.String;@d9dd354 返回的是String[]数组对象 --%>
${
paramValues.username[0] }<br><%-- mcc --%>
${
paramValues.hobby[1] }<br>$<%-- python --%>
</body>
</html>
<%@ 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>
<%--
header Map<String,String> 它可以获取请求头的信息
headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况
--%>
${
header.Collection }
${
header["User-Agent"] }
${
headerValues["User-Agent"][0] }
<%-- 获取工程的<context-param>信息 --%>
${
initParam.contextName }<%-- context --%>
</body>
</html>