1. 程式人生 > >Java EE入門教程系列第二章JSP(五)——表示式語言EL

Java EE入門教程系列第二章JSP(五)——表示式語言EL

2.5 表示式語言——EL

大量Java指令碼使得JSP頁面難以維護,於是,一種類似JavaScript的語言——EL表示式可用於在網頁上生成動態內容,並代替JSP指令碼元素的技術被推出。

2.5.1 基本語法

${EL expression}

其中,$是EL語法中的輸出符號,表示EL中表達式的開始;{是起始分隔符;EL expression為指定表示式;}是結束分隔符。EL有效表示式可以包含文字、操作符、變數(物件引用)和函式呼叫等。

1、EL關鍵字

EL保留的關鍵字有16個,它們是不能表示其他含義的。這16個分別是:

and         gt         true         null        or      lt       false        empty

eq           ge        instanceof         div    ne    not       le      mod

2、訪問運算子“.”和“【】”

下面兩條語句所代表的意思是一樣的:

${sessionScope.user.age};

${sessionScope.user[afe]}.

兩種訪問運算子也可以混合使用,例如:

${sessionScope.shoppingCart[0].value}

不過在以下兩種情況下,兩者會有差異:

1)當要存取的屬性名稱中包含一些特殊字元時,如".’或“—”等並非字母或數字的符號,就一定要使用“【】”,例如:

${user.My-Name}是錯誤的,應該改為${user["My-Name"]}

2)“【】”比“.”能更好地支援動態取值。例如,${sessionScope.user[data]},此時data是一個變數,假若data值為sex,則上述例子等於${sessionScope.user[sex]};假若data值為name,則上述例子等於${sessionScope.user[name]}。但“.”無法做到動態取值。

3、算術運算

EL支援通用的算術運算,包括+、-、*、/、%,其中除法運算也可以用div表示,模運算也可以用mod表示。

在表示式中也可以使用括號改變運算的優先順序,也可以用減號表示負數。在EL的除法中,如果除以0,返回值為無窮大(infinity),而不是錯誤。EL的算術運算子的優先順序如下:

1)括號:()                

2)負號:—

3)乘、除、模

4)加、減

4、關係運算

EL支援的關係運算包括等於(==)、非等於(!=)、小於、大於、不小於、不大於等,也可以用eq、ne、lt、gt、le、ge分別表示上面的關係運算符。

EL關係表示式的返回值為Boolean值且運算的優先次序低於算術運算,其中關係運算符之間的優先順序為:

1)<  >  <=   >=

2)==   !=

5、邏輯運算

包括與(&&)、或(||)、非(!),也可以用and、or、not代替。

邏輯運算運算優先順序低於關係運算,邏輯運算之間的優先順序為:

1)!

2)&&

3)||

6、empty運算子

如果運算元數值為null則返回true,或者運算元本身是一個空容器、空陣列或長度為0的字串等也返回true。空容器是指不包含任何元素的容器。

7、自動型別轉換

如果一個JSP頁面需要處理request物件中的屬性attr,以前的處理用程式碼表示為:

String strAttr=(String)request.getAttribute("attr");

int attrInt=Integer.parseInt(strAttr);

attrInt=attrInt+1;

其中,由於getAttribute()方法返回值的型別是Object,如果要作為整型使用,需要在程式碼中進行轉換。如果用EL表示式,可以直接用${param.attr+1}來完成型別轉換。

EL表示式中自動型別轉換的規則如下:

(1)Object轉換為數值

如果object為Boolean型別,出錯;

如果object==null,返回0;

如果object==“”,返回0;

如果object為字串,且字串可以轉換成數值,則返回數值,否則出錯。

(2)object轉換成String

object為數值型資料時,依據其值直接轉換成字串,如100.23轉換成“100.23”

如果object==null,返回長度為0的字串:“”;

如果object.toString()產生異常,會出錯,否則返回object.toString()。

注意:JSP會把${xxx}的內容都認為是EL表示式,裡面的內容都會被計算,如果只是想輸出${xxx}的字串,需要轉義。一種方式是在${xxx}前加上\,另一種寫法是${'${'{xxx},表示xxx會包含在${}中作為一個字串表示。

舉例:el1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h1>EL表示式</h1>
<table border="1">
<tr>
<th>運算</th>
<th>EL表示式</th>
<th>結果</th>
</tr>
<tr>
<td>與</td>
<td>\${true and true}</td>
<td>${true and true}</td>
</tr>
</table>
</body>
</html>

截圖:

2.5.2 隱式物件

EL還可以對JSP頁面的相關資訊進行操作,為了方便這種操作,EL提供了11個隱式物件,如下圖:

1、pageContext物件

2、param和paramValues物件

使用param可以訪問請求的引數值,而如果一個引數名對應多個值時,就需要用到後一個物件。${param.attr}會輸出請求引數的值,如果這個值不存在,輸出空字串“”而不是null。

舉例:sub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<form method="post" action="Param.jsp">
<p>姓名:<input type="text" name="username" size="15"/></p>
<p>密碼:<input type="password" name="password" size="15"/></p>
<p>性別:<input type="radio" name="sex" value="Male" />男
<input type="radio" name="sex" value="Female" checked/>女</p>
<p>年齡:<input type="text" name="age" size="15"/></p>
<p>興趣:<input type="checkbox" name="habit" value="學習">學習
<input type="checkbox" name="habit" value="旅遊">旅遊
<input type="checkbox" name="habit" value="音樂">音樂
</p>
<p><input type="submit" value="傳送">
<input type="reset" value="重置"></p>

</form>
</body>
</html>

Param.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<%request.setCharacterEncoding("utf-8"); %>
姓名:${param.username }<br/>
密碼:${param.password }<br/>
性別:${param.sex }<br/>
年齡:${param.age }<br/>
興趣:${paramValues.habit[0] }  ${paramValues.habit[1] }
</body>
</html>

截圖:

3、header和headerValues物件

header儲存使用者瀏覽器和服務端用來溝通的資料,使用header物件可以訪問HTTP請求的一個具體的header值;headerValues物件可以訪問所有HTTP請求的header值。

4、cookie物件

JSTL中並沒有提供設定cookie的物件,例如要取得cookie中一個設定名稱為ao的值,可以使用${cookie.ao}來取得。

5、initParam物件

在EL中使用這個物件,可以訪問Servlet上下文的初始引數。例如,一般的方法String userid=(String)application.getInitParameter("userid"),其實就可以使用${initParam.userid}來取得名稱為userid的值。

6、屬性範圍

涉及有效範圍的四個物件為:pageScope、requestScope、sessionScope、applicationScope。

${attr}會依次在上面提到的四個範圍內查詢屬性名稱為attr的屬性物件,並輸出第一次碰到的值。

而${sessionScope.attr}只在會話範圍內查詢。