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}只在會話範圍內查詢。