1. 程式人生 > 其它 >JavaWeb學習筆記——EL表示式

JavaWeb學習筆記——EL表示式

技術標籤:筆記javajspEL表示式

EL表示式

介紹

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的值

運算

關係運算

在這裡插入圖片描述

邏輯運算

在這裡插入圖片描述

算數運算

在這裡插入圖片描述

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 表示式自定義的,可以直接使用。

變數型別作用
pageContextPageContextImpl獲取 jsp 中的九大內建物件
pageScopeMap<String,Object>獲取 pageContext 域中的資料
requestScopeMap<String,Object>獲取 Request 域中的資料
sessionScopeMap<String,Object>獲取 Session 域中的資料
applicationScopeMap<String,Object>獲取 ServletContext 域中的資料
paramMap<String,String>獲取請求引數的值
paramValuesMap<String,String[]>獲取多個請求引數的值
headerMap<String,String>獲取請求頭的資訊
headerValuesMap<String,String[]>獲取多個請求頭的資訊
cookieMap<String,Cookie>獲取當前請求的 Cookie 資訊
initParamMap<String,String>獲取在 web.xml 中配置的<context-param>上下文引數

域物件

物件
pageScopepageContext 域
requestScopeRequest 域
sessionScopeSession 域
applicationScopeServletContext 域
<%@ 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 物件

  • paramMap<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>