JAVA JSP頁(yè)面技術(shù)之EL表達(dá)式整理歸納總結(jié)
一、概念
表達(dá)式語(yǔ)言(Expression Language),或稱EL表達(dá)式,簡(jiǎn)稱EL,是Java中的一種特殊的通用編程語(yǔ)言,借鑒于JavaScript和XPath。主要作用是在Java Web應(yīng)用程序嵌入到網(wǎng)頁(yè)(如JSP)中,用以訪問(wèn)頁(yè)面的上下文以及不同作用域中的對(duì)象 ,取得對(duì)象屬性的值,或執(zhí)行簡(jiǎn)單的運(yùn)算或判斷操作。EL在得到某個(gè)數(shù)據(jù)時(shí),會(huì)自動(dòng)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。
主要作用:
1) 獲取數(shù)據(jù)
EL表達(dá)式主要用于替換JSP頁(yè)面中的腳本表達(dá)式<%= %>,以從各種類型的web域 中檢索java對(duì)象、獲取數(shù)據(jù)。(某個(gè)web域 中的對(duì)象,訪問(wèn)javabean的屬性、訪問(wèn)list集合、訪問(wèn)map集合、訪問(wèn)數(shù)組)
2) 執(zhí)行運(yùn)算
利用EL表達(dá)式可以在JSP頁(yè)面中執(zhí)行一些基本的關(guān)系運(yùn)算、邏輯運(yùn)算和算術(shù)運(yùn)算,以在JSP頁(yè)面中完成一些簡(jiǎn)單的邏輯運(yùn)算。${user==null}
3) 獲取web開(kāi)發(fā)常用對(duì)象 EL
表達(dá)式定義了一些隱式對(duì)象,利用這些隱式對(duì)象,web開(kāi)發(fā)人員可以很輕松獲得對(duì)web常用對(duì)象的引用,從而獲得這些對(duì)象中的數(shù)據(jù)。
4) 調(diào)用Java方法
EL表達(dá)式允許用戶開(kāi)發(fā)自定義EL函數(shù),以在JSP頁(yè)面中通過(guò)EL表達(dá)式調(diào)用Java類的方法。
注意:<%@ pageisELIgnored=”true” %>
表示是否禁用EL語(yǔ)言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默認(rèn)的啟用EL語(yǔ)言
二、語(yǔ)法
以“${”開(kāi)始,以“}”作為結(jié)束:
${EL表達(dá)式}
實(shí)例:
${ str } //輸出字符串變量str的值 ${ 1 + 2 } //輸出1+2的結(jié)果 ${ user.name} //輸出user對(duì)象的name屬性 訪問(wèn)對(duì)象user的getName()方法以得到name成員的值。 ${user[“name”] } //同上 ${ sessionScope[“user”].name } //同上 ${list[0]} //訪問(wèn)list對(duì)象的第一項(xiàng)。 ${map[“key”]} //訪問(wèn)map指定鍵的值。
三、取操作符
EL提供 . 和 [ ] 兩種運(yùn)算符來(lái)存取數(shù)據(jù):
. 訪問(wèn)一個(gè)Bean屬性或者一個(gè)映射條目 如:${ user.name}
[ ] 可以訪問(wèn)集合或者是數(shù)組的元素、也可以訪問(wèn)Bean的屬性。 如:${ arr[0].name}
異同:
相同:可以用來(lái)訪問(wèn)對(duì)象的屬性
差異:當(dāng)要存取的屬性名稱中包含一些特殊字符,如 . 或 ? 或 - 等非字母或數(shù)字的符號(hào),就一定要使用 [],如user.my-name應(yīng){user[“my-name”]}
四、運(yùn)算符:
● 算術(shù)運(yùn)算符有五個(gè):+、-、*、/或div、%或mod
● 關(guān)系運(yùn)算符有六個(gè):==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
● 邏輯運(yùn)算符有三個(gè):&&或and、||或or、!或not
● 其它運(yùn)算符有三個(gè):Empty運(yùn)算符、條件運(yùn)算符、()運(yùn)算符
五、隱含對(duì)象
JSP EL支持下表列出的隱含對(duì)象:
可以在表達(dá)式中使用像變量一樣使用這些對(duì)象。
按功能分組如下:
1) 訪問(wèn)參數(shù)值:
param : 可取得對(duì)應(yīng)單個(gè)請(qǐng)求參數(shù)名的值。如:$(param.name) 相當(dāng)于 request.getParameter (name)。
paramValues: 可根據(jù)參數(shù)名取得對(duì)于的字符串?dāng)?shù)組。如:${paramvalues.name) 相當(dāng)于 request.getParamterValues(name)。
注:param對(duì)象返回單一的字符串,而paramValues對(duì)象則返回一個(gè)字符串?dāng)?shù)組。
2) 訪問(wèn)頭信息
header:可以取得請(qǐng)求頭信息中,對(duì)應(yīng)的單個(gè)字符串頭值。表達(dá)式 header.name相當(dāng)于request.getHeader(name)。如{header[“user-agent”]}??纱蛴〕?user-agent 信息頭。
headerValues:可將請(qǐng)求頭名稱映射到一個(gè)數(shù)值數(shù)組。如 ${headerValues.name} 相當(dāng)于 request.getHeaderValues(name)。
注:header對(duì)象返回單一值,而headerValues則返回一個(gè)字符串?dāng)?shù)組。
3) 訪問(wèn)其他有關(guān)用戶要求或頁(yè)面的詳細(xì)信息
pageContext:
pageContext.request|取得請(qǐng)求對(duì)象{pageContext.session} |取得session對(duì)象
pageContext.request.queryString|取得請(qǐng)求的參數(shù)字符串{pageContext.request.requestURL} |取得請(qǐng)求的URL,但不包括請(qǐng)求之參數(shù)字符串
pageContext.request.contextPath|服務(wù)的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}|取得主機(jī)端的服務(wù)信息
4)訪問(wèn)不同作用域的變量,如 Web 上下文、會(huì)話、請(qǐng)求、頁(yè)面:
pageScope :取得頁(yè)面范圍的值
如用 pageScope.objectName訪問(wèn)一個(gè)JSP中頁(yè)面范圍的對(duì)象,還可以使用{pageScope.objectName.attributeName} 訪問(wèn)對(duì)象的屬性。
requestScope:取得請(qǐng)求范圍的變量值
該對(duì)象允許訪問(wèn)請(qǐng)求對(duì)象的屬性。如用 requestScope.objectName訪問(wèn)一個(gè)JSP請(qǐng)求范圍的對(duì)象,還可以使用{requestScope.objectName.attributeName} 訪問(wèn)對(duì)象的屬性。
sessionScope:取得會(huì)話范圍的變量值
該對(duì)象允許訪問(wèn)會(huì)話對(duì)象的屬性。如:$sessionScope.name}
applicationScope:取得應(yīng)用程序范圍的變量值
該隱式對(duì)象允許訪問(wèn)應(yīng)用程序范圍的對(duì)象
5) 訪問(wèn)Cookie中的值
如要取得cookie中有一個(gè)設(shè)定名稱為username的值,可以使用${cookie.username} 來(lái)取得它。
六、使用sun提供的標(biāo)準(zhǔn) EL函數(shù)庫(kù)
由于在JSP頁(yè)面中顯示數(shù)據(jù)時(shí),經(jīng)常需要對(duì)顯示的字符串進(jìn)行處理,SUN公司針對(duì)于一些常見(jiàn)處理定義了一套EL函數(shù)庫(kù)供開(kāi)發(fā)者使用。
這些EL函數(shù)在JSTL開(kāi)發(fā)包中進(jìn)行描述,因此在JSP頁(yè)面中使用SUN公司的EL函數(shù)庫(kù),需要導(dǎo)入JSTL開(kāi)發(fā)包,并在頁(yè)面中導(dǎo)入EL函數(shù)庫(kù)。
使用EL函數(shù)庫(kù)
1) 導(dǎo)入 jstl jar包
2) 在相應(yīng)的jsp頁(yè)面添加引用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %> <!--導(dǎo)入需要使用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"};//定義一個(gè)字符數(shù)組 List list = new ArrayList();//定義一個(gè)list集合 list.add("a");//向集合中添加一個(gè)字符 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ù)庫(kù)詳細(xì)介紹
String toUpperCase(String input):把字符串參數(shù)轉(zhuǎn)換成大寫,并返回
String toLowerCase(String input):把字符串參數(shù)轉(zhuǎn)換成小寫,并返回
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為開(kāi)始值,endIndex為結(jié)束值,在input上截取子串
String substringAfter(String input, String substring):獲取input中,substring所在位置后面的字符串
substringBefore(String input, String substring):獲取input中,substring所在位置前面的字符串 String escapeXml(String input):把input中“<”、“>“、”&“、”'“、“””進(jìn)行轉(zhuǎn)義;
String trim(String input):去除input中的前后空格;
String replace(String input, String substringBefore, String substringAfter):將input中的substringBefore替換成substringAfter;
String[] split(String input, String delimiters):以delimiters為標(biāo)識(shí)分割input,返回一個(gè)字符串?dāng)?shù)組;
int length(Object obj):可以獲取字符串、數(shù)組、各種集合的長(zhǎng)度;
String join(String array[], String separator):將array數(shù)組中的元素以separator連接起來(lái),返回一個(gè)字符串
七、EL調(diào)用自定義函數(shù) (調(diào)用普通類的靜態(tài)方法)
EL很強(qiáng)大,除了使用SUN提供的標(biāo)準(zhǔn)EL函數(shù)庫(kù)外,還可以調(diào)用自定義函數(shù):
● EL表達(dá)式語(yǔ)法允許開(kāi)發(fā)人員開(kāi)發(fā)自定義函數(shù),以調(diào)用Java類的方法。語(yǔ)法:${prefix:method(params)}
● 在EL表達(dá)式中調(diào)用的只能是Java類的靜態(tài)方法,這個(gè)Java類的靜態(tài)方法需要在TLD文件中描述,才可以被EL表達(dá)式調(diào)用。
● EL自定義函數(shù)用于擴(kuò)展EL表達(dá)式的功能,可以讓EL表達(dá)式完成普通Java程序代碼所能完成的功能。
EL Function開(kāi)發(fā)步驟
只要實(shí)現(xiàn)以下三個(gè)步驟就可以在靜態(tài)頁(yè)面中用${prefix:method(params)} 調(diào)用自定義function了
編寫一個(gè)Java類的靜態(tài)方法
編寫標(biāo)簽庫(kù)描述符(tld)文件,在tld文件中描述自定義函數(shù)。
在JSP頁(yè)面中導(dǎo)入和使用自定義函數(shù)
下面來(lái)個(gè)案例:
1)編寫一個(gè)Java類的靜態(tài)方法
public class GetMax { public static int togetMax(int a, int b){ return a>b?a:b; } }
2)編寫標(biāo)簽庫(kù)描述符(tld)
<?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><!--這個(gè)名字可以隨便取,盡量與文件名相同,這樣我們知道文件在哪兒 并與prefix對(duì)應(yīng)--> <uri>http://localhost:8080/springmvc-1</uri><!-- 這個(gè)地址是隨便取得。到時(shí)候jsp頁(yè)面引入這個(gè)地址 --> <function><!-- 定義函數(shù) --> <name>toGetMax</name> <function-class>elfunction.GetMax</function-class><!-- 定義函數(shù)的類全名稱 --> <function-signature>int toGetMax(int,int)</function-signature> <!--說(shuō)明 返回值類型 函數(shù)名 以及 參數(shù)類型 --> </function> </taglib>
3)在web.xml中指定tld文件的位置(這步可以省略,因?yàn)閼?yīng)用會(huì)自動(dòng)找到 /WEB-INF/下的tld文件)
<jsp-config> <taglib> <!-- 此處uri可以自己隨便定義,但后面用時(shí)一定與這里一樣 --> <taglib-uri> http://localhost:8080/springmvc-1 </taglib-uri> <!-- tld文件的路徑 --> <taglib-location> /WEB-INF/tags/mytaglib.tld </taglib-location> </taglib> </jsp-config>
4)在JSP頁(yè)面中導(dǎo)入和使用自定義函數(shù)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://localhost:8080/springmvc-1" prefix="mytaglib"%> <!-- prefix 是前綴的意思,應(yīng)與mytaglib.tld中的<short-name>對(duì)應(yīng) --> <!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>
運(yùn)行截圖
希望本篇文章對(duì)您有所幫助
- El表達(dá)式使用問(wèn)題javax.el.ELException:Failed to parse the expression的解決方式
- EL表達(dá)式簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- EL表達(dá)式的隱式對(duì)象_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- JSP中EL表達(dá)式用法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 淺談java里的EL表達(dá)式在JSP中不能解析的問(wèn)題
- Javaweb El表達(dá)式實(shí)例詳解
- Java后端用EL表達(dá)式改進(jìn)JSP
相關(guān)文章
IntelliJ?IDEA2022.3?springboot?熱部署含靜態(tài)文件(最新推薦)
這篇文章主要介紹了IntelliJ?IDEA2022.3?springboot?熱部署含靜態(tài)文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01javax.management.InvalidApplicationException的問(wèn)題解決
javax.management.InvalidApplicationException是與Java Management Extensions (JMX) API相關(guān)的一個(gè)常見(jiàn)異常,本文主要介紹了javax.management.InvalidApplicationException的問(wèn)題解決,感興趣的可以了解一下2024-08-08保證緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性詳解
在實(shí)際開(kāi)發(fā)過(guò)程中,緩存的使用頻率是非常高的,只要使用緩存和數(shù)據(jù)庫(kù)存儲(chǔ),就難免會(huì)出現(xiàn)雙寫時(shí)數(shù)據(jù)一致性的問(wèn)題,本文主要介紹了如何保證緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,需要的小伙伴可以參考閱讀2023-04-04深入解析Java的設(shè)計(jì)模式編程中建造者模式的運(yùn)用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中建造者模式的運(yùn)用,同時(shí)文中也介紹了建造者模式與工廠模式的區(qū)別,需要的朋友可以參考下2016-02-02