JSP 表示式語言

JSP 表示式語言

JSP表示式語言(EL)使得訪問儲存在JavaBean中的資料變得非常簡單。JSP EL既可以用來建立算術表示式也可以用來建立邏輯表示式。在JSP EL表示式內可以使用整型數,浮點數,字串,常量true、false,還有null。


一個簡單的語法

典型的,當您需要在JSP標籤中指定一個屬性值時,只需要簡單地使用字串即可:

<jsp:setProperty name="box" property="perimeter" value="https://www.itread01.com/jsp/100"/>

JSP EL允許您指定一個表示式來表示屬性值。一個簡單的表示式語法如下:

${expr}

其中,expr指的是表示式。在JSP EL中通用的操作符是 .{} 。這兩個操作符允許您通過內嵌的JSP物件訪問各種各樣的JavaBean屬性。

舉例來說,上面的<jsp:setProperty>標籤可以使用表示式語言改寫成如下形式:

<jsp:setProperty name="box" property="perimeter" 
                 value="https://www.itread01.com/jsp/${2*box.width+2*box.height}"/>

當JSP編譯器在屬性中見到"${}"格式後,它會產生程式碼來計算這個表示式,並且產生一個替代品來代替表示式的值。

您也可以在標籤的模板文字中使用表示式語言。比如<jsp:text>標籤簡單地將其主體中的文字插入到JSP輸出中:

<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>

現在,在<jsp:text>標籤主體中使用表示式,就像這樣:

<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

在EL表示式中可以使用圓括號來組織子表示式。比如${(1 + 2) * 3}等於9,但是${1 + (2 * 3)} 等於7。

想要停用對EL表示式的評估的話,需要使用page指令將isELIgnored屬性值設為true:

<%@ page isELIgnored ="true|false" %>

這樣,EL表示式就會被忽略。若設為false,則容器將會計算EL表示式。


EL中的基礎操作符

EL表示式支援大部分Java所提供的算術和邏輯操作符:

操作符 描述
. 訪問一個Bean屬性或者一個對映條目
[] 訪問一個數組或者連結串列的元素
( ) 組織一個子表示式以改變優先順序
+
- 減或負
*
/ 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中的函式

JSP EL允許您在表示式中使用函式。這些函式必須被定義在自定義標籤庫中。函式的使用語法如下:

${ns:func(param1, param2, ...)}

ns指的是名稱空間(namespace),func指的是函式的名稱,param1指的是第一個引數,param2指的是第二個引數,以此類推。比如,有函式fn:length,在JSTL庫中定義,可以像下面這樣來獲取一個字串的長度:

${fn:length("Get my length")}

要使用任何標籤庫中的函式,您需要將這些庫安裝在伺服器中,然後使用<taglib>標籤在JSP檔案中包含這些庫。


JSP EL隱含物件

JSP EL支援下表列出的隱含物件:

隱含物件 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 物件的引數,字串
paramValues Request物件的引數,字串集合
header HTTP 資訊頭,字串
headerValues HTTP 資訊頭,字串集合
initParam 上下文初始化引數
cookie Cookie值
pageContext 當前頁面的pageContext

您可以在表示式中使用這些物件,就像使用變數一樣。接下來會給出幾個例子來更好的理解這個概念。


pageContext物件

pageContext物件是JSP中pageContext物件的引用。通過pageContext物件,您可以訪問request物件。比如,訪問request物件傳入的查詢字串,就像這樣:

${pageContext.request.queryString}

Scope物件

pageScope,requestScope,sessionScope,applicationScope變數用來訪問儲存在各個作用域層次的變數。

舉例來說,如果您需要顯式訪問在applicationScope層的box變數,可以這樣來訪問:applicationScope.box。


param和paramValues物件

param和paramValues物件用來訪問引數值,通過使用request.getParameter方法和request.getParameterValues方法。

舉例來說,訪問一個名為order的引數,可以這樣使用表示式:${param.order},或者${param["order"]}。

接下來的例子表明瞭如何訪問request中的username引數:

<%@ 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物件則返回一個字串陣列。


header和headerValues物件

header和headerValues物件用來訪問資訊頭,通過使用 request.getHeader方法和request.getHeaders方法。

舉例來說,要訪問一個名為user-agent的資訊頭,可以這樣使用表示式:${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>

執行結果如下:

jsp-expression-language

header物件返回單一值,而headerValues則返回一個字串陣列。