簡單來說,我們在一個類中的某個方法,可以使用el進行調用,這個能被el表達式調用的方法稱之為el函數,但是這種方式必須滿足以下兩點要求:
① 在el表達式中調用的只能是java類的靜態方法
② 這個java類的靜態方法需要在我們另外在自定義的tld文件中描述
滿足以上兩點才能被el表達式調用。
語法: ${prefix:方法名(參數列表) }
例1:使用el函數來實現html語言的過濾轉義
在web工程中自定義一個htmlfilter類,同時定義一個靜態的filter方法:
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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>標簽也是我們需要的:
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?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):
1
|
|
<%@ taglib uri= "elfunction" prefix= "elfn" %> |
最后再在jsp頁面的主體中使用el函數:
1
|
|
${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指令時只要這兩個信息即可:
1
|
|
<%@ taglib uri= " http://java.sun.com/jsp/jstl/functions " prefix= "fn" %> |
這樣我們就可以在jsp頁面中使用sun公司開發好的el函數了。
例2: fn:tolowercase函數
1
|
|
${fn:tolowercase( "aaa" ) } |
輸出:aaa。
例3: fn:length()函數
1
|
|
${fn:length( "aaa" ) } |
輸出:3
例4: fn:length函數
1
|
2
3
4
|
<% request.setattribute( "arr" , new string[ 5 ]); %> ${fn:length(arr) } |
輸出:5
例5:使用jstl與el函數來遍歷集合
需同時導入jstl與el的tablib指令:
1
|
2
|
<%@ taglib uri= " http://java.sun.com/jsp/jstl/core " prefix= "c" %> <%@ taglib uri= " http://java.sun.com/jsp/jstl/functions " prefix= "fn" %> |
在jsp主體中的代碼如下:
1
|
2
3
4
5
6
7
8
9
10
|
<% 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函數第一個參數為字符串數組或集合,第二個參數為將該字符串數組或集合相連起來的分隔符。
1
|
2
3
4
5
|
<% string[] arr = { "www" , "bjpowernode" , "com" }; pagecontext.setattribute( "arr" , arr); %> ${fn:join(arr, "." ) } |
輸出:
注:如果fn:join函數的第二個參數為空字符串“”,那么將會把所有元素直接相連。
例7: fn:contains函數
fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值為布爾類型。注意,fn:contains函數只能檢測字符串,不能以數組來檢測,如果第二個參數為空字符串“”,那么fn:contains函數總是返回true。
1
|
|
${fn:contains( "fjdingsd" , "fj" ) } |
輸出:true。
注:fn:contains函數是大小寫敏感的,如果要忽略大小寫,請使用fn:containsignorecase函數。
例8: 取出表單類型為checkbox的數據回顯
模擬在表單提交失敗時,對于表單中類型為“checkbox”的表單項的數據,可以使用el函數從重新轉發回的request獲取數據,經過一定的處理,使該頁面中的表單項數據重新顯示:
1
|
2
3
4
5
6
7
8
9
10
11
|
<% 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語言進行過濾轉義成字符串。
1
|
|
${fn:escapexml( "<a href='www.baidu.com'>百度</a>" ) } |
瀏覽器中觀察:
例10:自定義字符串連接的el函數(因為在el表達式中不支持使用”+”作為字符串的連接符)
在一個類中定義字符串連接的靜態方法:
1
|
2
3
4
5
|
public class myelfunctions { public static string connectstring(string str1,string str2) { return str1+str2; } } |
在【web-inf】中自定義tld文件中聲明這個方法,同時定義自己的uri:
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?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聲明:
1
|
|
<%@ taglib uri= "myelfunction" prefix= "elfn" %> |
在jsp頁面中的主體代碼為:
1
|
2
3
4
5
6
|
<% 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方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!