1. 程式人生 > >EL表示式語言(零)

EL表示式語言(零)

一、EL表示式簡介

  • EL全名為Expression Language。EL主要作用:
  • 獲取資料:EL表示式主要用於替換JSP頁面中的指令碼表示式,以從各種型別的web域中檢索java物件、獲取資料。(某個web域中的物件,訪問JavaBean的屬性、訪問list集合、訪問map集合、訪問陣列)
  • 執行運算:利用EL表示式可以再JSP頁面中執行一些基本的關係運算、邏輯運算和算數運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}
  • 獲取web開發常用物件:EL表示式定義了一些隱式物件,利用這些隱式物件,web開發人員可以很輕鬆獲得對web常用物件的引用,從而獲得這些物件中的資料。
  • 呼叫java方法:EL表示式允許使用者開發自定義EL函式,以在JSP頁面中通過EL表示式呼叫java類的方法。

二、獲取資料

  • 使用EL表示式獲取資料語法:"${識別符號}"
  • EL表示式語句在執行時,會呼叫pageContext.findAttribute方法,用識別符號為關鍵字,分別從page、request、session、application四個域中查詢相應的物件,找到則返回相應物件,找不到則返回""(注意,不是null,而是空字串)
  • 示例:${user}
  • EL表示式也可以很輕鬆獲取JavaBean的屬性,或獲取陣列、Collection、Map型別集合的資料,例如:

${user.address.city}

${user.list[0]}:訪問有序集合某個位置的元素

${map.key}:獲得map集合中指定key的值

  • 結合JSTL的foreach標籤,使用EL表示式也可以很輕鬆迭代各種型別的陣列或集合,示例:

迭代陣列

迭代collection型別集合

迭代map型別集合

三、執行運算

  • 語法:${運算表示式},EL表示式支援如下運算子:

  • empty運算子:檢查物件是否為null或"空",很好用
  • 三元運算子:${user!=null?user.name:""},很好用
  • []和.號運算子

四、獲得web開發常用物件

  • EL表示式語言中定義了11個隱含物件,使用這些隱含物件可以很方便地獲取web開發中的一些常見物件,並讀取這些物件的資料。
  • 語法:${隱式物件名稱}:獲得物件的引用
隱含物件名稱 描述
pageContext 對應於JSP頁面中的pageContext物件(注意:取的是pageContext物件)
pageScope 代表page域中用於儲存屬性的Map物件
requestScope 代表request域中用於儲存屬性的Map物件
sessionScope 代表session域中用於儲存屬性的Map物件
applicationScope 代表application域中用於儲存屬性的Map物件
param 表示一個儲存了所有請求引數的Map物件
paramValues 表示一個儲存了所有請求引數的Map物件,它對於某個請求引數,返回的是一個string[]
header 表示了一個儲存了所有http請求頭欄位的Map物件
headerValues 同上,返回一個string[]陣列,注意:如果頭裡面有"-",例如Accept-Encoding,則要headerValues["Accept-Encoding"]
cookie 表示一個儲存了所有cookie的Map物件
initParam 表示一個儲存了所有web應用初始化引數的Map物件

五、獲得web開發常用物件

request.getContextPath():EL

測試各個隱式物件

注意事項:測試cookie時,例如:${cookie.key}去的是cookie物件,如果訪問cookie的名稱和值,需要${cookie.key.name}和${cookie.key.value}

六、使用EL呼叫java方法

  • EL表示式語法允許開發人員開發自定義函式,以呼叫java類的方法。
  • 示例:${prefix:method(params)}
  • 在EL表示式中呼叫的只能是java類的靜態方法
  • 這個java類的靜態方法需要在TLD(Tagliary Definition)檔案中描述,才可以被EL表示式呼叫。
  • EL自定義函式用於擴充套件EL表示式的功能,可以讓EL表示式完成普通Java程式程式碼所能完成的功能。

七、EL Function開發步驟

一般來說,EL自定義函式開發與應用包括以下三個步驟:

  • 編寫一個java類的靜態方法
  • 編寫標籤庫描述符(tld)檔案,在tld檔案中描述自定義函式
  • 在JSP頁面中匯入和使用自定義函式

八、開發EL Function注意事項

  • 編寫完標籤庫描述檔案後,需要將它放置到<web應用>\WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的任意子目錄中。
  • TLD檔案中的<uri>元素用指定該TLD檔案的URI,在JSP檔案中需要通過這個URI來引入該標籤庫描述檔案。
  • <function>元素用於描述一個EL自定義函式,其中:<name>子元素用於指定EL自定義函式的名稱;<function-class>子元素用於指定完整的java類名;<function-signature>子元素用於指定java類中的靜態方法簽名,方法簽名必須指明方法的返回值型別及各個引數的型別,各個引數之間用逗號分隔。

九、EL注意事項

EL表示式時JSP2.0規範中的一門技術。因此,若想正確解析EL表示式,需要使用支援Servlet2.4/JSP2.0技術的web伺服器

注意:有些Tomcat伺服器如不能使用EL表示式

(1)升級成Tomcat6

(2)在JSP中加入<%@page isELIgnored="false"%>

十、EL表示式保留關鍵字

十一、JSTL中的常用EL函式

  • 由於在JSP頁面中顯示資料時,經常需要對顯示的字串進行處理,SUN公司針對於一些常見處理定義了一套EL函式庫供開發者使用。
  • 這些EL函式在JSTL開發包中進行描述,因此在JSP頁面中使用Sun公司的EL函式庫,需要匯入JSTL開發包,並在頁面中匯入EL函式庫,如下所示:

在頁面中使用JSTL定義的EL函式:

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

十二、fn:toLowerCase

fn:toLowerCase函式將一個字串中包含的所有字元轉換為小寫形式,並返回轉換後的字串,它接收一個字串型別的引數,例如:

fn:toLowerCase("Www.IT315.org")的返回值為字串"www.it315.org"

fn:toLowerCase("")的返回值為空字串

十三、fn:toUpperCase

fn:toUpperCase函式將一個字串中包含的所有字元轉換為大寫形式,並返回轉換後的字串,它接收一個字串型別的引數。例如:

fn:toLowerCase("Www.IT315.org")的返回值為字串"WWW.IT315.ORG"

fn:toLowerCase("")的返回值為空字串

十四、fn:trim

fn:trim函式刪除一個字串的首尾的空格,並返回刪除空格後的結果字串,它接收一個字串型別的引數。需要注意的是,fn:trim函式不能刪除字串中間位置的空格。

十五、fn:length

fn:length函式返回一個集合或陣列大小,或返回一個字串中包含的字元的個數,返回值為int型別。

fn:length函式接收一個引數,這個引數可以是<c:forEach>標籤的items屬性支援的任何型別,包括阿任意型別的陣列、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的例項物件和字串。

如果fn:length函式的引數為null或者是元素個數為0的集合或陣列物件,則函式返回0;如果引數是空字串,則函式返回0。

十六、fn:split

fn:split函式以指定字串作為分隔符,將一個字串分割成字串陣列並返回這個字串陣列。

fn:split函式接收兩個字串型別的引數,第一個引數表示要分割的字串,第二個引數表示作為分隔符的字串。

例如:fn.split("www.it315.org",".")[1]的返回值為字串"it315"

十七、fn:join

fn:join函式以一個字串作為分隔符,將一個字串陣列中的所有元素合併為一個字串並返回合併後的結果字串。fn:join函式接收兩個引數,第一個引數是要操作的字串陣列,第二個引數是作為分隔符的字串。

如果fn:join函式的第二個引數是空字串,則fn:join函式的返回值直接將元素連線起來。例如:

假設stringArray是儲存在web域中的一個屬性,它表示一個值為{"www","it315","org"}的字串陣列。

則fn:join(stringArray, ".")返回字串"www.it315.org"

fn:join(fn:split("www,it315,org",","),".")的返回值為字串"www.it315.org"

十八、fn:indexOf

fn:indexOf函式返回指定字串在一個字串中第一次出現的索引值,返回值為int型別。fn:indexOf函式接收兩個字串型別的引數,如果第一個引數字串中包含第二個引數字串,那麼,不管第二個引數字串在第一個引數字串中出現幾次,fn:indexOf函式總是返回第一次出現的索引值;如果第一個引數中不包含第二個引數,則fn:indexOf函式返回-1;如果第二個引數為空字串,則fn:indexOf函式總是返回0。

例如:fn:indexOf("www.it315.org", "t3")的返回值是5

十九、fn:contains

fn:contains函式檢測一個字串中是否包含指定的字串,返回值為布林型別。fn:contains函式在比較兩個字串是否相等時是大小寫敏感的。

fn:contains函式接收兩個字串型別的引數,如果第一個引數字串中包含第二個引數字串,則fn:contains函式返回true,否則返回false。如果第二個引數的值為空字串,則fn:contains函式總是返回true。實際上,fn:contains(string, substring)等價於fn:indexOf(string,substring) != -1。

忽略大小寫的EL函式:fn:containsIgnoreCase

二十、fn:startsWith

fn:startsWith函式用於檢測一個字串是否是以指定字串開始的,返回值為布林型別。

fn:startsWith函式接收兩個字串型別的引數,如果第一個引數字串以第二個引數字串開始,則函式返回true,否則函式返回false。如果第二個引數為空字串,則fn:startsWith函式總是返回true。

例如:fn:startsWith("www.it315.org","it315")的返回值為false

與之對應的EL函式:fn:endsWith

二十一、fn:replace

fn:replace函式將一個字串中包含的指定子字串替換為其它的指定字串,並返回替換後的結果字串。

fn:replace方法接收三個字串型別的引數,第一個引數表示要操作的源字串,第二個引數表示源字串中要被替換的子字串,第三個引數表示要被替換成的字串。

例如:fn:replace("www it315 org"," ",".")的返回值為字串"www.it315.org"

二十二、fn:substring

fn:substring函式用於擷取一個字串的子字串並返回擷取到的子字串。fn:substring函式接收三個引數,第一個引數是用於指定要操作的源字串,第二個引數是用於指定擷取子字串開始的索引值,第三個引數用於指定擷取子字串結束的索引值。第二個引數和第三個引數都是int型別,其值都從0開始。

例如:fn:substring("www.it315.org",4,9)的返回值為字串"it315"

二十三、fn:substringAfter

fn:substringAfter函式用於擷取並返回一個字串中指定子字串第一次出現之後的子字串。

fn:substringAfter函式接收兩個字串型別的引數,第一個引數表示要操作的源字串,第二個引數表示指定的子字串,例如:

fn:substringAfter("www.it315.org",".")的返回值為字串"it315.org"。

與之對應的EL函式為:fn:substringBefore