JSP 表達(dá)式語(yǔ)言

2022-06-20 14:34 更新

JSP 表達(dá)式語(yǔ)言(EL)使得訪問存儲(chǔ)在 JavaBean 中的數(shù)據(jù)變得非常簡(jiǎn)單。JSP EL 既可以用來創(chuàng)建算術(shù)表達(dá)式也可以用來創(chuàng)建邏輯表達(dá)式。在 JSP EL 表達(dá)式內(nèi)可以使用整型數(shù),浮點(diǎn)數(shù),字符串,常量 true、false,還有 null。


一個(gè)簡(jiǎn)單的語(yǔ)法

典型的,當(dāng)您需要在 JSP 標(biāo)簽中指定一個(gè)屬性值時(shí),只需要簡(jiǎn)單地使用字符串即可:

<jsp:setProperty name="box" property="perimeter" value="100"/>

JSP EL 允許您指定一個(gè)表達(dá)式來表示屬性值。一個(gè)簡(jiǎn)單的表達(dá)式語(yǔ)法如下:

${expr}

其中,?expr? 指的是表達(dá)式。在 JSP EL 中通用的操作符是?"."?和?"[]"?。這兩個(gè)操作符允許您通過內(nèi)嵌的 JSP 對(duì)象訪問各種各樣的 ?JavaBean? 屬性。

舉例來說,上面的?<jsp:setProperty>?標(biāo)簽可以使用表達(dá)式語(yǔ)言改寫成如下形式:

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

當(dāng) JSP 編譯器在屬性中見到"?${}?"格式后,它會(huì)產(chǎn)生代碼來計(jì)算這個(gè)表達(dá)式,并且產(chǎn)生一個(gè)替代品來代替表達(dá)式的值。

您也可以在標(biāo)簽的模板文本中使用表達(dá)式語(yǔ)言。比如?<jsp:text>?標(biāo)簽簡(jiǎn)單地將其主體中的文本插入到 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á)式中可以使用圓括號(hào)來組織子表達(dá)式。比如?${(1 + 2) * 3}?等于9,但是?${1 + (2 * 3)} ?等于7。

想要停用對(duì) EL 表達(dá)式的評(píng)估的話,需要使用 ?page ?指令將 ?isELIgnored? 屬性值設(shè)為? true?:

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

這樣,EL 表達(dá)式就會(huì)被忽略。若設(shè)為?false?,則容器將會(huì)計(jì)算 EL 表達(dá)式。


EL中的基礎(chǔ)操作符

EL表達(dá)式支持大部分Java所提供的算術(shù)和邏輯操作符:

操作符 描述
. 訪問一個(gè)?Bean?屬性或者一個(gè)映射條目
[] 訪問一個(gè)數(shù)組或者鏈表的元素
( ) 組織一個(gè)子表達(dá)式以改變優(yōu)先級(jí)
+
- 減或負(fù)
*
/ or div
% or mod 取模
== or eq 測(cè)試是否相等
!= or ne 測(cè)試是否不等
< or lt 測(cè)試是否小于
> or gt 測(cè)試是否大于
<= or le 測(cè)試是否小于等于
>= or ge 測(cè)試是否大于等于
&& or and 測(cè)試邏輯與
|| or or 測(cè)試邏輯或
! or not 測(cè)試取反
empty 測(cè)試是否空值

JSP EL中的函數(shù)

JSP EL 允許您在表達(dá)式中使用函數(shù)。這些函數(shù)必須被定義在自定義標(biāo)簽庫(kù)中。函數(shù)的使用語(yǔ)法如下:

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

ns 指的是命名空間(namespace),?func?指的是函數(shù)的名稱,?param1?指的是第一個(gè)參數(shù),?param2? 指的是第二個(gè)參數(shù),以此類推。比如,有函數(shù)?fn:length?,在 JSTL 庫(kù)中定義,可以像下面這樣來獲取一個(gè)字符串的長(zhǎng)度:

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

要使用任何標(biāo)簽庫(kù)中的函數(shù),您需要將這些庫(kù)安裝在服務(wù)器中,然后使用?<taglib>?標(biāo)簽在 JSP 文件中包含這些庫(kù)。


JSP EL隱含對(duì)象

JSP EL支持下表列出的隱含對(duì)象:

隱含對(duì)象 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 對(duì)象的參數(shù),字符串
paramValues Request對(duì)象的參數(shù),字符串集合
header HTTP 信息頭,字符串
headerValues HTTP 信息頭,字符串集合
initParam 上下文初始化參數(shù)
cookie Cookie值
pageContext 當(dāng)前頁(yè)面的pageContext

您可以在表達(dá)式中使用這些對(duì)象,就像使用變量一樣。接下來會(huì)給出幾個(gè)例子來更好的理解這個(gè)概念。


pageContext對(duì)象

? pageContext? 對(duì)象是 JSP 中 ?pageContext? 對(duì)象的引用。通過 ?pageContext? 對(duì)象,您可以訪問 ?request? 對(duì)象。比如,訪問 ?request? 對(duì)象傳入的查詢字符串,就像這樣:

${pageContext.request.queryString}

Scope對(duì)象

? pageScope?,?requestScope?,?sessionScope?,?applicationScope? 變量用來訪問存儲(chǔ)在各個(gè)作用域?qū)哟蔚淖兞俊?/p>

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


param和paramValues對(duì)象

? param? 和 ?paramValues? 對(duì)象用來訪問參數(shù)值,通過使用 ?request.getParameter? 方法和? request.getParameterValues? 方法。

舉例來說,訪問一個(gè)名為? 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 對(duì)象返回單一的字符串,而 ?paramValues ?對(duì)象則返回一個(gè)字符串?dāng)?shù)組。


header和headerValues對(duì)象

? header? 和 ?headerValues ?對(duì)象用來訪問信息頭,通過使用 ?request.getHeader? 方法和?request.getHeaders? 方法。

舉例來說,要訪問一個(gè)名為 ?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>

運(yùn)行結(jié)果如下:

jsp-expression-language

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)