JSP表達(dá)式語言(EL)使得訪問存儲在JavaBean中的數(shù)據(jù)變得非常簡單。JSP EL既可以用來創(chuàng)建算術(shù)表達(dá)式也可以用來創(chuàng)建邏輯表達(dá)式。在JSP EL表達(dá)式內(nèi)可以使用整型數(shù),浮點數(shù),字符串,常量true、false,還有null。
典型的,當(dāng)您需要在JSP標(biāo)簽中指定一個屬性值時,只需要簡單地使用字符串即可:
<jsp:setProperty name="box" property="perimeter" value="100"/>
JSP EL允許您指定一個表達(dá)式來表示屬性值。一個簡單的表達(dá)式語法如下:
${expr}
其中,expr指的是表達(dá)式。在JSP EL中通用的操作符是"."和"[]"。這兩個操作符允許您通過內(nèi)嵌的JSP對象訪問各種各樣的JavaBean屬性。
舉例來說,上面的標(biāo)簽可以使用表達(dá)式語言改寫成如下形式:
<jsp:setProperty name="box" property="perimeter" value="${2*box.width+2*box.height}"/>
當(dāng)JSP編譯器在屬性中見到"${}"格式后,它會產(chǎn)生代碼來計算這個表達(dá)式,并且產(chǎn)生一個替代品來代替表達(dá)式的值。
您也可以在標(biāo)簽的模板文本中使用表達(dá)式語言。比如標(biāo)簽簡單地將其主體中的文本插入到JSP輸出中:
<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>
現(xiàn)在,在<jsp:text>標(biāo)簽主體中使用表達(dá)式,就像這樣:
<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>
在EL表達(dá)式中可以使用圓括號來組織子表達(dá)式。比如${(1 + 2) * 3}等于9,但是${1 + (2 * 3)} 等于7。
想要停用對EL表達(dá)式的評估的話,需要使用page指令將isELIgnored屬性值設(shè)為true:
<%@ page isELIgnored ="true|false" %>
這樣,EL表達(dá)式就會被忽略。若設(shè)為false,則容器將會計算EL表達(dá)式。
EL表達(dá)式支持大部分Java所提供的算術(shù)和邏輯操作符:
|
操作 |
符描述 |
|---|---|
|
. |
訪問一個Bean屬性或者一個映射條目 |
|
[] |
訪問一個數(shù)組或者鏈表的元素 |
|
( ) |
組織一個子表達(dá)式以改變優(yōu)先級 |
|
+ |
加 |
|
- |
減或負(fù) |
|
* |
乘 |
|
/ or div |
除 |
|
% or mod |
取模 |
|
== or eq |
測試是否相等 |
|
!= or ne |
測試是否不等 |
|
< or lt |
測試是否小于 |
|
> or gt |
測試是否大于 |
|
<= or le |
測試是否小于等于 |
|
>= or ge |
測試是否大于等于 |
|
&& or and |
測試邏輯與 |
|
|| or or |
測試邏輯或 |
|
! or not |
測試取反 |
|
empty |
測試是否空值 |
JSP EL允許您在表達(dá)式中使用函數(shù)。這些函數(shù)必須被定義在自定義標(biāo)簽庫中。函數(shù)的使用語法如下:
${ns:func(param1, param2, ...)}
ns指的是命名空間(namespace),func指的是函數(shù)的名稱,param1指的是第一個參數(shù),param2指的是第二個參數(shù),以此類推。比如,有函數(shù)fn:length,在JSTL庫中定義,可以像下面這樣來獲取一個字符串的長度:
${fn:length("Get my length")}
要使用任何標(biāo)簽庫中的函數(shù),您需要將這些庫安裝在服務(wù)器中,然后使用標(biāo)簽在JSP文件中包含這些庫。
JSP EL支持下表列出的隱含對象:
|
隱含對象 |
描述 |
|---|---|
|
pageScope |
page 作用域 |
|
requestScope |
request 作用域 |
|
sessionScope |
session 作用域 |
|
applicationScope |
application 作用域 |
|
param |
Request 對象的參數(shù),字符串 |
|
paramValues |
Request對象的參數(shù),字符串集合 |
|
header |
HTTP 信息頭,字符串 |
|
headerValues |
HTTP 信息頭,字符串集合 |
|
initParam |
上下文初始化參數(shù) |
|
cookie |
Cookie值 |
|
pageContext |
當(dāng)前頁面的pageContext |
您可以在表達(dá)式中使用這些對象,就像使用變量一樣。接下來會給出幾個例子來更好的理解這個概念。
pageContext對象是JSP中pageContext對象的引用。通過pageContext對象,您可以訪問request對象。比如,訪問request對象傳入的查詢字符串,就像這樣:
${pageContext.request.queryString}
Scope對象
pageScope,requestScope,sessionScope,applicationScope變量用來訪問存儲在各個作用域?qū)哟蔚淖兞俊?/p>
舉例來說,如果您需要顯式訪問在applicationScope層的box變量,可以這樣來訪問:applicationScope.box。
param和paramValues對象用來訪問參數(shù)值,通過使用request.getParameter方法和request.getParameterValues方法。
舉例來說,訪問一個名為order的參數(shù),可以這樣使用表達(dá)式:${param.order},或者${param["order"]}。
接下來的例子表明了如何訪問request中的username參數(shù):
<%@ page import="java.io.*,java.util.*" %>
<% String title = "Accessing Request Param"; %>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${param["username"]}</p>
</div>
</body>
</html>
param對象返回單一的字符串,而paramValues對象則返回一個字符串?dāng)?shù)組。
header和headerValues對象用來訪問信息頭,通過使用 request.getHeader方法和request.getHeaders方法。
舉例來說,要訪問一個名為user-agent的信息頭,可以這樣使用表達(dá)式:${header.user-agent},或者${header["user-agent"]}。
接下來的例子表明了如何訪問user-agent信息頭:
<%@ page import="java.io.*,java.util.*" %>
<% String title = "User Agent Example"; %>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${header["user-agent"]}</p>
</div>
</body>
</html>
運行結(jié)果如下:

header對象返回單一值,而headerValues則返回一個字符串?dāng)?shù)組。