您好,登錄后才能下訂單哦!
簡單來說,我們在一個類中的某個方法,可以使用EL進行調用,這個能被EL表達式調用的方法稱之為EL函數,但是這種方式必須滿足以下兩點要求:
① 在EL表達式中調用的只能是Java類的靜態方法
② 這個Java類的靜態方法需要在我們另外在自定義的TLD文件中描述
滿足以上兩點才能被EL表達式調用。
語法: ${prefix:方法名(參數列表) }
例1:使用EL函數來實現HTML語言的過濾轉義
在web工程中自定義一個HTMLFilter類,同時定義一個靜態的filter方法:
package com.bjpowernode.filter; public class HtmlFilter { public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuilder result = new StringBuilder(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append("<"); break; case '>': result.append(">"); break; case '&': result.append("&"); break; case '"': result.append("""); break; default: result.append(content[i]); } } return (result.toString()); } }
這個類中的filter方法能將HTML語言轉換為普通的字符串,當然這個類和方法在Tomcat中也有示例,路徑為【Tomcat】--->【webapps】--->【examples】--->【WEB-INF】--->【classes】--->【utils】,找到HTMLFilter.java就是了。
好了我們已經有靜態的方法了,現在需要在TLD文件中對這個方法進行描述才能在JSP中使用。
TLD文件需要在“WEB-INF”文件中創建和定義,在哪里找模板呢,依然可以到Tomcat中尋找。在【Tomcat】--->【webapps】--->【examples】--->【WEB-INF】--->【jsp2】中有一個“jsp2-example-taglib.tld”文件,我們就可以對這個文件復制其“首尾”啦。
在web工程下建立“elfunction.tld”文件,從“jsp2-example-taglib.tld”文件模板中抄首抄尾,其中<function>標簽也是我們需要的:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>elfunction</uri> <function> <description>Converts Html to String</description> <name>filter</name> <function-class>com.bjpowernode.filter.HtmlFilter</function-class> <function-signature>java.lang.String filter( java.lang.String )</function-signature> </function> </taglib>
在TLD文件中要對某Java靜態方法進行描述最重要的就是要定義<function>標簽,在<function>標簽下,<description>只是對該方法的描述,不是必需的;<name>指定在JSP上使用該EL函數時應該使用的標簽名;<function-class>指定該方法所在的類,必需提供完整類名(包括包名);<function-signature>是方法簽名,就是對所使用的靜態方法的聲明,所有的參數都必需指定完整類名,包括返回值類型和參數列表類型。
好了,接下來我們在JSP頁面中就可使用剛才定義好的EL函數了,當然,首先我們應該現在JSP上使用tablib指定導入標簽庫,并定義好標簽前綴(prefix):
<%@ taglib uri="elfunction" prefix="elfn" %>
最后再在JSP頁面的主體中使用EL函數:
${elfn:filter("<a href='www.baidu.com'>百度</a>") }
在瀏覽器中觀察:
這樣,使用EL函數就將一個超鏈接過濾轉義成普通的文本了。
通過上面的例子,使用EL函數似乎和自定義標簽一樣,可以移除JSP中出現的Java代碼,但是EL函數比自定義標簽的不足之處在于,EL函數只能移除與web無法的方法,無法移除與web有關的方法,比如某些方法中含有HttpServletRequest、HttpServletResponse等等這樣的對象,因為在定義靜態方法的時候,我們無法使用到這些web對象,這些web對象都是由Tomcat服務器返回這些接口的實例對象的,這都是服務器中低層封裝好的,我們平常使用靜態方法根本無法獲取,因此此時還是需要使用自定義標簽的。
Sun公司也幫我們制作了一個函數庫,在這函數庫中封裝好了一些常用的EL函數,平時我們可以先看看在這個函數庫中是否有滿足我們需求的EL函數,如果沒有再像上面一樣自定義。
Sun公司定義的EL函數封裝和描述在JSTL標簽庫中,因此在JSP頁面中使用這個EL函數庫時,應該先導入JSTL開發包,并在該頁面中導入EL函數庫。如果是使用JavaEE5.0以上的,JSTL包會自動導入,可以在【Java EE 5 Libraries】庫中看到:
在這個“jstl-1.2.jar”中,查看其“META-INF”文件,有一個“fn.tld”文件,這個就是Sun公司封裝在JSTL中的EL函數的TLD文件:
我們可以點擊進去看看,這個tld文件中封裝了所有Sun公司設計好的EL函數,同時也提供了taglib指令的uri,和推薦前綴(prefix):
那么我們在JSP頁面中導入tablib指令時只要這兩個信息即可:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
這樣我們就可以在JSP頁面中使用Sun公司開發好的EL函數了。
例2: fn:toLowerCase函數
${fn:toLowerCase("AAA") }
輸出:aaa。
例3: fn:length()函數
${fn:length("aaa") }
輸出:3
例4: fn:length函數
<% request.setAttribute("arr", new String[5]); %> ${fn:length(arr) }
輸出:5
例5:使用JSTL與EL函數來遍歷集合
需同時導入JSTL與EL的tablib指令:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
在JSP主體中的代碼如下:
<% ArrayList<String> list = new ArrayList<String>(); list.add("Ding"); list.add("LRR"); request.setAttribute("list", list); %> <c:forEach var="i" begin="0" end="${fn:length(list)}"> ${list[i] } <br> </c:forEach>
在瀏覽器中觀察:
例6: fn:join函數
fn:join函數第一個參數為字符串數組或集合,第二個參數為將該字符串數組或集合相連起來的分隔符。
<% String[] arr = {"www","bjpowernode","com"}; pageContext.setAttribute("arr", arr); %> ${fn:join(arr,".") }
輸出:www.bjpowernode.com
注:如果fn:join函數的第二個參數為空字符串“”,那么將會把所有元素直接相連。
例7: fn:contains函數
fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值為布爾類型。注意,fn:contains函數只能檢測字符串,不能以數組來檢測,如果第二個參數為空字符串“”,那么fn:contains函數總是返回true。
${fn:contains("fjdingsd","fj") }
輸出:true。
注:fn:contains函數是大小寫敏感的,如果要忽略大小寫,請使用fn:containsIgnoreCase函數。
例8: 取出表單類型為checkbox的數據回顯
模擬在表單提交失敗時,對于表單中類型為“checkbox”的表單項的數據,可以使用EL函數從重新轉發回的request獲取數據,經過一定的處理,使該頁面中的表單項數據重新顯示:
<% request.setAttribute("hobbies", new String[]{"sing","dance"}); %> <input type="checkbox" name="hobbies" value="sing" ${fn:contains(fn:join(hobbies,""),"sing")?'checked':'' } >唱歌 <br> <input type="checkbox" name="hobbies" value="dance" ${fn:contains(fn:join(hobbies,""),"dance")?'checked':'' }>跳舞 <br> <input type="checkbox" name="hobbies" value="game" ${fn:contains(fn:join(hobbies,""),"game")?'checked':'' }>游戲 <br> <input type="checkbox" name="hobbies" value="movie" ${fn:contains(fn:join(hobbies,""),"movie")?'checked':'' }>電影 <br>
在瀏覽器中觀察:
例9: fn:escapeXml函數
功能與例1相同,對HTML語言進行過濾轉義成字符串。
${fn:escapeXml("<a href='www.baidu.com'>百度</a>") }
瀏覽器中觀察:
例10:自定義字符串連接的EL函數(因為在EL表達式中不支持使用”+”作為字符串的連接符)
在一個類中定義字符串連接的靜態方法:
public class MyElFunctions { public static String connectString(String str1,String str2) { return str1+str2; } }
在【WEB-INF】中自定義TLD文件中聲明這個方法,同時定義自己的uri:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>myelfunction</uri> <function> <description>Connect two Strings</description> <name>connect</name> <function-class>com.bjpowernode.elfunctions.MyElFunctions</function-class> <function-signature>java.lang.String connectString( java.lang.String , java.lang.String )</function-signature> </function> </taglib>
在JSP頁面中加入taglib聲明:
<%@ taglib uri="myelfunction" prefix="elfn" %>
在JSP頁面中的主體代碼為:
<% User u = new User(); u.setUsername("fjdingsd"); session.setAttribute("user", u); %> ${sessionScope.user!=null ? elfn:connect("歡迎您: ",user.username):'' }
在瀏覽器中觀察:
通常,我們在項目中會有專門的一個類來作為EL函數的方法實現類,在這個類中都是定義EL函數的靜態方法。
在JSTL包中的fn.tld文件中還有很多EL函數,這里就不再一一介紹了,如果我們有需要,可以在這個文件中查看,基本每個函數都有示例。
EL表達式到這里就差不多介紹完了,主要就是這四大功能(獲取數據,執行運算,使用隱式對象,調用Java方法),最后就來簡單說明一下EL表達式的注意事項:EL表達式是JSP2.0規范中的一門技術,因此若想正確解析EL表達式,必須使用Servlet2.4/JSP2.0技術及以上的WEB服務器。
有些Tomcat服務器不能使用EL表達式的話,要么將Tomcat升級6及以上的版本,要么在JSP頁面中加入page指令<%@ page isELIgnored="false" %>
以上所述是小編給大家介紹的EL調用Java方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。