什么是EL表達(dá)式掉缺?
EL(Expression Language)表達(dá)式是一種簡化JSP頁面內(nèi)Java代碼的表達(dá)式語言盖喷。它借鑒了JavaScript和XPath的表達(dá)式語言错邦,提供了在JSP中簡化表達(dá)式的方法土榴,目的是為了盡量減少JSP頁面中的Java代碼荸哟,使得JSP頁面的處理程序編寫起來更加簡潔,便于開發(fā)和維護(hù)芒帕。
EL表達(dá)式的語法非常簡單歉嗓,所有EL表達(dá)式的格式都是以“${}”表示。在JSP中訪問模型對象是通過EL表達(dá)式的語法來表達(dá)的背蟆,這意味著從域?qū)ο笾蝎@取數(shù)據(jù)遥椿,然后將數(shù)據(jù)展示在頁面上。不過淆储,需要注意的是,EL表達(dá)式只能讀取數(shù)據(jù)家浇,不能修改數(shù)據(jù)本砰,并且不能在Java代碼塊中定義。
此外,EL表達(dá)式的自動轉(zhuǎn)類型和四大域讀取數(shù)據(jù)的特性也使得它在處理動態(tài)網(wǎng)頁時非常方便。當(dāng)四大域內(nèi)中有相同屬性名時妄迁,EL表達(dá)式會從最小范圍的域依次往最大域查找阅茶,找到相關(guān)內(nèi)容后將會停止查找,并顯示查找到的第一條數(shù)據(jù)蝶桶。
結(jié)論:
EL 表達(dá)式主要是代替 jsp 頁面中的表達(dá)式腳本在 jsp 頁面中進(jìn)行數(shù)據(jù)的輸出,并簡化jsp頁面語句。
表達(dá)式格式:
- EL 表達(dá)式的格式是:${表達(dá)式}
- EL 表達(dá)式在輸出 null 值的時候珍手,輸出的是空串。
- jsp 表達(dá)式腳本輸出 null 值的時候,輸出的是 null 字符串(如果要輸出空串琳要,需要進(jìn)行三元運(yùn)算符判斷)
<body>
<%
request.setAttribute("key","hello,El表達(dá)式");
%>
jsp表達(dá)式腳本的輸出方式:<%=request.getAttribute("key")==null?"":request.getAttribute("key")%><br/>
EL表達(dá)式的輸出方式:${key}
</body>
EL 表達(dá)式搜索域數(shù)據(jù)的順序
EL 表達(dá)式主要是在 jsp 頁面中輸出域?qū)ο笾械臄?shù)據(jù)寡具。
當(dāng)四個域中都有相同的 key 的數(shù)據(jù)的時候,EL 表達(dá)式會按照四個域的從小到大的順序去進(jìn)行搜索稚补,找到就輸出童叠。
<body>
<%
//往四個域中保存相同的key的數(shù)據(jù)
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
pageContext.setAttribute("key","pageContext");
%>
${key}
</body>
EL 表達(dá)式輸出 Bean 的屬性
創(chuàng)建一個實體類Person,類中定義(普通屬性、數(shù)組屬性课幕、List集合屬性和map集合屬性)厦坛。
public class Person<T> {
private T id;
private T[] data;
private List<T> list;
private Map<T,Object> map;
public Person() {
}
public Person(T id, T[] data, List<T> list, Map<T, Object> map) {
this.id = id;
this.data = data;
this.list = list;
this.map = map;
}
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
public T[] getData() {
return data;
}
public void setData(T[] data) {
this.data = data;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public Map<T, Object> getMap() {
return map;
}
public void setMap(Map<T, Object> map) {
this.map = map;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person<?> person = (Person<?>) o;
return Objects.equals(id, person.id) && Arrays.equals(data, person.data) && Objects.equals(list, person.list) && Objects.equals(map, person.map);
}
@Override
public int hashCode() {
int result = Objects.hash(id, list, map);
result = 31 * result + Arrays.hashCode(data);
return result;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", data=" + Arrays.toString(data) +
", list=" + list +
", map=" + map +
'}';
}
}
<body>
<!-- 聲明腳本 -->
<%!
List<String> list = new ArrayList<>(3);
String[] data = new String[3];
Map<String,Object> map = new HashMap<>(3);
Person<String> person = null;
%>
<!-- 代碼腳本 -->
<%
list.add("上海");
list.add("廣州");
list.add("北京");
data[0] = "AA";
data[1] = "BB";
data[2] = "CC";
map.put("key1", LocalDateTime.now());
map.put("key2",true);
map.put("key3", "hello");
person = new Person<>("1001",data,list,map);
pageContext.setAttribute("p",person);
%>
<!-- 輸出保存在page域中的Person類數(shù)據(jù) -->
輸出Person類中的id屬性值:${p.id} <br/>
輸出Person類中的data數(shù)組屬性值:${p.data[1]} <br/>
輸出Person列中的list集合屬性值:${p.list.get(1)} <br/>
輸出Person類中的Map集合屬性值:${p.map}<br/>
輸出Person類中的Map集合屬性指定key的value值:${p.map.key1}
</body>
EL 表達(dá)式:運(yùn)算符
語法:${ 運(yùn)算表達(dá)式 } , EL 表達(dá)式支持如下運(yùn)算符:
<body>
<h2>關(guān)系運(yùn)算</h2>
${10 == 10} 或 ${10 eq 12} <br/>
${10 ne 12} 或 ${10 != 10} <br/>
${10 < 5} 或 ${5 lt 10} <br/>
${10 > 5} 或 ${5 gt 10} <br/>
${10 <= 5} 或 ${5 le 10} <br/>
${10 >= 5} 或 ${5 ge 10} <br>
<h2>邏輯運(yùn)算</h2>
${12 == 12 && 12 < 10} 或 ${12 == 12 and 12 < 10}<br>
${12 == 12 || 12 < 10} 或 ${12 == 12 or 12 < 10}<br>
${!true} 或 ${not true}<br>
<h2>算術(shù)運(yùn)算</h2>
${12 + 18}<br>
${18 - 10}<br>
${5 * 5}<br>
${12 / 6} 或 ${12 div 6}<br>
${10 % 2} 或 ${10 mod 5}<br>
</body>
empty 運(yùn)算
empty 運(yùn)算可以判斷一個數(shù)據(jù)是否為空乍惊,如果為空杜秸,則輸出 true,不為空輸出 false。
以下幾種情況為空:
1污桦、值為 null 值的時候亩歹,為空
2、值為空串的時候凡橱,為空
3小作、值是 Object 類型數(shù)組,長度為零的時候
4稼钩、list 集合顾稀,元素個數(shù)為零
5、map 集合坝撑,元素個數(shù)為零
<body>
<h2>empty運(yùn)算</h2>
<%
request.setAttribute("emptyNull",null);
request.setAttribute("emptyStr","");
request.setAttribute("emptyArr",new Object[]{});
List<String> list = new ArrayList<>();
request.setAttribute("emptyList",list);
Map<String,Object> map = new HashMap<>();
request.setAttribute("emptyMap",map);
%>
${!empty emptyNull} <br/>
${empty emptyStr} <br/>
${empty emptyArr} <br/>
${empty emptyList} <br/>
${empty emptyMap} <br/>
</body>
三元運(yùn)算符
語法格式:表達(dá)式 1静秆?表達(dá)式 2:表達(dá)式 3
如果表達(dá)式 1 的值為真,返回表達(dá)式 2 的值巡李,如果表達(dá)式 1 的值為假抚笔,返回表達(dá)式 3 的值。
<body>
<h2>三元運(yùn)算符</h2>
${10 % 2 == 0 ? "偶數(shù)" : "奇數(shù)"}
</body>
“.”點(diǎn)運(yùn)算 和 [] 中括號運(yùn)算符
.點(diǎn)運(yùn)算侨拦,可以輸出對象中某個屬性的值殊橙。
[]中括號運(yùn)算,可以輸出有序集合中某個元素的值狱从。
并且[]中括號運(yùn)算膨蛮,還可以輸出 map 集合中 key 里含有特殊字符的 key 的值。
<body>
<h2>.與[]運(yùn)算</h2>
<%
Map<String,Object> map1 = new HashMap<>();
map1.put("a.a.a","aaaVal");
map1.put("b+b+b","bbbVal");
request.setAttribute("map",map1);
%>
${map['a.a.a']} <br/>
${map['b+b+b']} <br/>
</body>
EL 表達(dá)式: 11 個隱含對象
EL 個表達(dá)式中 11 個隱含對象季研,是 EL 表達(dá)式中自己定義的敞葛,可以直接使用。
變量 | 類型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以獲取 jsp 中的九大內(nèi)置對象 |
pageScope | Map<String,Object> | 它可以獲取 pageContext 域中的數(shù)據(jù) |
requestScope | Map<String,Object> | 它可以獲取 Request域中的數(shù)據(jù) |
sessionScope | Map<String,Object> | 它可以獲取 Session 域中的數(shù)據(jù) |
applicationScope | Map<String,Object> | 它可以獲取ServletContext域中的數(shù)據(jù) |
param | Map<String,Object> | 它可以獲取請求參數(shù)的值 |
paramValues | Map<String,Object[]> | 它也可以獲取請求參數(shù)的值与涡,獲取多個值的時候使用惹谐。 |
header | Map<String,Object> | 它可以獲取請求頭的信息 |
headerValues | Map<String,Object[]> | 它可以獲取請求頭的信息持偏,它可以獲取多個值的情況 |
cookie | Map<String,Cookie> | 它可以獲取當(dāng)前請求的Cookie信息 |
initParam | Map<String,String> | 它可以獲取在 web.xml 中配置的上下文參數(shù) |
<body>
<h2>獲取域數(shù)據(jù)</h2>
<%
pageContext.setAttribute("key1","pageContext1");
pageContext.setAttribute("key2","pageContext2");
request.setAttribute("key1","request");
session.setAttribute("key1","session");
application.setAttribute("key1","application");
%>
${pageScope.key2} <br/>
${pageContext.request.getAttribute("key1")} <br/>
${sessionScope.key1} <br/>
${applicationScope.key1} <br/>
</body>
pageContext對象的使用
<body>
<%--
request.getScheme() 它可以獲取請求的協(xié)議
request.getServerName() 獲取請求的服務(wù)器 ip 或域名
request.getServerPort() 獲取請求的服務(wù)器端口號
getContextPath() 獲取當(dāng)前工程路徑
request.getMethod() 獲取請求的方式(GET 或 POST)
request.getRemoteHost() 獲取客戶端的 ip 地址
session.getId() 獲取會話的唯一標(biāo)識
--%>
<%
pageContext.setAttribute("req",request);
pageContext.setAttribute("session",session);
%>
<%=request.getScheme()%><br/>
<%=session.getId()%><br/>
<%-- 以上方式簡化以下的寫法--%>
1.協(xié)議: ${ req.scheme}<br>
2.服務(wù)器 ip:${ pageContext.request.serverName }<br>
3.服務(wù)器端口:${ 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>
EL 表達(dá)式其他隱含對象的使用
param Map<String,Object> 它可以獲取請求參數(shù)的值
paramValues Map<String,Object[]> 它也可以獲取請求參數(shù)的值,獲取多個值的時候使用豺鼻。
<%-- 瀏覽器地址輸入請求參數(shù)進(jìn)行測試 --%>
輸出請求參數(shù) username 的值:${ param.username } <br>
輸出請求參數(shù) password 的值:${ param.password } <br>
輸出請求參數(shù) username 的值:${ paramValues.username[0] } <br>
輸出請求參數(shù) hobby 的值:${ paramValues.hobby[0] } <br>
輸出請求參數(shù) hobby 的值:${ paramValues.hobby[1] } <br>
header Map<String,Object> 它可以獲取請求頭的信息
headerValues Map<String,Object[]> 它可以獲取請求頭的信息综液,它可以獲取多個值的情況
輸出請求頭【User-Agent】的值:${ header['User-Agent'] } <br>
輸出請求頭【Connection】的值:${ header.Connection } <br>
輸出請求頭【User-Agent】的值:${ headerValues['User-Agent'][0] } <br>
cookie Map<String,Cookie> 它可以獲取當(dāng)前請求的 Cookie 信息
獲取 Cookie 的名稱:${ cookie.JSESSIONID.name } <br>
獲取 Cookie 的值:${ cookie.JSESSIONID.value } <br>
initParam Map<String,String> 它可以獲取在 web.xml 中配置的上下文參數(shù)
web.xml 中的配置:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///test</param-value>
</context-param>
<body>
輸出<Context-param>username 的值:${ initParam.username } <br>
輸出<Context-param>url 的值:${ initParam.url } <br>
</body>