EL--EL表達式語言基礎

EL 是 Expression Language 的簡稱,意思是表達式語言。它是JSP 2.0 中引入的一種計算和輸出Java對象的簡單語言,爲不熟悉Java語言頁面開發的人員提供了一種開發JSP應用程序的新途徑。

使用EL表達式的前提條件

只要安裝的Web服務器能夠支持Servlet 2.4/JSP 2.0,就可以在JSP頁面中直接使用EL表達式。
由於在JSP2.0以前不存在EL表達式,爲了和以前的規範兼容,JSP特意提供了禁用EL表達式。爲了保證頁面能正常解析EL表達式,需要確認EL表達式沒有被禁用。
JSP中提供了3種禁用EL表達式的方法,只有確認JSP中沒有通過以下3種方法禁用EL表達式,纔可以正確解析EL表達式,否則EL表達式的內容將原樣顯示到頁面中。
  1. 使用斜槓“\”符號:即在$前加\  eg:\${username}   該方法適合只是禁用頁面的一個或幾個EL表達式的情況
  2. 使用JSP的page指令:<%@ page isELlgnored = "true|false" %> 如果值爲true則忽略頁面中的EL表達式,否則將解析頁面中的EL表達式。該方法適用於禁用一個頁面中的EL表達式
  3. 在web.xml文件中配置<el-lgnored>元素該方法適用於禁用Web應用中所有的JSP頁面。

配置代碼如下:

1
2
3
4
5
6
<jsp-config>
 <jsp-property-group>
    <url-parttrn> *.jsp</url-pattern>
    <el-lgnored>true</el-lgnored><!--將此處設爲false,表示使用EL表達式-->
 </jsp-property-group>
</jsp-config>

EL表達式的基本語法

EL表達式的語法很簡單,它以"${”開頭,以"}"結尾,中間爲合法的表達式。即形如:${表達式}
在EL表達式要輸出一個字符串,可以將此字符串放在一對單引號或雙引號內。

EL表達式特點
  • 在EL表達式中可以獲取命名空間(PageContext 對象,它是頁面中所有其他內置對象的最大範圍的集成對象,通過它可以訪問其他內置對象)。
  • EL表達式不僅可以訪問一般變量,而且可以訪問JavaBean中的屬性以及嵌套屬性和集合對象。
  • 在EL表達式中可以執行關係運算,邏輯運算和算術運算等。
  • 擴展函數可以與Java類的靜態方法進行映射。
  • 在表達式中可以訪問JSP的作用域(request,session,application和page)。
  • EL表達式可以與JSTL結合使用,也可以與JavaScript語句結合使用。
EL表達式的存取範圍

當EL表達式中的變量沒有指定範圍時,系統默認從page範圍中查找,然後依次在request,session和application範圍內查找。如果在此過程中找到指定變量,則直接返回,否則返回null。另外,EL表達式提供了指定存取範圍的方法。在要輸出表達式的前面加入指定存取範圍的前綴即可指定該變量的存取範圍。這裏所說的前綴,實際上就是EL表達式提供的用於訪問作用域的隱含對象。                                                                                            
EL表達式中使用的變量範圍前綴
範圍 前綴 舉例說明
page pageScope 例如:${pageScope.username}表示在page範圍內查找變量username,若找不到直接返回null
request requestScope 例如:${requestScope.username}表示在request範圍內查找變量username,若找不到直接返回null
session sessionScope 例如:${sessionScope.username}表示在session範圍內查找變量username,若找不到直接返回null
application applicationScope 例如:${applicationScope.username}表示在application範圍內查找變量username,若找不到直接返回null

EL表達式的運算符
  • 存取數據運算符:獲取對象屬性。
  • 算術運算符
  • 關係運算符
  • 邏輯運算符
  • empty運算符
  • 條件運算符
存取數據運算符"[]"和"."
例如:${user.name}或者${user[name]}都是表示獲取對象user的name屬性值。通常情況下,獲取指定對象的屬性使用的是"."運算符。
但是當屬性名中包含一些特殊符號(如 "." 或者"-"等非字母或者數字符號)時,就只能使用"[]"來訪問屬性值。
例如:${sessionScope.user[user-name]}是正確的,而${sessionScope.user.user-name}是錯誤的。

EL表達式中可以使用"[]"運算符來讀取數組,Map,List或者對象中的數據。
  1. 數組元素的獲取                                                                                                                                                                                                          
  2. List集合元素的獲取
  3. Map集合元素的獲取
數組元素的獲取  
1
2
3
4
5
<%
 String[] arrFruit={"蘋果","西瓜","芒果","荔枝"};//定義數組
 request.setAttribute("fruit",arrFruit);//將數組保存到request對象中
%>
${requestScope.fruit[1]}   <!--輸出數組中的第二個元素-->
List集合元素的獲取
1
2
3
4
5
6
7
8
<%
List list=new ArrayList();
list.add("蘋果");
list.add("西瓜");
list.add("芒果");
session.setAttribute("fruitList",list);//將List集合保存到session對象中
%>
${sessionScope.fruitList[1]}

Map集合元素的獲取

1
2
3
4
5
6
7
8
<%
Map map=new HashMap();
map.put("1","蘋果");
map.put("2","西瓜");
map.put("3","芒果");
application.setAttribute("fruitMap",map);//將Map集合保存到application對象中
%>
${applicationScope.fruitMap[1]}

算術運算符​

EL表達式的算術運算符
運算符 功能 舉例說明
+ ${6+1},返回值爲7
- ${7-1},返回值爲6
* ${23.5*10},返回值爲235.0
/或div ${16/2}或${16 div 2},返回值爲8.0
%或mod 取餘 ${15%4}或者${15 mod 4},返回值爲3

EL表達式無法像Java一樣將兩個字符串用"+"運算符連接在一起("明"+"日"),所以${"明"+"日"}的寫法是錯誤的。但是,可以採用${"明"}${"日"}的形式來表示。
關係運算符
EL表達式的關係運算符
運算符 功能 舉例說明
=或eq 等於 ${10=10}或${10 eq 10},返回true
${"A"="a"}或${"A" eq "a"},返回false
!=或ne 不等於 ${10!=10}或${10 ne 10},返回fasle
${"A"!="A"}或${"A" ne  "A"},返回false
<或lt 小於 ${5<3}或${5 lt 3},返回false
${"A"<"B"}或${"A" lt "B"},返回true
>或gt 大於 ${5>3}或${5 gt 3},返回true
${"A">"B"}或${"A" gt "B"},返回false
<=或le 小於等於 ${3<=4}或${3  le 4},返回true
${"A"<="A"}或${"A" le "A"},返回true
>=或ge 大於等於 ${3>=4}或${3 ge 4},返回fasle
${"A">="B"}或${"A" ge "B"},返回false

在使用EL表達式關係運算符時,不能寫成如下形式:
${param.pwd1}==${param.pwd2}
${${param.pwd1}==${param.pwd2}}
而應寫成
${param.pwd1==param.pwd2}

邏輯運算符

EL表達式提供了與,或,非3種邏輯運算符。
  1. "&&"或and運算符
  2. "||"或or運算符
  3. "!"或not運算符
"&&"或and運算符
"&&"或and運算符爲與運算符,只有在兩個操作數的值均爲true時,才返回true,否則返回false。
${username =="mr" &&pwd =="mrsoft"}
與運算符在執行的過程中,只要表達式的值可以確定,就會停止執行。例如:進行多個與運算時,如果遇到其中一個操作數的值爲false,則停止執行,並返回false。

"||"或or運算符
"||"或or運算符爲或運算符,只要有一個操作數的值爲true,就返回true,只有全部操作數均爲false,才返回false。
${username =="mr" || pwd =="mrsoft"}
或運算符同與運算符一樣,在執行過程中,只要表達式的值可以確定,就會停止執行,例如:進行多個或運算時,如果遇到其中一個操作數的值爲true,則停止執行,並返回true。

"!"或not運算符
"!"或not運算符爲非運算符,對操作數進行取反。如果原來操作數的值爲true,則返回false。
${!username =="mr"}

empty運算符

該運算符是一個前綴(prefix)運算符。即empty運算符位於操作數前方,用來確定一個對象或變量是否爲null或空。
empty運算符格式如下:
${empty expression}   expression:用於指定要判斷的變量或對象。
一個變量或對象爲null或空代表的是不同含義:null表示這個變量沒有指明任何對象;而空表示這個變量所屬的對象其內容爲空,例如空字符串,空的數組或者空的List容器。
empty運算符也可以與not運算符結合使用,用於確定一個對象或變量是否爲空。
例如:判斷session域中的變量user不爲空,可以使用以下代碼:
${not empty sessionScope.user}

條件運算符
語法格式如下:
${條件表達式?計算表達式1:計算表達式2}
如果條件爲真,則計算表達式1,否則計算表達式2。

運算符的優先級
 
[]                                                                           |   高
()                                                                          |
-(負號) not ! empty                                             |
* / div % and                                                         |
+(加號)   -(減號)                                                   |             
()<= >= lt gt le ge      |
== != eq ne             |
&& and                  |
|| or                   |
?:                      | 低
對於同級的運算符采用從左向右計算的原則。使用()可以改變優先級。

EL表達式中的保留字

EL表達式中的保留字
and eq gt true instanceof div or ne
le false lt empty mod not ge null

EL表達式中的隱含對象

java.util.Map
EL表達式的隱含對象
  隱含對象 對象類型 說明
頁面上下文對象 pageContext java.servlet.jsp.PageContext 用於訪問JSP內置對象
  param java.util.Map 包含頁面所有參數的名稱和對應值的集合
  paramValues java.util.Map 包含頁面所有參數的名稱和對應多個值的集合
訪問環境信息的隱含對象 header java.util.Map 包含每個header名和值的集合
  headerValues java.util.Map 包含每個header名和可能的多個值的集合
  cookie java.util.Map 包含每個cookie名和值的集合
  initParam java.util.Map 包含Servlet上下文初始參數名和對應值的集合
     
  pageScope java.util.Map 包含page(頁面)範圍內的屬性值的集合
訪問作用域範圍的隱含對象 requestScope java.util.Map 包含request(請求)範圍內的屬性值的集合
  sessionScope java.util.Map 包含session(會話)範圍內的屬性值的集合
    java.util.Map 包含application(應用)範圍內的屬性值的集合

PageContext對象的應用

PageContext隱含對象用於訪問JSP內置對象,如request,response,out,session,config和servletContext等。
例如,要獲取當前session中的變量username可以使用以下EL表達式:
${PageContext.session.username}

param和paramValues對象的應用

param對象用於獲取請求參數的值,而如果一個參數名對應多個值時,則需要使用paramValues對象獲取請求參數的值。在應用param對象時,返回的結果爲字符串;在應用paramValues對象時,返回結果爲數組。
例如:在JSP頁面中放置一個名爲user的文本框
<input name="user" type="text" id="user">
當表單提交後,要獲取user文本框的值,可以使用下面EL表達式
${param.user}
如果user文本框可以輸入中文,那麼使用EL表達式輸出其內容前,還需使用"request.setCharacterEncoding("GBK");"語句設置請求的編碼GBK,否則將產生亂碼。
例如:
<input name="affect" type="checkbox" id="affect" value="體育">體育
<input name="affect" type="checkbox" id="affect" value="美術">美術
<input name="affect" type="checkbox" id="affect" value="音樂">音樂
當表單提交後,要獲取affect的值,可以使用以下EL表達式
愛好爲:${paramValues.affect[0]}${paramValues.affect[1]}${paramValues.affect[2]}
在應用param或paramValues對象時,如果指定的參數不存在,則返回空的字符串,而不是null。

header和headerValues對象的應用

header對象用於獲取HTTP請求的一個具體的header值,但是在某些情況下,可能存在同一個擁有多個不同的值,這時就必須使用headerValues對象。
例如:要獲取HTTP請求的header的Host屬性,可以使用以下EL表達式:
${header.host}或${header[host]}
輸出結果: localhost:8080
要獲取HTTP請求的header的Accept-Agent屬性,則必須使用以下EL表達式:
${header["user-agent"]}

訪問作用域範圍的隱含對象

EL表達式中提供了4個用於訪問作用域範圍的隱含對象:pageScope,requestScope,sessionScope,applicationScope。
4個隱含對象只能用來取得指定範圍內的屬性值,而不能取得其他相關信息。
${sessionScope.user}

cookie對象的應用

cookie對象用於訪問由請求設置的cookie名稱。如果在cookie中已經設定一個名爲username的值,那麼可以使用${cookie.username}來獲取cookie對象;但是如果要獲取cookie中的值,則需要使用cookie對象的value屬性。
所謂的cookie是一個文本文件,它是以key,value的方法將用戶會話信息記錄在這個文本文件內,並將其暫時存放在客戶端瀏覽器中。
例如:使用response對象設置一個請求有效的cookie對象,然後再使用EL表達式獲取cookie對象的值。
<%Cookie cookie = new Cookie("user","mr");
      response.addCookie(cookie);
%>
${cookie.user.value}

initParam對象的應用

initParam對象用於獲取Web應用初始化參數的值。
例如:在Web應用的web.xml文件中設置一個初始化參數author,用於指定作者。
1
2
3
4
<context-param>
     <param-name>author</param-name>
     <param-value>zoe</param-value>
</context-param>

應用EL表達式獲取該參數

${initParam.author}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章