java EL 運算式

來源:互聯網
上載者:User
 
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      點運算子(.)和"[ ]"都是表示擷取變數的值.區別是[ ]可以顯示非詞類的變數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.