官术网_书友最值得收藏!

6.1 EL簡介

EL全名為Expression Language,它原本是JSTL為方便存取數據而自定義的語言。(JSTL是JSP Standard Tag Library的縮寫,翻譯為JSP標準標簽庫)當時EL只能在JSTL標簽中使用,到了JSP 2.0之后,EL已經正式成為標準規范之一。因此,只要是支持Servlet 2.4 / JSP 2.0 的Container,就都可以在JSP網頁中直接使用EL。使用方法如下:

<p>Hi ! ${ username }</p>

注意

目前幾乎所有的JSP服務器的最新版本都支持Servlet 2.4/JSP 2.0,如Tomcat 4.0以上版本,在選用JSP服務器時應該注意其版本說明,盡量選用最新的版本。

6.1.1 EL語法

EL語法很簡單,它最大的特點就是使用方便。所有EL都是以“${”起始、以“}”結尾的,例如:

${sessionScope.user.sex}

上述EL范例的意思是:從Session的范圍中,取得用戶的性別。假若依照之前JSP Scriptlet的寫法如下:

<%
User user = (User)session.getAttribute("user");
String sex = user.getSex( );
%>

兩者相比較之下,當然是EL的語法更為方便、簡潔。

EL提供“.”和“[ ]”兩種運算符來存取數據。下列兩者所代表的意思是一樣的:

${sessionScope.user.sex}

等價于

${sessionScope.user["sex"]}

使用“[]”有一個優勢就是可以使用變量,而“.”無法做到動態取值。例如:

${sessionScope.user[data]}

此時,data是一個變量,假若data的值為“age”,那上述的例子等價于

${sessionScope.user.age}

6.1.2 EL變量

EL存取變量數據的方法很簡單,例如:

${username}

它的意思是取出某一范圍中名稱為username的變量。因為并沒有指定哪一個范圍的username,所以它的默認值會先從Page范圍找,假如找不到,再依次到Request、Session、Application范圍找。假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的范圍都沒有找到,就回傳null。流程如圖6.1所示,屬性范圍如表6.1所示。

圖6.1 EL查找變量流程圖

表6.1 變量查找的屬性范圍表

也可以指定要從哪一個范圍取出變量,如表6.2所示。

表6.2 指定取值范圍查找變量

其中,pageScope、requestScope、sessionScope和applicationScope都是EL的隱含對象,由它們的名稱可以很容易猜出它們所代表的意思。例如:

${sessionScope.username}

是取出Session范圍的username變量。

String username = (String) session.getAttribute("username");

這種寫法顯然比之前JSP的寫法容易、簡潔許多。有關EL隱含對象將在后面的章節中詳細介紹。

6.1.3 自動轉變類型

EL除了提供方便存取變量的語法之外,它的另外一個方便的功能就是:自動轉變類型。來看下面這個例子,把頁面傳來的參數count加20。

${param.count + 20}

假如窗體傳來count的值為10,那么上面的結果為30。在JSP中獲取用戶輸入,從窗體所傳來的參數值,包括鏈接中的參數值,它們的類型一律是String,所以當接收之后,必須再將它轉為其他類型,如int、float等,然后才能執行一些數學運算。而在JSP腳本中只能這樣做:

<!--在JSP中到處存在著類型轉化-->
<%
String str_count = request.getParameter("count");
int count = Integer.parseInt(str_count);
count = count + 20;
%>

說明

曾經有一種說法是,在Web這個String的世界中沒有必要再定義有類型值對象,否則要來回轉化很麻煩。有一段時間興起了無類型的潮流,就是所有的輸入輸出參數的傳遞都用Java的Properties類來實現,而不再定義值對象。語言類型的喪失絕對不能說是一種進步,其實這正是沒有自動轉化的無奈之舉。而EL給開發者提供了這個功能。

自動轉化的規則如表6.3所示。

表6.3 EL類型自動轉化表

6.1.4 EL隱含對象(內置對象)

本書第2章曾經介紹過9個JSP隱含對象,而EL本身也有自己的隱含對象,這些隱含對象給開發人員帶來了極大的便利。EL隱含對象總共有11個,如表6.4所示。

表6.4 EL隱含對象表

與范圍有關的EL隱含對象包含以下4個:pageScope、requestScope、sessionScope和applicationScope,它們基本上就和JSP的pageContext、request、session和application對應。不過必須注意的是,這4個隱含對象只能用來取得范圍屬性值,即JSP中的getAttribute(String name),卻不能取得其他相關信息。例如,JSP中的request對象除可以存取屬性之外,還可以取得用戶的請求參數或表頭信息等。但是在EL中,它就只能單純用來取得對應范圍的屬性值。

例如,要在session中儲存一個屬性,它的名稱為username,在JSP中使用

session.getAttribute("username")

但是在EL中,則是使用

${sessionScope.username}

與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。一般而言,在JSP中在取得用戶的請求參數時,可以利用下列方法:

request.getParameter(String name)
request.getParameterValues(String name)

在EL中則可以使用param和paramValues來取得數據。

${param.name}
${paramValues.name}

如果用戶填了一個表格,表格名稱為username,就可以使用${param.username}來取得用戶填入的值。下面給出了一個利用EL隱含對象和EL語句的例子。源代碼如實例6-1所示。

【實例6-1】EL輸入示例:Param.html

01     <%@ page contentType="text/html;charset=GB2312" %>
02     <html>
03          <head>
04                <title>CH6 - Param.html</title>
05          </head>
06          <body>
07                <h2>
08                    EL 隱含對象 param、paramValues
09               </h2>                                         <!--關于表單設置-->
10                <form method="post" action="Param.jsp">
11                     <p>
12                         姓名:<!--關于用戶名輸入框-->
13                          <input type="text" name="username" size="15" />
14                     </p>
15                     <p>
16                         密碼:<!--關于密碼輸入框-->
17                          <input type="password" name="password" size="15" />
18                     </p>
19                     <p>
20                         性別:<!--關于性別單選框-->
21                          <input type="radio" name="sex" value="Male" checked />
22                         男
23                          <input type="radio" name="sex" value="Female" />
24                         女
25                     </p>
26                     <p>
27                         年齡:<!--關于年齡選擇框-->
28                          <select name="old">
29                                <option value="10">
30                                     10 - 20
31                                </option>
32                                <option value="20" selected>
33                                     20 - 30
34                                </option>
35                                <option value="30">
36                                     30 - 40
37                                </option>
38                                <option value="40">
39                                     40 - 50
40                                </option>
41                          </select>
42                     </p>
43                     <p>
44                         興趣:<!--關于興趣多選框-->
45                          <input type="checkbox" name="habit" value="Reading" />
46                         看書
47                          <input type="checkbox" name="habit" value="Game" />
48                         玩游戲
49                          <input type="checkbox" name="habit" value="Travel" />
50                         旅游
51                          <input type="checkbox" name="habit" value="Music" />
52                         聽音樂
53                          <input type="checkbox" name="habit" value="Tv" />
54                         看電視
55                     </p>
56                    <p>           <!--關于傳送和清除按鈕-->
57                         <input type="submit" value="傳送" />
58                         <input type="reset" value="清除" />
59                     </p>
60                </form>
61          </body>
62     </html>

【運行程序】瀏覽該頁面,結果如圖6.2所示。

圖6.2 EL輸入示例界面圖

【代碼剖析】在上述代碼中,在第13行創建了一個關于姓名的文本輸入框,在第17行創建了一個關于密碼的文本輸入框,在第21行和第23行創建了一組關于性別的單選按鈕,在第28行創建了一個關于年齡的下拉選擇框,在第45行到第53行創建了一組關于興趣的多選框,最后在第57行和第58行創建了關于傳送和清除的按鈕。

關于EL輸出示例源代碼如實例6-2所示。

【實例6-2】EL輸出示例:Param.jsp

01     <html>
02          <head>
03                <title>Param.jsp</title>
04          </head>
05          <body>
06                <h2>
07                    EL 隱含對象 param、paramValues
08                </h2>
09               姓名: ${param.username}                             <!--顯示用戶名-->
10                </br>
11               密碼: ${param.password}                             <!--顯示密碼-->
12                </br>
13               性別: ${param.sex}                        <!--顯示性別-->
14                </br>
15               年齡: ${param.old}                                  <!--顯示年齡-->
16               </br>                                            <!--顯示興趣-->
17               興趣: ${paramValues.habit[0]} ${paramValues.habit[1]}
18          </body>
19     </html>

【運行程序】瀏覽該頁面,結果如圖6.3所示。

圖6.3 EL輸出示例界面圖

【代碼剖析】在上述代碼中,為了獲取傳送過來的參數值,通過EL表達式${param.參數名}獲取相關參數名的值。

6.1.5 EL保留字

EL的保留字如表6.5所示。保留字的意思是指變量在命名時,應該避開上述的名字,以免程序編譯時發生錯誤。

注意

避免保留字不僅局限于頁面中,同樣應該在JavaBean中避免,即使沒有在EL表達式中涉及這個Bean,也會給以后的開發留下隱患。

表6.5 EL保留字

主站蜘蛛池模板: 梨树县| 休宁县| 葵青区| 岳阳市| 上饶市| 丽水市| 法库县| 靖边县| 通江县| 辽宁省| 墨竹工卡县| 昭通市| 济阳县| 罗城| 郓城县| 鲜城| 福清市| 闻喜县| 芦溪县| 呼图壁县| 合肥市| 浦县| 保定市| 南川市| 沁源县| 全椒县| 新泰市| 福建省| 繁昌县| 温州市| 福建省| 固阳县| 阿尔山市| 吕梁市| 盘锦市| 邢台市| 嫩江县| 福安市| 湘潭市| 黔江区| 邓州市|