JavaWeb学习笔记——EL表达式

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表达式_第1张图片

逻辑运算

JavaWeb学习笔记——EL表达式_第2张图片

算数运算

JavaWeb学习笔记——EL表达式_第3张图片

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 获取 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>

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() 获取请求的方式(GETPOST)
		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           获取请求参数的值
  • paramValues    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>
	<%-- 
		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>

你可能感兴趣的:(笔记,java,jsp,EL表达式)