EL表達式、基本語法、隱式對象,禁用EL表達式,EL主要作用
背景:
JSP表達式語言(Expression Language),簡稱EL,最初定義在JSTL1.0規範中,直到JSP2.0之後,EL表達式才正式成爲JSP規範中的一部分。EL爲存取變量、表達式運算和讀取內置對象等內容提供了新的操作方式。
EL表達式的目的是爲了使JSP頁面編寫起來更簡單。
EL表達式概述、EL表達式的基本語法、EL表達式的隱式對象、禁用EL表達式
EL表達式是爲了便於獲取數據而定義的一種語言,JSP 2.0之後才成爲一種標準。下面的示例是一個簡單的EL表達式:
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
${stuno + 1} <br>
</body>
</html>
EL表達式必須以“${XXX}”來表示,其中“XXX”部分就是具體表達式內容,“${}”將這個表達式內容包含在其中,作爲EL表達式的定義。
EL表達式的基本語法
EL表達式的出現讓Web的顯示層發生了大的變革,EL表達式用於獲取數據,在JSP 2.0之後成爲一種標準,是由JSP 標準標籤庫專家組和JSP 2.0 專家組開發。
EL表達式的語法格式: ${標識符}
在JSP頁面中使用的形式,通知JSP引擎調用pageContext.findAttribute()方法,以標識符爲關鍵字從各個域對象中獲取對象。如果域對象中不存在標識符所對應的對象,則返回結果爲“”(注意,不是null)。
語法結構
JSP EL用於以下情形
靜態文本
標準標籤和自定義標籤(可以作爲元素屬性的值,也可以在自定義或者 標準動作元素的內容中使用)
EL不能在腳本元素中使用
[]與.運算符
EL提供(.)和([])兩種運算符來存取數據,即使用點運算符(.)和方括號運算符([])。
點運算符和方括號運算符可以實現某種程度的互換,如${student.name}等價於${student [“name”]}。
當要存取的屬性名稱中包含一些特殊字符,如.或?等並非字母或數字的符號時,就一定要使用[]。例如${student.name }應當改爲${student[“name”] }。
如果要動態取值,就可以用[]來做,而.無法做到動態取值。例如${sessionScope.student[data]}中data是一個變量。
變量
EL存取變量數據的方法很簡單,例如${username}。它的意思是取出某一範圍中名稱爲username的變量。
屬性範圍 EL中的名稱
page pageScope
request requestScope
session sessionScope
application applicationScope
文字常量
一個EL表達式包含變量、文字常量、操作符。文字常量主要包括字符串、數字和布爾值、還有NULL,其中
字符串是由任何由單引號或雙引號引起來的一串字符。
數字常量包括整型、浮點型,整型表示十進制、十六進制和八進制類型的值,浮點型與Java類似,可以包含任何正的或者負的浮點數。
布爾型包括true和false。
${true} ${10} ${10.5f} ${“hello”} ${null}
操作符
EL表達式的操作符主要有
算術運算符
關係運算符
邏輯運算符
驗證運算符empty
條件運算符
算術運算符
算術運算符主要有平時常用的“+”、“-”、“*”、“/”、“%” 。
關係運算符
關係運算符主要有“==”、“!=”、“<”、“>”、“<=”、“>=”
== 或eq 判斷符號兩邊是否相等,相等返回true,否則返回false
!= 或ne 判斷符號兩邊是否不相等,不相等返回true,否則返回false
< 或lt 判斷符號左邊是否小於右邊,如果小於返回true,否則返回false
> 或gt 判斷符號左邊是否小於右邊,如果小於返回true,否則返回false
<= 或le 判斷符號左邊是否小於或者等於右邊,如果小於或者等於返回true,否則返回false
>= 或ge 判斷符號左邊是否大於或者等於右邊,如果大於或者等於返回true,否則返回false
邏輯運算符
邏輯運算符主要有“&&”、“||”、“!” 。
&& 或 and 與運算符,如果符號兩邊均爲true,則返回true,否則返回false
|| 或 or 或運算符,如果符號兩邊任何一邊爲true,則返回true,否則返回false
! 或 not 非運算符,在運算結果爲true的時候,則返回false,否則返回true
驗證運算符“empty”與條件運算符“?:”
empty empty作爲前綴,用來檢索一個值是否爲null或者empty。如${empty user.name}用來判斷user對象中的name的值是否爲null
? ${條件 ? truevalue:falsevalue},如果條件爲真,則表達式的值爲truevalue,否則爲falsevalue
EL表達式的隱式對象
在EL表達式中共有11個隱式對象
與作用範圍有關的EL隱含對象包含有:pageScope、requestScope、sessionScope和applicationScope
它們可以讀取使用JSP內置對象pageContext、request、session以及application的setAttribute()方法所設定的對象的數值-----即getAttribute(String name),卻不能取得其他相關信息。
例如,要取得session中儲存的一個username屬性的值,可以利用下面的方法:session.getAttribute("username")
在EL中則使用下面的方法:${sessionScope.username}
注意:如果沒有設定使用EL內置對象的作用範圍,則按照pageScope、requestScope、sessionScope和applicationScope的先後順序讀取屬性值。
即,通知JSP引擎調用pageContext.findAttribute()方法,以標識符爲關鍵字從各個域對象中獲取對象。如果域對象中不存在標識符所對應的對象,則返回結果爲“”(注意,不是null)。
與輸入有關的隱含對象有兩個,即param和paramValues,它們是EL中比較特別的隱含對象。例如,要取得用戶的請求參數時,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中則可以使用param和paramValues兩者來取得數據:
${param.name}
${paramValues.name}(這時可同時使用[]運算符號來讀取哪個元素,例如${paramValues.week[0]}
)
其他隱式對象
cookie
用來取得使用者的cookie值,例如在cookie中設定了username屬性值,可以使用${cookie.username.value}來取得屬性值。
header和headerValues
讀取請求的頭數據,使用header或headerValues內置對象,例如${header[“User-Agent”]},headerValues則用來取得所有的頭信息,等價於調用request.getHeaders()方法。
initParam
initParam用來讀取設置在web.xml中的參數值。例如${initParam.repeat},等價於:(String)application.getInitParameter(“repeat”); 或
servletContext.getInitParameter(“repeat”);
pageContext
pageContext用於取得其他有關用戶要求或頁面的詳細信息
${pageContext.request.queryString} 取得請求的參數字符串
${pageContext.request.requestURL} 取得請求的URL,不包括參數字符串
${pageContext.request.contextPath} 服務的web application 的名稱
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的協議(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用戶名稱
${pageContext.request.remoteAddr } 取得用戶的IP 地址
${pageContext.session.new} 判斷session 是否爲新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主機端的服務信息
禁 用 EL
在JSP 2.0中默認是啓用EL表達式的,但如果在JSP頁面中使用了與JSP EL標記符相沖突的其他技術,可以通過使用page指令的isELIgnored屬性來忽略JSP EL的標識符。
<%@page isELIgnored="true|false"%>
true:表示忽略對EL表達式進行計算。
false:表示計算EL表達式。
isELIgnored默認爲false。
還可以修改web.xml來決定當前的web應用不使用JSP EL。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignore>
</jsp-property-group>
</jsp-config>
Web.xml中的<el-ignored>標記用來預設所有JSP網頁是否使用JSP EL,如果web.xml和page制定都進行了設定,page指令的設定優先級要高。
EL主要作用:
獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域 中檢索java對象、獲取數據。(某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組)
執行運算:
利用EL表達式可以在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}
獲取web開發常用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆獲得對web常用對象的引用,從而獲得這些對象中的數據。
使用EL表達式獲取數據語法:“${標識符}”
EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。
示例:${user}
EL表達式也可以很輕鬆獲取JavaBean的屬性,或獲取數組、Collection、Map類型集合的數據,例如:
${user.address.city}
${user.list[0]}:訪問有序集合某個位置的元素
${map.key} : 獲得map集合中指定key的值
結合JSTL的foreach標籤,使用EL表達式也可以很輕鬆迭代各種類型的數組或集合,示例:
迭代數組
迭代collection類型集合
迭代map類型集合