EL表達(dá)式教程

什么是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>
輸出&lt;Context-param&gt;username 的值:${ initParam.username } <br>
輸出&lt;Context-param&gt;url 的值:${ initParam.url } <br>
</body>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儒飒,隨后出現(xiàn)的幾起案子谬莹,更是在濱河造成了極大的恐慌,老刑警劉巖桩了,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件附帽,死亡現(xiàn)場離奇詭異,居然都是意外死亡井誉,警方通過查閱死者的電腦和手機(jī)蕉扮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颗圣,“玉大人喳钟,你說我怎么就攤上這事≡谄瘢” “怎么了奔则?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔽午。 經(jīng)常有香客問我易茬,道長,這世上最難降的妖魔是什么及老? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任抽莱,我火速辦了婚禮,結(jié)果婚禮上骄恶,老公的妹妹穿的比我還像新娘食铐。我一直安慰自己,他們只是感情好僧鲁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布虐呻。 她就那樣靜靜地躺著,像睡著了一般悔捶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上单芜,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蜕该,我揣著相機(jī)與錄音,去河邊找鬼洲鸠。 笑死堂淡,一個胖子當(dāng)著我的面吹牛馋缅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绢淀,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼萤悴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皆的?” 一聲冷哼從身側(cè)響起覆履,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎费薄,沒想到半個月后硝全,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楞抡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年伟众,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召廷。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凳厢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竞慢,到底是詐尸還是另有隱情先紫,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布梗顺,位于F島的核電站泡孩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寺谤。R本人自食惡果不足惜仑鸥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望变屁。 院中可真熱鬧眼俊,春花似錦、人聲如沸粟关。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷板。三九已至澎灸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遮晚,已是汗流浹背性昭。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县遣,地道東北人糜颠。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓汹族,卻偏偏與公主長得像,于是被迫代替她去往敵國和親其兴。 傳聞我的和親對象是個殘疾皇子顶瞒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一.什么是EL表達(dá)式,EL表達(dá)式的作用? EL 表達(dá)式的全稱是:Expression Language元旬。是表達(dá)式語...
    是空心呀丶閱讀 195評論 0 1
  • EL表達(dá)式 1. 什么是EL表達(dá)式榴徐,EL表達(dá)式作用 EL表達(dá)式全程:Expression Language,是表達(dá)...
    伍六七_(dá)ba5e閱讀 492評論 0 0
  • 大家好法绵,我是IT修真院深圳分院java第4期學(xué)員箕速,一枚正直善良的java程序員。今天給大家分享一下朋譬,修真院官網(wǎng)ja...
    肥胖癥患者閱讀 571評論 0 0
  • 基礎(chǔ)目標(biāo): 使用 EL 獲取 web 四個容器(page盐茎、 request、 session徙赢、 serveltCo...
    勝浩_ae28閱讀 1,371評論 0 0
  • EL表達(dá)式&JSTL標(biāo)簽庫 什么是EL表達(dá)式字柠,作用又是什么? EL表達(dá)式搜索域數(shù)據(jù)的順序 EL表達(dá)式輸出Bean的...
    樂綏692閱讀 108評論 0 1