天天看點

JSP中的EL表達式(2) EL表達式

EL表達式

EL表達式概述

在EL表達式出現之前,開發Java Web應用程式時,經常需要将大量的Java代碼片段嵌入JSP頁面中,這會使得頁面看起來很亂,而使用EL表達式則比較簡潔。

範例:

在頁面中顯示儲存在session中的變量username,并将其輸出到頁面中,代碼如下:

<%

if(session.getAttribute(“username”) != null){

out.print(session.getAttribute(“username”).toString();

}

%>

如果使用EL,則隻需一句代碼即可實作

${username}

是以,EL在Web開發中比較常用,通常與 JSTL一起使用。

1、EL的基本文法

EL表達式文法:以${開頭,以}結束,中間為合法的表達式,具體文法格式如下:

${expression}

參數說明:

Expression:指定要輸出的内容,可以是字元串,也可以是由EL運算符組成的表達式。

PS:

由于EL表達式的文法是以${開頭,是以如果在JSP頁面中要顯示字元串S{,則必須在前面加上。即”${” .或者寫成“${‘${’}” .

範例:

在頁面中輸出字元串“JSP學習”,代碼如下:

${‘JSP學習’}

2、EL的特點

EL除了具有文法簡單、使用友善的特點,還有以下特點:

A、EL可以與JSTL結合使用,也可以也JavaScript語句結合使用

B、EL中會自動進行類型轉換,如果想通過EL輸入兩個字元串數值(如n1和n2)的和,可以直接通過“+”進行連接配接(如${n1+n2})

C、EL不僅可以通路一般變量,還可以通路JavaBean中的屬性及嵌套屬性和集合對象

D、EL中可以執行算術運算、邏輯運算、關系運算和條件運算等操作

E、EL中可以擷取湖區命名空間(PageContext對象,他是頁面中所有其他内置對象的最大範圍的繼承對象,通過他可以通路其他内置對象)

F、在EL中可以通路JSP的作用域(request、session、application、page)

G、在使用EL進行除法運算的時候,如果0作為除數,則傳回無窮大Infinity,而不是傳回錯誤

H、擴充函數可以與Java類的靜态方法進行映射

與低版本環境相容—禁用EL

隻要安裝的Web伺服器能支援Servlet2.4/JSP2.0,就可以在JSP頁面中使用EL。由于在JSP2.0之前的版本中沒有EL,是以JSP為了和以前的規範相容,還提供了禁用EL的方法。JSP中提供3中方法禁用EL,分别介紹如下。

1、使用斜杠“”

使用斜杠是一種比較簡單的禁用EL的方法。該方法隻需要在EL的起始标記“${”前加上“”。具體文法格式如下:

${expression}

PS:

該文法格式隻使用在禁用頁面中的一個或幾個EL表達式的情形

2、使用page 指令

使用JSP的page指令可以禁用EL表達式,具體文法格式如下:

<%@page isELIgnored=“布爾值”%>

參數說明:

isELIgnored:用于指定是否禁用頁面的EL,如果屬性值為true,則忽略頁面中的EL,否則将解析頁面中的EL

範例:

<%@page isELIgnored=”true”%>

PS:

該方法适用于禁用一個JSP頁面中的EL

3、在web.xml中配置元素

在web.xml中配置元素可以實作禁用伺服器中的EL。

範例:

*.jsp

true

PS:

該方法使用于禁用Web應用中的所有的JSP頁面中的EL

保留的關鍵字

同Java一樣,EL也有自己的保留關鍵字,在變量命名時,應避免這些關鍵字,包括使用EL輸出已經儲存在作用域範圍内的變量,也不能使用關鍵字,如果已經定義了,那麼需要修改為其他的變量名。EL中的保留關鍵字如下:

and eq gt
instanceof div or
le false empty
not lt ge

如果EL中使用了保留的關鍵字,那麼在Eclipse中,将給出錯誤提示。如果忽略該提示,直接運作程式,将會出錯。

EL的運算符和優先級

EL可以通路資料運算符、算數運算符、關系運算符、條件運算符及empty運算符等。各運算符的優先級如下:

運算符的優先級決定了在多個運算符同時存在的時候,各個運算符的求職順序,對于同級别的運算符采用從左到右的順序進行計算。

PS:

使用()可以改變優先級。在複雜的表達式中,使用括号可以使得表達式更容易閱讀和避免出錯。

1.通過EL通路資料

通過EL提供的“[]”和“,”運算符可以通路資料。通常情況下,“[]”和“.”運算是等價的,可以互相代替。

範例:

通路JavaBean中的userInfo的id屬性,可以寫成以下兩種形式:

${userInfo.id}

${userInfo[id]}

但是也不是所有的情況下都可以互相替代,例如,當對象的屬性名中包含一些特殊的符号(-或.)時,就隻能使用“[]”運算符來通路對象的屬性。例如:${userInfo[user-id]}是正确的,而${userInfo.user-name}則是錯誤的。另外,EL的“[]”運算符還有一個用途,就是用來擷取數組或List集合中的資料。

數組元素的擷取:

應用“[]”運算符可以擷取數組的指定元素,但是“.”不能

範例:

擷取request範圍中的數組arrBook中的第一個元素,可以使用下面的EL表達式:

${arrBook[0]}

範例:

編寫array.jsp,該檔案中,首先包含一個3元素的以為數組,并指派,然後通過for循環和EL輸出數組中的元素

<%@ page language=java import=java.util.* pageEncoding=UTF-8%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;

%>

>

<%

String[] arr = {Java,JSP,MySQL};//定義一維數組

request.setAttribute(book,arr);//将數組儲存在request對象中

%>

<%

String[] arr1 = (String [])request.getAttribute(book);//擷取儲存在request範圍内的對象

//通過循環和EL輸出一維數組的内容

for(int i = 0 ; i < arr1.length ; i++){

request.setAttribute(requestI, i);//将循環變量i儲存在request範圍内的變量中

%>

${requestI }:${book[requestI] }

<%

}

%>

List集合元素的擷取

應用“[]”運算符還可以擷取List集合中的指定元素,但是“.”不行

範例:

session中儲存一個包含3個元素的List,并用EL輸出

<%@ page language=java import=java.util.* pageEncoding=UTF-8%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;

%>

>

<%

List list = new ArrayList();//聲明一個List集合對象

list.add(餅幹);

list.add(牛奶);

list.add(面包);

session.setAttribute(goodsList, list);//将List儲存到session中

%>

<%

List list1 = (List)session.getAttribute(goodsList);//擷取儲存在session中的對象

for(int i = 0 ; i < list1.size() ; i++){

session.setAttribute(sessionI, i);

%>

${sessionI } : ${goodsList[sessionI] }

<%

}

%>

2.在EL中判斷對象是否為空

在EL中,判斷對象是否為空,可以通過empty運算符實作,該運算符是一個字首運算符,即empty運算符位于操作數的前方,用來确定一個對象是否為null或空。Empty運算符的格式如下:

${empty.expression}

範例:

定義兩個request範圍内的變量user,user1,分别數值為null和“”.

<%request.setAttribute(“user”,””);%>

<%request.setAttribute(“user1”,null);%>

然後通過empty運算符判斷user,user1是否為空

${empty user} //傳回true

${empty user1} //傳回true

另外,empty運算符也可以與not運算符結合使用,判斷一個對象或變量是否為空。

範例:

<%request.setAttribute(“user”,””);

${not empty user} //傳回值為false

3.EL中的邏輯關系運算

在EL中,通過邏輯運算符和關系運算符可以實作邏輯關系運算。關系運算符用于實作兩個表達式的比較,進行比較的表達式可以是數值型也可以是字元串。而邏輯運算符則常用于對Boolean類型的資料進行操作。邏輯運算符和關系運算符經常一起使用。

範例:

在判斷考試成績時,可以用下面的表達式判斷60到80分的成績

成績>60 and 成績<80

關系運算符

在EL中,提供了6中關系運算符。關系運算符的使用格式如下:

運算符 功能 示例
==或eq 等于 ${10==10}/${10 eq 10}
!=或ne 不等于 ${10!=10}/${“A” ne “A”}
<或lt 小于 ${7<6}/${“A” lt “B”}
>或gt 大于 ${7>6}/${“A” gt “B”}
<=或le 小于等于 ${“A” <= “A”}
>=或ge 大于等于 ${7>=6}/${7 ge 6}

邏輯運算符

在EL中進行條件運算

文法格式:

${條件表達式?表達式1:表達式2}

參數說明:

條件表達式:用于指定一個條件表達式,該表達式的值為Boolean型。可以由關系運算符、邏輯運算符和empty運算符組成

表達式1:用于指定當條件表達式的值為true時,将要傳回的值

表達式2:用于指定當條件表達式的指為false時,将要傳回的值

範例:應用條件運算符實作放變量cart的值為空時,輸出“cart車為空”,否則輸出cart的值。

${empty cart ? ”cart為空” : cart}

通常情況下,條件運算符可以用JSTL中的條件标簽或代替