天天看点

JavaWeb学习笔记——EL表达式介绍EL 表达式搜索域数据的顺序常用数据的输出运算11个内置对象

EL表达式

  • 介绍
  • EL 表达式搜索域数据的顺序
  • 常用数据的输出
  • 运算
    • 关系运算
    • 逻辑运算
    • 算数运算
    • empty 运算
    • 三元运算
    • . [ ] 运算
  • 11个内置对象
    • 域对象
    • pageContext 对象
    • param、paramValues 对象
    • 其他对象

介绍

EL 表达式,Expression Language,是表达式语言。

作用:代替 jsp 的表达式脚本,在 jsp 页面中进行数据的输出。

格式:${ 表达式 }

EL 表达式在输出 null 值时,输出的是空串,而 jsp 的表达式脚本输出 null 值时,输出的是 null 字符串。

EL 表达式搜索域数据的顺序

当四个域中都有相同的 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的值。

运算

关系运算

JavaWeb学习笔记——EL表达式介绍EL 表达式搜索域数据的顺序常用数据的输出运算11个内置对象

逻辑运算

JavaWeb学习笔记——EL表达式介绍EL 表达式搜索域数据的顺序常用数据的输出运算11个内置对象

算数运算

JavaWeb学习笔记——EL表达式介绍EL 表达式搜索域数据的顺序常用数据的输出运算11个内置对象

empty 运算

empty 运算可以判断数据是否为空,如果为空,则输出 true,否则输出 false。

格式:${ empty 值 }

以下几种情况为空:

  • 值为 null
  • 值为空串
  • 值为数组,长度为零
  • list 集合,元素个数为零
  • map 集合,元素个数为零

三元运算

格式:${ 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>
           

11个内置对象

EL 表达式中有 11 个隐含对象,是 EL 表达式自定义的,可以直接使用。

变量 类型 作用
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 中配置的<context-param>上下文参数

域对象

对象
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>
           

pageContext 对象

  • request.getScheme():获取请求协议
  • request.getServerName():获取请求的服务器 ip 或域名
  • request.getServerPort():获取请求的服务器端口号
  • request.getContextPath():获取当前工程路径
  • request.getMethod():获取请求方式(GET 或 POST)
  • request.getRemoteHost():获取客户端 ip 地址
  • session.getId():获取会话的唯一标识
<%@ 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>
           

param、paramValues 对象

  • param               Map<String,String>           获取请求参数的值
  • paramValues    Map<String,String[]>         获取多个请求参数的值
<%@ 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>