- JavaWeb從入門到精通(視頻實戰版)
- 常倬林等編著
- 2062字
- 2018-12-31 19:36:05
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保留字

- Dynamics 365 for Finance and Operations Development Cookbook(Fourth Edition)
- Django+Vue.js商城項目實戰
- Spring 5.0 By Example
- C語言程序設計案例教程(第2版)
- C#程序設計實訓指導書
- C# 2012程序設計實踐教程 (清華電腦學堂)
- Arduino開發實戰指南:LabVIEW卷
- 匯編語言程序設計(第2版)
- Data Analysis with Stata
- Oracle Database 12c Security Cookbook
- 軟件工程
- Visual Basic程序設計上機實驗教程
- Machine Learning in Java
- Mastering Git
- Access 2010中文版項目教程