天天看點

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>