一、概念
表達式語言(Expression Language),或稱EL表達式,簡稱EL,是Java中的一種特殊的通用編程語言,借鑒于JavaScript和XPath。主要作用是在Java Web應用程序嵌入到網(wǎng)頁(如JSP)中,用以訪問頁面的上下文以及不同作用域中的對象 ,取得對象屬性的值,或執(zhí)行簡單的運算或判斷操作。EL在得到某個數(shù)據(jù)時,會自動進行數(shù)據(jù)類型的轉換。
主要作用:
1) 獲取數(shù)據(jù)
EL表達式主要用于替換JSP頁面中的腳本表達式<%= %>,以從各種類型的web域 中檢索java對象、獲取數(shù)據(jù)。(某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數(shù)組)
2) 執(zhí)行運算
利用EL表達式可以在JSP頁面中執(zhí)行一些基本的關系運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}
3) 獲取web開發(fā)常用對象 EL
表達式定義了一些隱式對象,利用這些隱式對象,web開發(fā)人員可以很輕松獲得對web常用對象的引用,從而獲得這些對象中的數(shù)據(jù)。
4) 調(diào)用Java方法
EL表達式允許用戶開發(fā)自定義EL函數(shù),以在JSP頁面中通過EL表達式調(diào)用Java類的方法。
注意:<%@ pageisELIgnored=”true” %>
表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默認的啟用EL語言
二、語法
以“${”開始,以“}”作為結束:
${EL表達式}
實例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
${ str } //輸出字符串變量str的值 ${ 1 + 2 } //輸出1+2的結果 ${ user.name} //輸出user對象的name屬性 訪問對象user的getName()方法以得到name成員的值。 ${user[“name”] } //同上 ${ sessionScope[“user”].name } //同上 ${list[ 0 ]} //訪問list對象的第一項。 ${map[“key”]} //訪問map指定鍵的值。 |
三、取操作符
EL提供 . 和 [ ] 兩種運算符來存取數(shù)據(jù):
. 訪問一個Bean屬性或者一個映射條目 如:${ user.name}
[ ] 可以訪問集合或者是數(shù)組的元素、也可以訪問Bean的屬性。 如:${ arr[0].name}
異同:
相同:可以用來訪問對象的屬性
差異:當要存取的屬性名稱中包含一些特殊字符,如 . 或 ? 或 - 等非字母或數(shù)字的符號,就一定要使用 [],如user.my-name應{user[“my-name”]}
四、運算符:
● 算術運算符有五個:+、-、*、/或div、%或mod
● 關系運算符有六個:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
● 邏輯運算符有三個:&&或and、||或or、!或not
● 其它運算符有三個:Empty運算符、條件運算符、()運算符
五、隱含對象
JSP EL支持下表列出的隱含對象:
可以在表達式中使用像變量一樣使用這些對象。
按功能分組如下:
1) 訪問參數(shù)值:
param : 可取得對應單個請求參數(shù)名的值。如:$(param.name) 相當于 request.getParameter (name)。
paramValues: 可根據(jù)參數(shù)名取得對于的字符串數(shù)組。如:${paramvalues.name) 相當于 request.getParamterValues(name)。
注:param對象返回單一的字符串,而paramValues對象則返回一個字符串數(shù)組。
2) 訪問頭信息
header:可以取得請求頭信息中,對應的單個字符串頭值。表達式 header.name相當于request.getHeader(name)。如{header[“user-agent”]}。可打印出 user-agent 信息頭。
headerValues:可將請求頭名稱映射到一個數(shù)值數(shù)組。如 ${headerValues.name} 相當于 request.getHeaderValues(name)。
注:header對象返回單一值,而headerValues則返回一個字符串數(shù)組。
3) 訪問其他有關用戶要求或頁面的詳細信息
pageContext:
pageContext.request|取得請求對象{pageContext.session} |取得session對象
pageContext.request.queryString|取得請求的參數(shù)字符串{pageContext.request.requestURL} |取得請求的URL,但不包括請求之參數(shù)字符串
pageContext.request.contextPath|服務的webapplication的名稱{pageContext.request.method} |取得HTTP的方法(GET、POST)
pageContext.request.protocol|取得使用的協(xié)議(HTTP/1.1、HTTP/1.0){pageContext.request.remoteUser} |取得用戶名稱
pageContext.request.remoteAddr|取得用戶的IP地址{pageContext.session.new} |判斷session是否為新的,所謂新的session,表示剛由 server產(chǎn)生而client尚未使用 的
pageContext.session.id|取得session的ID{pageContext.servletContext.serverInfo}|取得主機端的服務信息
4)訪問不同作用域的變量,如 Web 上下文、會話、請求、頁面:
pageScope :取得頁面范圍的值
如用 pageScope.objectName訪問一個JSP中頁面范圍的對象,還可以使用{pageScope.objectName.attributeName} 訪問對象的屬性。
requestScope:取得請求范圍的變量值
該對象允許訪問請求對象的屬性。如用 requestScope.objectName訪問一個JSP請求范圍的對象,還可以使用{requestScope.objectName.attributeName} 訪問對象的屬性。
sessionScope:取得會話范圍的變量值
該對象允許訪問會話對象的屬性。如:$sessionScope.name}
applicationScope:取得應用程序范圍的變量值
該隱式對象允許訪問應用程序范圍的對象
5) 訪問Cookie中的值
如要取得cookie中有一個設定名稱為username的值,可以使用${cookie.username} 來取得它。
六、使用sun提供的標準 EL函數(shù)庫
由于在JSP頁面中顯示數(shù)據(jù)時,經(jīng)常需要對顯示的字符串進行處理,SUN公司針對于一些常見處理定義了一套EL函數(shù)庫供開發(fā)者使用。
這些EL函數(shù)在JSTL開發(fā)包中進行描述,因此在JSP頁面中使用SUN公司的EL函數(shù)庫,需要導入JSTL開發(fā)包,并在頁面中導入EL函數(shù)庫。
使用EL函數(shù)庫
1) 導入 jstl jar包
2) 在相應的jsp頁面添加引用
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
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" import = "java.util.*" %> <!--導入需要使用taglib指令 --> <%@ taglib prefix= "fn" uri= "http://java.sun.com/jsp/jstl/functions" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" > <title>el function demo</title> </head> <body> <% String[] strs = { "a" , "b" , "c" }; //定義一個字符數(shù)組 List list = new ArrayList(); //定義一個list集合 list.add( "a" ); //向集合中添加一個字符 pageContext.setAttribute( "arr" , strs); //將字符數(shù)據(jù)以arr的名字保存在page域中 pageContext.setAttribute( "list" , list); //將list集合以list的名字保存在page域中 %> ${fn:length(arr) }<br/><!-- 3 --> ${fn:length(list) }<br/><!-- 1 --> ${fn:toLowerCase( "Hello" ) }<br/> <!-- hello --> ${fn:toUpperCase( "Hello" ) }<br/> <!-- HELLO --> ${fn:contains( "abc" , "a" )}<br/><!-- true --> ${fn:containsIgnoreCase( "abc" , "Ab" )}<br/><!-- true --> ${fn:contains(arr, "a" )}<br/><!-- true --> ${fn:containsIgnoreCase(list, "A" )}<br/><!-- true --> ${fn:endsWith( "Hello.java" , ".java" )}<br/><!-- true --> ${fn:startsWith( "Hello.java" , "Hell" )}<br/><!-- true --> ${fn:indexOf( "Hello-World" , "-" )}<br/><!-- 5 --> ${fn:join(arr, ";" )}<br/><!-- a;b;c --> ${fn:replace( "Hello-World" , "-" , "+" )}<br/><!-- Hello+World --> ${fn:join(fn:split( "a;b;c;" , ";" ), "-" )}<br/><!-- a-b-c --> ${fn:substring( "0123456789" , 6 , 9 )}<br/><!-- 678 --> ${fn:substring( "0123456789" , 5 , - 1 )}<br/><!-- 56789 --> ${fn:substringAfter( "Hello-World" , "-" )}<br/><!-- World --> ${fn:substringBefore( "Hello-World" , "-" )}<br/><!-- Hello --> ${fn:trim( " a b c " )}<br/><!-- a b c --> ${fn:escapeXml( "<html></html>" )}<br/> <!-- <html></html> --> </body> </html> |
函數(shù)庫詳細介紹
String toUpperCase(String input):把字符串參數(shù)轉換成大寫,并返回
String toLowerCase(String input):把字符串參數(shù)轉換成小寫,并返回
int indexOf(String input, String substring):返回input中substring出現(xiàn)的索引位置
boolean contains(String input, String substring):查看input中是否包含substring,包含返回true,否則返回false;
boolean containsIgnoreCase(String input, String substring):在忽略大小寫的情況下,查看input中是否包含substring,包含返回true,否則返回false
boolean startsWith(String input, String substring):判斷input是否是以substring為前綴,如果是就返回true,否則就返回false
boolean endsWith(String input, String substring):判斷input是否是以substring為后綴,如果是就返回true,否則就返回false
String substring(String input, int beginIndex, int endIndex):以beginIndex為開始值,endIndex為結束值,在input上截取子串
String substringAfter(String input, String substring):獲取input中,substring所在位置后面的字符串
substringBefore(String input, String substring):獲取input中,substring所在位置前面的字符串 String escapeXml(String input):把input中“<”、“>“、”&“、”'“、“””進行轉義;
String trim(String input):去除input中的前后空格;
String replace(String input, String substringBefore, String substringAfter):將input中的substringBefore替換成substringAfter;
String[] split(String input, String delimiters):以delimiters為標識分割input,返回一個字符串數(shù)組;
int length(Object obj):可以獲取字符串、數(shù)組、各種集合的長度;
String join(String array[], String separator):將array數(shù)組中的元素以separator連接起來,返回一個字符串
七、EL調(diào)用自定義函數(shù) (調(diào)用普通類的靜態(tài)方法)
EL很強大,除了使用SUN提供的標準EL函數(shù)庫外,還可以調(diào)用自定義函數(shù):
● EL表達式語法允許開發(fā)人員開發(fā)自定義函數(shù),以調(diào)用Java類的方法。語法:${prefix:method(params)}
● 在EL表達式中調(diào)用的只能是Java類的靜態(tài)方法,這個Java類的靜態(tài)方法需要在TLD文件中描述,才可以被EL表達式調(diào)用。
● EL自定義函數(shù)用于擴展EL表達式的功能,可以讓EL表達式完成普通Java程序代碼所能完成的功能。
EL Function開發(fā)步驟
只要實現(xiàn)以下三個步驟就可以在靜態(tài)頁面中用${prefix:method(params)} 調(diào)用自定義function了
編寫一個Java類的靜態(tài)方法
編寫標簽庫描述符(tld)文件,在tld文件中描述自定義函數(shù)。
在JSP頁面中導入和使用自定義函數(shù)
下面來個案例:
1)編寫一個Java類的靜態(tài)方法
1
2
3
4
5
|
public class GetMax { public static int togetMax( int a, int b){ return a>b?a:b; } } |
2)編寫標簽庫描述符(tld)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?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" > <tlib-version> 1.0 </tlib-version><!-- 定義的版本 --> < short -name>mytaglib</ short -name><!--這個名字可以隨便取,盡量與文件名相同,這樣我們知道文件在哪兒 并與prefix對應--> <uri>http: //localhost:8080/springmvc-1</uri><!-- 這個地址是隨便取得。到時候jsp頁面引入這個地址 --> <function><!-- 定義函數(shù) --> <name>toGetMax</name> <function- class >elfunction.GetMax</function- class ><!-- 定義函數(shù)的類全名稱 --> <function-signature> int toGetMax( int , int )</function-signature> <!--說明 返回值類型 函數(shù)名 以及 參數(shù)類型 --> </function> </taglib> |
3)在web.xml中指定tld文件的位置(這步可以省略,因為應用會自動找到 /WEB-INF/下的tld文件)
1
2
3
4
5
6
7
8
9
10
11
12
|
<jsp-config> <taglib> <!-- 此處uri可以自己隨便定義,但后面用時一定與這里一樣 --> <taglib-uri> http: //localhost:8080/springmvc-1 </taglib-uri> <!-- tld文件的路徑 --> <taglib-location> /WEB-INF/tags/mytaglib.tld </taglib-location> </taglib> </jsp-config> |
4)在JSP頁面中導入和使用自定義函數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" %> <%@ taglib uri= "http://localhost:8080/springmvc-1" prefix= "mytaglib" %> <!-- prefix 是前綴的意思,應與mytaglib.tld中的< short -name>對應 --> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" > <title>custom EL function test</title> </head> <body> 1 和 2 求最大值 = ${mytaglib:toGetMax( 1 , 2 )} </body> </html> |
運行截圖
希望本篇文章對您有所幫助
原文鏈接:http://www.2cto.com/kf/201701/585339.html