例:
${sessionScope.user.sex}
所有EL都是以 ${ 為起始、以} 為結(jié)尾的。
上述EL范例的意思是:從Session取得用戶的性別。如果使用之前JSP代碼的寫法如下:
<%
User user = (User)session.getAttribute(”user”);
String sex = user.getSex( );
%>
兩者相比較之下,可以發(fā)現(xiàn)EL的語法比傳統(tǒng)JSP代碼更為方便、簡潔。
EL提供 . 和 [ ] 兩種運算符來存取數(shù)據(jù),[ ]可以訪問集合或者是數(shù)組的元素、Bean的屬性。
下列兩者所代表的意思是一樣的,但是需要保證要取得對象的那個的屬性有相應的setXxx()和getXxx()方法才行。
例:
${sessionScope.user.sex}
等于 ${sessionScope.user["sex"]}
. 和 [ ] 也可以同時混合使用,如下:
${sessionScope.shoppingCart[0].price}
返回結(jié)果為shoppingCart中第一項物品的價格。
在EL中,字符串既可以使用”abc”,可以使用’abc’。
EL運算符
EL的算術(shù)運算符和Java中的運算符的大致相同,優(yōu)先級也相同。
注意:’+’ 運算符不會連接字符串了,他只用于加法運算。
EL關(guān)系運算符有以下六個運算符
關(guān)系運算符????? 說 明??????????????? 范 例???????????? 結(jié)果
= = 或 eq?? |??? 等于?? |${ 5 = = 5 } 或 ${ 5 eq 5 } | true
!= 或 ne??? |?? 不等于 |${ 5 != 5 } 或 ${ 5 ne 5 } | false
< 或 lt???? |?? 小于??? |${ 3 < 5 }或 ${ 3 lt 5 }??? | true
> 或 gt???? |?? 大于??? |${ 3 > 5 }或 ${ 3 gt 5 }??? | false
<= 或 le??? | 小于等于 |${ 3 <= 5 }或 ${ 3 le 5 }?? | true
>= 或 ge??? | 大于等于 |${ 3 >= 5 }或 ${ 3 ge 5 }?? | false
empty運算符
Empty運算符主要用來判斷值是否為null或空的,例如:
${ empty param.name }
接下來說明Empty運算符的規(guī)則:
{empty} A
如果A為null時,返回true
如果A不存在時,返回true
如果A為空字符串時,返回true
如果A為空數(shù)組時,返回true
如果A為空的Map時,返回true
如果A為空的Collection時,返回true
否則,返回false
注意:
在使用EL關(guān)系運算符時,不能夠?qū)懗桑?br />${param.password1} = = ${param.password2}
或者
${ ${param.password1 } = = ${ param.password2 } }
而應寫成
${ param.password1 = = param.password2 }
使用EL從表單中取得數(shù)據(jù)
與輸入有關(guān)的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。
一般而言,我們在取得用戶的請求參數(shù)時,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中則可以使用param和paramValues兩者來取得數(shù)據(jù)。
${param.name}
${paramValues.name}可以取得所有同名參數(shù)的值
${paramValues.hobbies[0]}可以通過指定下標來訪問特定的參數(shù)的值
這里param的功能和request.getParameter(String name)相同,
而paramValues和request.getParameterValues(String name)相同。
如果用戶填了一個form,form名稱有為username的文本框,則我們就可以使
用${param.username}來取得用戶填入文本框的值。
EL函數(shù)
EL中使用函數(shù)要寫一個要使用到方法的類,然后在配置xxx.tld文件,然后在JSP中使用時和JSP的自定義標簽相似。
xxx.tld中的配置
<function>
<name>reverse</name><!–函數(shù)名–>
<function-class>jsp2.examples.el.Functions</function-class><!–函數(shù)所在的類–>
<function-signature>java.lang.String reverse( java.lang.String )</function-signature>
<!–函數(shù)原型,也就是函數(shù)的返回值類型,函數(shù)名,參數(shù)表,注意一定要寫類型的全名–>
</function>
使用EL函數(shù)的寫法
${sn:upper(’abc’)}
注意:在定義EL函數(shù)時,都必須為公開靜態(tài)(public static)
EL的隱含對象
EL也可以使用內(nèi)置對象中設置的屬性,需要使用特定的EL內(nèi)置對象
屬性范圍???? |??? 在EL中的對象
Page???????? |???? pageScope
Request????? |???? requestScope
Session????? |???? sessionScope
Application |???? applicationScope
EL中使用內(nèi)置對象的屬性
${requestScope.user}
等價于
<%request.getAttribute(”user”)%>
如果不寫出特定的范圍 ,那就會在不同的范圍間進行搜索了
例:{user}(user是在request范圍 request.setAttribute(”user”,user))
也就等于
${requestScope.user}
<%request.getAttribute(”user”)%>
EL的隱含對象
對象??????????????????????? 類 型????????????????? 說 明
PageContext????? | javax.servlet.ServletContext |表示此JSP的PageContext
———————————————————————————–
PageScope??????? | java.util.Map?? |取得Page范圍的屬性名稱所對應的值
————————————————————————————-
RequestScope???? | java.util.Map???????? |取得Request范圍的屬性名稱所對應的值
————————————————————————————-
sessionScope???? | java.util.Map???????? |取得Session范圍的屬性名稱所對應的值
————————————————————————————-
applicationScope | java.util.Map???????? |取得Application范圍的屬稱所對應的值
————————————————————————————-
param?????????? | java.util.Map |如同ServletRequest.getParameter(String name)返回String類型的值
—————————————————————————————-
paramValues?? | java.util.Map |如同ServletRequest.getParameterValues?? | (String name)。返回String []類型的值
—————————————————————————————–
header?????????? | java.util.Map?? |如同ServletRequest.getHeader(String name) 返回String類型的值
——————————————————————————————
headerValues???? |??? java.util.Map |如同ServletRequest.getHeaders(String name) 。返回String []類型的值
——————————————————————————————
cookie?? |???? java.util.Map???????? |如同HttpServletRequest.getCookies( )
——————————————————————————————
initParam?? | java.util.Map |如同ServletContext.getInitParameter(String name)。返回String類型的值
——————————————————————————————-
cookie對象
所謂的cookie是一個小小的文本文件,它是以key、value的方式將Session Tracking的內(nèi)容記錄在這個文本文件內(nèi),
這個文本文件通常存在于瀏覽器的暫存區(qū)內(nèi)。JSTL并沒有提供設定cookie的動作,
因為這個動作通常都是后端開發(fā)者必須去做的事情,而不是交給前端的開發(fā)者。如果我們在cookie中設定一個名
稱為userCountry的值,那么可以使用${cookie.userCountry}來取得它。
header和headerValues(請求報頭對象)
header儲存用戶瀏覽器和服務端用來溝通的數(shù)據(jù),當用戶要求服務端的網(wǎng)頁時,會送出一個記載要求信息的標頭文件,
例如:用戶瀏覽器的版本、用戶計算機所設定的區(qū)域等其他相關(guān)數(shù)據(jù)。如果要取得用戶瀏覽器的版本,
即${header["User-Agent"]}。另外在很少機會下,有可能同一標頭名稱擁有不同的值,此時必須改為使用headerValues來取得這些值。
注意:因為User-Agent中包含“-”這個特殊字符,所以必須使用“[]”,而不能寫成${header.User-Agent}。
initParam
就像其他屬性一樣,我們可以自行設定web應用的環(huán)境參數(shù)(Context),當我們想取得這些參數(shù)時,
可以使用initParam隱含對象去取得它,例如:當我們在web.xml中設定如下:
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4″>
<context-param>
<param-name>userid</param-name>
<param-value>mike</param-value>
</context-param>
</web-app>
那么我們就可以直接使用 ${initParam.userid}來取得名稱為userid,其值為mike的參數(shù)。
下面是之前的做法:String userid = (String)application.getInitParameter(”userid”);
pageContext對象
我們可以使用 ${pageContext}來取得其他有關(guān)用戶要求或頁面的詳細信息。下面列出了幾個比較常用的部分。
Expression??????????????????????????????? 說 明
${pageContext.request}????????????????? |取得請求對象
${pageContext.session}????????????????? |取得session對象
${pageContext.request.queryString}????? |取得請求的參數(shù)字符串
${pageContext.request.requestURL}?????? |取得請求的URL,但不包括請求之參數(shù)字符串
${pageContext.request.contextPath}????? |服務的web application的名稱
${pageContext.request.method}?????????? |取得HTTP的方法(GET、POST)
${pageContext.request.protocol}???????? |取得使用的協(xié)議(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser}?????? |取得用戶名稱
${pageContext.request.remoteAddr }????? |取得用戶的IP地址
${pageContext.session.new}????????????? |判斷session是否為新的,所謂新的session,表示剛由server產(chǎn)生而client尚未使用
${pageContext.session.id}?????????????? |取得session的ID
${pageContext.servletContext.serverInfo}|取得主機端的服務信息