當前位置:首頁 > IT技術(shù) > 編程語言 > 正文

5. JSP - 表達式語言 - EL
2022-05-31 17:17:12

EL,Expression Language,表達式語言,是一種在JSP頁面中獲取數(shù)據(jù)的簡單方式,通過${變量名}的方式可以獲取到值,

需要注意的是EL只能從 pageConext、request、session、application 四大域?qū)傩钥臻g中獲取數(shù)據(jù)。

?

用EL來獲取上面所說的值:

先來個測試(失敗案例),即獲取不了num的值,因為num不是在pageContext、request、session、和 appliction中:

<%@?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>
????<!--??這是一個錯誤的獲?。?-->
????<%!?int?sum?=?999;?%>
????${?sum?}
????<!--??雖然是一個錯誤的例子?,?但是在jsp中他不會報錯!?也不會顯示任何東西!!?記住el表達式這個特性!??-->
????
</body>
</html>

上面獲取不了 也不會報錯 也不會輸出任何數(shù)據(jù) , 記住這個特性!

  成功案例:

<%@?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.setAttribute("el",?"我是el表達式!");?%>
????${el}
????<!--??這樣就會直接在頁面顯示?request中設置的el值了??:?‘我是el表達式’?-->
</body>
</html>

我剛試過了一下? 它不可以打印多個值 ,即一個el 獲取多個值 不然異常!

其實EL可以直接輸出你想輸出的內(nèi)容 但是不是雙引號? 是單引號括起來 ,只能輸出指定的 但 不能做算術(shù)運算哦!

?

?


?

問題來了! 就是說 如果我值都相等 那么el表達式會獲取那個值呢:
  那么我們4個域都設置一樣的名字 不一樣的值 看他獲取那個:

<%@?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>
????<%?
????pageContext.setAttribute("name",?"pageContext");
????request.setAttribute("name",?"request");
????session.setAttribute("name",?"session");
????application.setAttribute("name",?"application");
????%>
????${?name}
</body>
</html>

我們已經(jīng)把它的4個域都設置名字都一樣的了?。?但是你會發(fā)現(xiàn)他打印的是pageContext 為什么?? 因為:

EL底層是從最小范圍的pageContext依次查找,直到查找到最大范圍 application。這期間,只要查找到了,則直接獲取,不再去后面的范圍中查找了,若最終沒有查找到,則什么也不輸出。

所以說: 允許名字相同,但是輸出優(yōu)先級 是 作用域范圍小的內(nèi)置對象 - > 范圍大的內(nèi)置對象,一旦獲取到了就不會往下找了,所以你可以嘗試吧 pageContetx 注釋 那么他會打印?request,其實我已經(jīng)排好序了,作用域從小到大就是上面4個 上往下!

問題又來了! 那我如果名字都一樣 需要打印指定的,那就需要:

?

?


?

那就需要你手動在${} 里面指定 使用域?qū)傩钥臻g相關(guān)的內(nèi)置對象獲取數(shù)據(jù) 即:

<%@?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>
????<%?
????pageContext.setAttribute("name",?"pageContext");
????request.setAttribute("name",?"request");
????session.setAttribute("name",?"session");
????application.setAttribute("name",?"application");
????%>
????
????<%--?其實呢?指定域的內(nèi)置對象很容易記?就是?域名?+?Scope?
????????????Scope?:??范圍??【sk??p】
????--%>
????
????
????${?pageScope.name?}
????
????<br>
????
????${?requestScope.name?}
????
????<br>
????
????${?sessionScope.name?}

????<br>
????
????${?applicationScope.name?}
</body>
</html>

這里已經(jīng)給出很詳細了! 接下來:

el表達式 怎么訪問 類中的屬性:

如果存在sytudent對象 那么 我們想訪問他的 name 或其他屬性:

?

?


?

訪問 Bean 的屬性
EL 可以通過 ${key .屬性}的方式獲取到指定對象的屬性值。其底層實際調(diào)用的是該對象的相應屬性的 get 方法 (原理)。也可以使用${key[“屬性”]的方式獲取。該方式不常用(麻煩的要死)。

例:

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"?import="test.Student"%>
????

<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>
????
????<%--?如果有包?記得先導student的包!?--%>
????<%
????????Student?stu?=?new?Student("bi-hu");?//實例化一個student類?stu?對象
????????request.setAttribute("stu",?stu);????//然后把這個stu給塞進request中
????%>
????
????${?requestScope.stu.name?}
????<br>
????${??requestScope.stu["name"]?}
????
</body>
</html>

打印出來了? 兩個都是bi-hu 那你也可以用這兩種訪問去訪問student 中其他屬性 !

記得要裝(setAttribute)對象進4大域其中一個域里!

問題又來了: 如果我一個類中包含另一個類,然后我想一層一層往下獲取 那么得這樣:

例:schooll 中 有 student ,【已經(jīng)定義好 student 類 和? school 類! 】 我想獲取學生的名字:

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"?%>
???<%@?page?import="test.*"?%>
????

<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>
????
????<%--?如果有包?記得先導student?和?School的包!?--%>
????<%
????????School?school?=?new?School("青鳥北大");????????//實例化一個學校類?school?名字是?青鳥北大
????????Student?bihu?=?new?Student("bi-hu");?//實例化一個學生類?bihu?名字是?bihu
????????school.setStu(bihu);????????????//把bihu這個學生設置到了?青鳥北大
????????request.setAttribute("school",?school);????????????????//把學校塞進reqeust里面!
????%>
????
????${?requestScope.school.stu.name?}
????<br>
????${??requestScope.school.stu["name"]?}
????
</body>
</html>

其實都是用 . 的方法就可以逐步往下找了【類與對象也是這樣的】 但是記住 往下找的時候 是: 學校.學生屬性.學生姓名   這三都是一個屬于學校類的 。

?

EL 表達式還可以:

?


?

獲取數(shù)組中的元素
EL 可以通過 ${key[索引]} 的方式獲取到指定索引的元素。不過,需要注意的是,若數(shù)組中不存在該指定索引的元素,系統(tǒng)并不會拋出數(shù)組越界異常(上面講了 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>

<%?
????int[]?arr?=?{1,2,3,4,5};
????request.setAttribute("arr",?arr);????
%>

${?arr[0]?}????<%--?或者:?--%>
<br>
${?requestScope.arr[1]}



</body>
</html>

第一次獲取的是第一個元素 第二次那個畫蛇添足 獲取第二個元素 ,帶腦子思考!

?

EL表達式還可以獲取List的元素:

與獲取數(shù)組中的元素相同,通過 ${key[索引]} 的方式可以獲取 List 中指定索引的元素。若 List 中不存在該指定索引的元素,系統(tǒng)并不會拋出越界異常。

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
????<%@?page?import="java.util.*,test.*"%>
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

<!--??首先定義個List?往里面添加幾個學生??-->
<%
????Student?stu?=?new?Student("張三");
????Student?stu1?=?new?Student("李四");
????Student?stu2?=?new?Student("王五");
????Student?stu3?=?new?Student("趙6");
????
????List<Student>?list?=?new?ArrayList();????????//吧上面的學生裝進容器
????list.add(stu);
????list.add(stu1);
????list.add(stu2);
????list.add(stu3);
????
????request.setAttribute("list_stu",?list);????????//把list裝進request里面?key是?list_stu
%>

<!--?輸出個李四?-->
${?list_stu[1].name??}

<br>

<!--?輸出個趙6?-->
${?list_stu[3].name?}

</body>
</html>

?

因為Set沒有索引和順序的感念,所以EL表達式不能輸出Set

?


?

獲取 Map 中的元素
EL 通過 ${key.mapKey} 的方式可以獲取指定 mapKey 的指定 mapValue 的值。 別搞混!? 這里的key? 和 mapKey 是不一樣的.

其實這個更容易 就是直接 .Mapkey? 就可以獲取到Map中key對應的值了!

??

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
????<%@?page?import="java.util.*,test.*"%>
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

<!--??首先定義個List?往里面添加幾個學生??-->
<%
HashMap<String,String>?user?=?new?HashMap<String,String>();
????user.put("a",?"疼迅");
????user.put("b","阿貍");
????user.put("c",?"美団");
????
????//老方法
????request.setAttribute("user_map",?user);
%>

????${??user_map.a}
????<br>
${??user_map.b}
<br>
${??user_map.c}

</body>
</html>

這個Map的key 不能為數(shù)值! 我也不知道為什么啊 我用Integer 也是不行! 會報錯 ,意思是 ${user_map.1}? 這句話服務器是解析不了的 我也不知道為什么 ....

?

?


?

運算符

EL 表達式可以進行各種運算,其中常用的運算符有:

  1. 算術(shù)運算符 + – * / % (不支持++、–)
  2. 關(guān)系運算符 == != > >= < <=
  3. 邏輯運算符 ! && || not and or
  4. 三目運算符 ? :
  5. 特殊運算符 empty

&& 或者 and, 例如:${false && false} 或者 ${false and false }
|| 或者 or, 例如:${true || false} 或者 ${true or false }
! 或者 not,例如:${!true} 或者 ${not true }

empty的法為${empty 變量},結(jié)果為布爾值。

  • 若變量未定義,則返回值為 true
  • 若變量為 String 類型,且其值為空串,則返回值為 true。
  • 若變量為引用類型,且其值為 null,則返回值為 true。
  • 若變量為集合類型,且其不包含任何元素,則返回值為 true。

?

下面重點講一下這個 empty :

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
????<%@?page?import="java.util.*,test.*"%>
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

<!--??Empty:?-->
<%
????request.setAttribute("empty_0",?"");
????request.setAttribute("empty_1",?null);
????request.setAttribute("empty_2",?new?ArrayList());
%>

${?empty?undefined?}
${?empty??empty_0}
${empty??empty_1}
${empty??empty_2}

<%--?true?true?true?true??--%>

</body>
</html>

?

?

就那么多 ,帶腦子看啊!? 記住你設置的 那個 key 別和 EL表達式的運算符一樣!

  






?


作者:??咸瑜???


本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務立即開通 >