JavaWeb學習筆記——EL表示式
阿新 • • 發佈:2020-12-24
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 表示式自定義的,可以直接使用。
變數 | 型別 | 作用 |
---|---|---|
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 物件
- 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>