EL運算式
一、EL簡介 1.文法結構 ${expression} 2.[]與.運算子 EL 提供.和[]兩種運算子來存取資料。 當要存取的屬性名稱中包含一些特殊字元,如.或?等並非字母或數位符號,就一定要使用 []。例如: ${user.My-Name}應當改為${user["My-Name"] } 如果要動態取值時,就可以用[]來做,而.無法做到動態取值。例如: ${sessionScope.user[data]}中data 是一個變數 3.變數 EL存取變數資料的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱為username的變數。 因為我們並沒有指定哪一個範圍的username,所以它會依序從Page、Request、Session、Application範圍尋找。 假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的範圍都沒有找到時,就回傳null。 屬性範圍在EL中的名稱 Page PageScope Request RequestScope Session SessionScope Application ApplicationScope 二、EL隱含對象 1.與範圍有關的隱含對象 與範圍有關的EL 隱含對象包含以下四個:pageScope、requestScope、sessionScope 和applicationScope; 它們基本上就和JSP的pageContext、request、session和application一樣; 在EL中,這四個隱含對象只能用來取得範圍屬性值,即getAttribute(String name),卻不能取得其他相關資訊。
例如:我們要取得session中儲存一個屬性username的值,可以利用下列方法: session.getAttribute("username") 取得username的值, 在EL中則使用下列方法 ${sessionScope.username}
2.與輸入有關的隱含對象 與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。
例如我們要取得使用者的請求參數時,可以利用下列方法: request.getParameter(String name) request.getParameterValues(String name) 在EL中則可以使用param和paramValues兩者來取得資料。 ${param.name} ${paramValues.name}
3.其他隱含對象
cookie JSTL並沒有提供設定cookie的動作, 例:要取得cookie中有一個設定名稱為userCountry的值,可以使用${cookie.userCountry}來取得它。
header和headerValues header 儲存使用者瀏覽器和服務端用來溝通的資料 例:要取得使用者瀏覽器的版本,可以使用${header["User-Agent"]}。 另外在鮮少機會下,有可能同一標題名稱擁有不同的值,此時必須改為使用headerValues 來取得這些值。
initParam initParam取得設定web網站的環境參數(Context) 例:一般的方法String userid =(String)application.getInitParameter("userid"); 可以使用 ${initParam.userid}來取得名稱為userid
pageContext pageContext取得其他有關使用者要求或頁面的詳細資料。 ${pageContext.request.queryString} 取得請求的參數字串 ${pageContext.request.requestURL} 取得請求的URL,但不包括請求之參數字串 ${pageContext.request.contextPath} 服務的web application 的名稱 ${pageContext.request.method} 取得HTTP 的方法(GET、POST) ${pageContext.request.protocol} 取得使用的協議(HTTP/1.1、HTTP/1.0) ${pageContext.request.remoteUser} 取得使用者名稱稱 ${pageContext.request.remoteAddr } 取得使用者的IP 位址 ${pageContext.session.new} 判斷session 是否為新的 ${pageContext.session.id} 取得session 的ID ${pageContext.servletContext.serverInfo} 取得主機端的服務資訊
三、EL運算子 1.算術運算子有五個:+、-、*或$、/或div、%或mod 2.關係運算子有六個:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge 3.邏輯運算子有三個:&&或and、||或or、!或not 4.其它運算子有三個:Empty運算子、條件運算子、()運算子 例:${empty param.name}、${A?B:C}、${A*(B+C)}
四、EL函數(functions)。 文法:ns:function( arg1, arg2, arg3 …. argN) 其中ns為前置名稱(prefix),它必須和taglib 指令的前置名稱一置
---------------------------------------------
補充:
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
FOREACH:
<c:forEachitems="${messages}" var="item" begin="0" end="9" step="1" varStatus="var"> …… </c:forEach>
OUT:
<c:outvalue="/${logininfo.username}"/> c:out>將value 中的內容輸出到當前位置,這裡也就是把logininfo對象的 username屬性值輸出到頁面當前位置。 ${……}是JSP2.0 中的Expression Language(EL)的文法。它定義了一個運算式, 其中的運算式可以是一個常量(如上),也可以是一個具體的表達語句(如forEach迴圈體中 的情況)。典型案例如下: Ø${logininfo.username} 這表明引用logininfo 對象的username屬性。我們可以通過“.”操作符引 用對象的屬性,也可以用“[]”引用對象屬性,如${logininfo[username]} 與${logininfo.username}達到了同樣的效果。 “[]”引用方式的意義在於,如果屬性名稱中出現了特殊字元,如“.”或者“-”, 此時就必須使用“[]”擷取屬性值以避免文法上的衝突(系統開發時應盡量避免 這一現象的出現)。 與之等同的JSP Script大致如下: LoginInfo logininfo = (LoginInfo)session.getAttribute(“logininfo”); String username = logininfo.getUsername(); 可以看到,EL大大節省了編碼量。 這裡引出的另外一個問題就是,EL 將從哪裡找到logininfo對象,對於 ${logininfo.username}這樣的運算式而言,首先會從當前頁面中尋找之前是 否定義了變數logininfo,如果沒有找到則依次到Request、Session、 Application 範圍內尋找,直到找到為止。如果直到最後依然沒有找到匹配的 變數,則返回null. 如果我們需要指定變數的尋找範圍,可以在EL運算式中指定搜尋範圍: ${pageScope.logininfo.username} ${requestScope.logininfo.username} ${sessionScope.logininfo.username} ${applicationScope.logininfo.username} 在Spring 中,所有邏輯處理單元返回的結果資料,都將作為Attribute被放 置到HttpServletRequest 對象中返回(具體實現可參見Spring 源碼中 org.springframework.web.servlet.view.InternalResourceView. exposeModelAsRequestAttributes方法的實現代碼),也就是說Spring MVC 中,結果資料對象預設都是requestScope。因此,在Spring MVC 中, 以下定址方法應慎用: ${sessionScope.logininfo.username} ${applicationScope.logininfo.username} Ø ${1+2} 結果為運算式計算結果,即整數值3。 Ø ${i>1} 如果變數值i>1的話,將返回bool類型true。與上例比較,可以發現EL會自 動根據運算式計算結果返回不同的資料類型。 運算式的寫法與java代碼中的運算式編寫方式大致相同。
IF / CHOOSE:
<c:iftest="${var.index % 2 == 0}"> * </c:if> 判定條件一般為一個EL運算式。 <c:if>並沒有提供else子句,使用的時候可能有些不便,此時我們可以通過<c:choose> tag來達到類似的目的: <c:choose> <c:when test="${var.index % 2 == 0}"> * </c:when> <c:otherwise> ! </c:otherwise> </c:choose> 類似Java 中的switch 語句,<c:choose>提供了複雜判定條件下的簡化處理手法。其 中<c:when>子句類似case子句,可以出現多次。上面的代碼,在奇數行時輸出“*”號, 而偶數行時輸出“!”。 ---------------------------------------------
再補充:
1 EL運算式用${}表示,可用在所有的HTML和JSP標籤中 作用是代替JSP頁面中複雜的JAVA代碼.
2 EL運算式可操作常量 變數 和隱式對象. 最常用的 隱式對象有${param}和${paramValues}. ${param}表示返回請求參數中單個字串的值. ${paramValues}表示返回請求參數的一組值.pageScope表示頁面範圍的變數.requestScope表示請求對象的變數. sessionScope表示會話範圍內的變數.applicationScope表示應用範圍的變數.
3 <%@ page isELIgnored="true"%> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中預設的啟用EL語言.
4 EL語言可顯示 邏輯運算式如${true and false}結果是false 關聯運算式如${5>6} 結果是false 算術運算式如 ${5+5} 結果是10
5 EL中的變數搜尋範圍是:page request session application 點運算子(.)和"[ ]"都是表示擷取變數的值.區別是[ ]可以顯示非詞類的變數 JSP中的EL運算式詳細介紹
一、JSPEL語言定義
E L(Expression Language) 目的:為了使JSP寫起來更加簡單。
運算式語言的靈感來自於 ECMAScript 和 XPath 運算式語言,它提供了在 JSP 中簡化運算式的方法。它是一種簡單的語言,基於可用的命名空間(PageContext 屬性)、嵌套屬性和對集合、操作符(算術型、關係型和邏輯型)的訪問符、映射到 Java 類中靜態方法的可擴充函數以及一組隱式對象。 EL 提供了在 JSP 指令碼編製元素範圍外使用運行時運算式的功能。指令碼編製元素是指頁面中能夠用於在 JSP 檔案中嵌入 Java 代碼的元素。它們通常用於對象操作以及執行那些影響所產生內容的計算。JSP 2.0 將 EL 運算式添加為一種指令碼編製元素。
二、JSP EL簡介
1、文法結構 ${expression} 2、[ ]與.運算子 EL 提供“.“和“[ ]“兩種運算子來存取資料。 當要存取的屬性名稱中包含一些特殊字元,如.或?等並非字母或數位符號,就一定要使用“[ ]“。例如: ${user.My-Name}應當改為${user["My-Name"]} 如果要動態取值時,就可以用“[ ]“來做,而“.“無法做到動態取值。例如: ${sessionScope.user[data]}中data 是一個變數 3、變數 EL存取變數資料的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱為username的變數。 因為我們並沒有指定哪一個範圍的username,所以它會依序從Page、Request、Session、Application範圍尋找。 假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的範圍都沒有找到時,就回傳null。 屬性範圍在EL中的名稱 Page PageScope Request RequestScope Session SessionScope Application ApplicationScope 二、JSP EL 中的有效運算式
有效運算式可以包含文字、操作符、變數(對象引用)和函數調用。我們將分別瞭解這些有效運算式中的每一種: 1、文字
JSP運算式語言定義可在運算式中使用的以下文字:
文字 |
文字的值 |
Boolean |
true 和 false |
Integer |
與 Java 類似。可以包含任何正數或負數,例如 24、-45、567 |
Floating Point |
與 Java 類似。可以包含任何正的或負的浮點數,例如 -1.8E-45、4.567 |
String |
任何由單引號或雙引號限定的字串。對於單引號、雙引號和反斜線,使用反斜線字元作為逸出序列。必須注意,如果在字串兩端使用雙引號,則單引號不需要轉義。 |
Null |
null |
2、操作符
JSP 運算式語言提供以下操作符,其中大部分是 Java 中常用的操作符:
術語 |
定義 |
算術型 |
+、-(二元)、*、/、div、%、mod、-(一元) |
邏輯型 |
and、&&、or、||、!、not |
關係型 |
==、eq、!=、ne、、gt、<=、le、>=、ge。可以與其他值進行比較,或與布爾型、字串型、整型或浮點型文字進行比較。 |
空 |
空操作符是首碼操作,可用於確定值是否為空白。 |
條件型 |
A ?B :C。根據 A 賦值的結果來賦值 B 或 C。 |
3、隱式對象
JSP 運算式語言定義了一組隱式對象,其中許多個物件在 JSP scriplet 和運算式中可用:
pageContext |
JSP 頁的上下文。它可以用於訪問 JSP 隱式對象,如請求、響應、會話、輸出、servletContext 等。例如,${pageContext.response} 為頁面的響應對象賦值。 |
此外,還提供幾個隱式對象,允許對以下對象進行簡易訪問:
術語 |
定義 |
param |
將請求參數名稱映射到單個字串參數值(通過調用 ServletRequest.getParameter (String name) 獲得)。getParameter (String) 方法返回帶有特定名稱的參數。運算式 $(param.name) 相當於 request.getParameter (name)。 |
paramValues |
將請求參數名稱映射到一個數值數組(通過調用 ServletRequest.getParameter (String name) 獲得)。它與 param 隱式對象非常類似,但它檢索一個字串數組而不是單個值。運算式 ${paramvalues.name) 相當於 request.getParamterValues(name)。 |
header |
將要求標頭名稱映射到單個字串頭值(通過調用 ServletRequest.getHeader(String name) 獲得)。運算式 ${header.name} 相當於 request.getHeader(name)。 |
headerValues |
將要求標頭名稱映射到一個數值數組(通過調用 ServletRequest.getHeaders(String) 獲得)。它與頭隱式對象非常類似。運算式 ${headerValues.name} 相當於 request.getHeaderValues(name)。 |
cookie |
將 cookie 名稱映射到單個 cookie 對象。向伺服器發出的用戶端請求可以獲得一個或多個 cookie。運算式 ${cookie.name.value} 返回帶有特定名稱的第一個 cookie 值。如果請求包含多個同名的 cookie,則應該使用 ${headerValues.name} 運算式。 |
initParam |
將上下文初始化參數名稱映射到單個值(通過調用 ServletContext.getInitparameter(String name) 獲得)。 |
除了上述兩種類型的隱式對象之外,還有些對象允許訪問多種範圍的變數,如 網路內容、會話、請求、頁面:
術語 |
定義 |
pageScope |
將頁面範圍的變數名稱映射到其值。例如,EL 運算式可以使用 ${pageScope.objectName} 訪問一個 JSP 中頁面範圍的對象,還可以使用 ${pageScope.objectName.attributeName} 訪問對象的屬性。 |
requestScope |
將請求範圍的變數名稱映射到其值。該對象允許訪問請求對象的屬性。例如,EL 運算式可以使用 ${requestScope.objectName} 訪問一個 JSP 請求範圍的對象,還可以使用 ${requestScope.objectName.attributeName} 訪問對象的屬性。 |
sessionScope |
將會話範圍的變數名稱映射到其值。該對象允許訪問會話對象的屬性。例如: $sessionScope.name} |
applicationScope |
將應用程式範圍的變數名稱映射到其值。該隱式對象允許訪問應用程式範圍的對象。 |
三、特彆強調:
1、注意當運算式根據名稱引用這些對象之一時,返回的是相應的對象而不是相應的屬性。例如:即使現有的 pageContext 屬性包含某些其他值,${pageContext} 也返回 PageContext 對象。
2、 注意 <%@ pageisELIgnored="true" %> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中預設的啟用EL語言。 四、舉例說明
1、例如,
< %=request.getParameter(“username”)% > 等價於 ${ param.username }
2、例如,但是下面的那句EL語言可以完成如果得到一個username為空白,則不顯示null,而是不顯示值。
<%=user.getAddr( ) %> 等價於 ${user.addr}。
3、例如:
<% =request.getAttribute(“userlist”) %> 等價於$ { requestScope.userlist }
4、例如,原理如上例3。
${ sessionScope.userlist } 1
${ sessionScope.userlist } 2
${ applicationScope.userlist } 3
${ pageScope.userlist } 4
${uselist} 含義:執行順序為4 1 2 3。
“.”後面的只是一個字串,並不是真正的內建對象,不能調用對象。
4、例如,
<%=user.getAddr() %> 等價於 ${user.addr}
第一句前面的user,為一個變數。
第二句後面user,必須為在某一個範圍裡的屬性。
EL是在JSP頁面中的一種使用方法
一、EL文法EL的文法很簡單,他最大的特點就是使用上很方便例:${sessionScope.user.sex}所有EL都是以 ${ 為起始、以} 為結尾的。上述EL範例的意思是:從Session取得使用者的性別。如果使用之前JSP代碼的寫法如下:<% User user = (User)session.getAttribute("user"); String sex = user.getSex( ); %>兩者相比較之下,可以發現EL的文法比傳統JSP代碼更為方便、簡潔。EL提供 . 和 [ ] 兩種運算子來存取資料,[ ]可以訪問集合或者是數組的元素、Bean的屬性。下列兩者所代表的意思是一樣的,但是需要保證要取得對象的那個的屬性有相應的setXxx()和getXxx()方法才行。例:${sessionScope.user.sex}等於${sessionScope.user["sex"]}. 和 [ ] 也可以同時混合使用,如下:${sessionScope.shoppingCart[0].price}返回結果為shoppingCart中第一項物品的價格。在EL中,字串既可以使用"abc",可以使用'abc'。EL運算子EL的算術運算子和Java中的運算子的大致相同,優先順序也相同。注意:'+' 運算子不會連接字串了,他只用於加法運算。EL關係運算子有以下六個運算子關係運算子 說 明 範 例 結果= = 或 eq | 等於 |${ 5 = = 5 } 或 ${ 5 eq 5 } | true!= 或 ne | 不等於 |${ 5 != 5 } 或 ${ 5 ne 5 } | false< 或 lt | 小於 |${ 3 < 5 }或 ${ 3 lt 5 } | true> 或 gt | 大於 |${ 3 > 5 }或 ${ 3 gt 5 } | false<= 或 le | 小於等於 |${ 3 <= 5 }或 ${ 3 le 5 } | true>= 或 ge | 大於等於 |${ 3 >= 5 }或 ${ 3 ge 5 } | falseempty運算子Empty運算子主要用來判斷值是否為null或空的,例如:${ empty param.name }接下來說明Empty運算子的規則:{empty} A 如果A為null時,返回true 如果A不存在時,返回true 如果A為空白字串時,返回true 如果A為空白數組時,返回true 如果A為空白的Map時,返回true 如果A為空白的Collection時,返回true 否則,返回false注意:在使用EL關係運算子時,不能夠寫成:${param.password1} = = ${param.password2}或者${ ${param.password1 } = = ${ param.password2 } }而應寫成${ param.password1 = = param.password2 }使用EL從表單中取得資料與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。一般而言,我們在取得使用者的請求參數時,可以利用下列方法:request.getParameter(String name)request.getParameterValues(String name)在EL中則可以使用param和paramValues兩者來取得資料。${param.name}${paramValues.name}可以取得所有同名參數的值${paramValues.hobbies[0]}可以通過指定下標來訪問特定的參數的值這裡param的功能和request.getParameter(String name)相同,而paramValues和request.getParameterValues(String name)相同。如果使用者填了一個form,form名稱有為username的文字框,則我們就可以使用${param.username}來取得使用者填入文字框的值。EL函數EL中使用函數要寫一個要使用到方法的類,然後在配置xxx.tld檔案,然後在JSP中使用時和JSP的自訂標籤相似。xxx.tld中的配置<function> <name>reverse</name><!--函數名--> <function-class>jsp2.examples.el.Functions</function-class><!--函數所在的類--> <function-signature>java.lang.String reverse( java.lang.String )</function-signature> <!--函數原型,也就是函數的傳回值類型,函數名,參數表,注意一定要寫類型的全名--></function>使用EL函數的寫法${sn:upper('abc')}注意:在定義EL函數時,都必須為公開靜態(public static)EL的隱含對象EL也可以使用內建對象中設定的屬性,需要使用特定的EL內建對象屬性範圍 | 在EL中的對象Page | pageScopeRequest | requestScopeSession | sessionScopeApplication | applicationScopeEL中使用內建對象的屬性${requestScope.user}等價於<%request.getAttribute("user")%>如果不寫出特定的範圍 ,那就會在不同的範圍間進行搜尋了例:{user}(user是在request範圍 request.setAttribute("user",user))也就等於${requestScope.user}<%request.getAttribute("user")%>
EL運算式語言
EL語言是JSTL輸出(輸入)一個JAVA運算式的表示形式。
在JSTL中,EL語言只能在屬性值中使用。EL語言只能通過建立運算式${exp1}來進行調用。在屬性值中使用運算式有三種方式。
1、 value屬性包含一個運算式
<some:tag value="${expr}"/>
在這種情況下,運算式值被計算出來並根據類型轉換規則賦值給value屬性。比如:<c:out value="${username}" />中的${username}就是一個EL,它相當於JSP語句<%=request.getAttribute(“username”)%>或<%=session.getAttribute(“username”)%>
2、 value屬性包含一個或多個屬性,這些屬性被文本分割或圍繞
<some:tag value="some${expr}${expr}text${expr}"/>
在這種情況下,運算式從左至右進行計算,並將結果轉換為字串型(根據類型轉換規則),並將結果賦值給value屬性
3、 value屬性僅僅包含文本
<some:tag value="sometext"/>
在這種情況下,字串型屬性value將根據類型轉換規則轉換為標籤所希望的類型。
EL語言的操作符
取得某個對象或集合中的屬性值
為了獲得集合中的屬性,EL支援以下兩種操作
1. 使用.操作符來獲得有名字的屬性。例如運算式${user.username}表明對象user的username屬性
2. 使用[]操作符來獲得有名字或按數字排列的屬性。
運算式${user["username"]}和運算式${user. username }含義相同
運算式${row[0]} 表明row集合的第一個條目。
在這裡user是一個類的對象,它的屬性username必須符合標準JavaBean的規範,即必須為username屬性定義相應的getter、setter方法。
Empty操作符(空值檢查)
使用empty操作符來決定對象、集合或字串變數是否為空白或null。例如:
${empty param.username}
如果request的參數列表中的username值為null,則運算式的值為true。 EL也可以直接使用比較操作符與null進行比較。如${param.firstname == null}。
比較操作符 操作符 描述 ==或eq 相等檢查 !=或ne 不等檢查 <或lt 小於檢查 >或gt 大於檢查 <=或le 小於等於檢查 >=或ge 大於等於檢查
數字運算子與邏輯運算子均與JAVA語言相同,不再列表。
1 EL運算式用${}表示,可用在所有的HTML和JSP標籤中 作用是代替JSP頁面中複雜的JAVA代碼.
2 EL運算式可操作常量 變數 和隱式對象. 最常用的 隱式對象有${param}和${paramValues}. ${param}表示返回請求參數中單個字串的值. ${paramValues}表示返回請求參數的一組值.pageScope表示頁面範圍的變數.requestScope表示請求對象的變數.sessionScope表示會話範圍內的變數.applicationScope表示應用範圍的變數.
3 <%@ page isELIgnored="true"%> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中預設的啟用EL語言.
4 EL語言可顯示 邏輯運算式如${true and false}結果是false 關聯運算式如${5>6} 結果是false 算術運算式如 ${5+5} 結果是10
5 EL中的變數搜尋範圍是:page request session application 點運算子(.)和"[ ]"都是表示擷取變數的值.區別是[ ]可以顯示非詞類的變數