• 當前位置:首頁 > IT技術 > 編程語言 > 正文

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

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

    需要注意的是EL只能從 pageConext、request、session、application 四大域屬性空間中獲取數據。

    ?

    用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>

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

      成功案例:

    <%@?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可以直接輸出你想輸出的內容 但是不是雙引號? 是單引號括起來 ,只能輸出指定的 但 不能做算術運算哦!

    ?

    ?


    ?

    問題來了! 就是說 如果我值都相等 那么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>

    我們已經把它的4個域都設置名字都一樣的了??! 但是你會發現他打印的是pageContext 為什么?? 因為:

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

    所以說: 允許名字相同,但是輸出優先級 是 作用域范圍小的內置對象 - > 范圍大的內置對象,一旦獲取到了就不會往下找了,所以你可以嘗試吧 pageContetx 注釋 那么他會打印?request,其實我已經排好序了,作用域從小到大就是上面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");
    ????%>
    ????
    ????<%--?其實呢?指定域的內置對象很容易記?就是?域名?+?Scope?
    ????????????Scope?:??范圍??【sk??p】
    ????--%>
    ????
    ????
    ????${?pageScope.name?}
    ????
    ????<br>
    ????
    ????${?requestScope.name?}
    ????
    ????<br>
    ????
    ????${?sessionScope.name?}

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

    這里已經給出很詳細了! 接下來:

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

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

    ?

    ?


    ?

    訪問 Bean 的屬性
    EL 可以通過 ${key .屬性}的方式獲取到指定對象的屬性值。其底層實際調用的是該對象的相應屬性的 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 ,【已經定義好 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 表達式還可以:

    ?


    ?

    獲取數組中的元素
    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>

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

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



    </body>
    </html>

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

    ?

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

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

    <%@?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 不能為數值! 我也不知道為什么啊 我用Integer 也是不行! 會報錯 ,意思是 ${user_map.1}? 這句話服務器是解析不了的 我也不知道為什么 ....

    ?

    ?


    ?

    運算符

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

    1. 算術運算符 + – * / % (不支持++、–)
    2. 關系運算符 == != > >= < <=
    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 變量},結果為布爾值。

    • 若變量未定義,則返回值為 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

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码