一、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表達式是JSP 2.0(JavaEE1.4)規範中的一門技術 。因此,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。
- 注意:有些Tomcat服務器如不能使用EL表達式:a、升級成tomcat6 b、在JSP中加入<%@ page isELIgnored="false" %>
三、獲取數據
- 使用EL表達式獲取數據語法:“${標識符}”
- EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。
-
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 : “”}
- EL表達式保留關鍵字:所謂保留字的意思是指變量在命名時,應該避開上述的名字,以免程序編譯時發生錯誤
五、獲得web開發常用對象
- EL表達式語言中定義了11個隱含對象,使用這些隱含對象可以很方便地獲取web開發中的一些常見對象,並讀取這些對象的數據
- 語法:${隱式對象名稱} :獲得對象的引用
- 注意事項
- 測試headerValues時,如果頭裏面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”]
- 測試cookie時,例${cookie.key}取的是cookie對象,如訪問cookie的名稱和值,須${cookie.key.name}或${cookie.key.value}
六、使用EL調用Java方法
- EL表達式語法允許開發人員開發自定義函數,以調用Java類的方法
- 示例:${prefix:method(params)}
- 在EL表達式中調用的只能是Java類的靜態方法。
- 這個Java類的靜態方法需要在TLD文件中描述,纔可以被EL表達式調用。
- EL自定義函數用於擴展EL表達式的功能,可以讓EL表達式完成普通Java程序代碼所能完成的功能。
- 一般來說, EL自定義函數開發與應用包括以下三個步驟:
- ----編寫一個Java類的靜態方法
- ----編寫標籤庫描述符(tld)文件,在tld文件中描述自定義函數。
- ----在JSP頁面中導入和使用自定義函數
- 示例:對給定的URL進行URL編碼,開發對html標籤進行轉義的el function
- 開發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類中的靜態方法的簽名,方法簽名必須指明方法的返回值類型及各個參數的類型,各個參數之間用逗號分隔。
七、SUN公司: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:toUpperCase("Www.IT315.org") 的返回值爲字符串“WWW.IT315.ORG” fn:toUpperCase("")的返回值爲空字符串
- fn:trim
fn:trim函數刪除一個字符串的首尾的空格,並返回刪除空格後的結果字符串,它接收一個字符串類型的參數。需要注意的是,fn:trim函數不能刪除字符串中間位置的空格。 例如,fn:trim(" www.it315.org ") 的返回值爲字符串“www.it 315.org”。
- 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