1. 程式人生 > >JSP的EL表達式語言

JSP的EL表達式語言

set 常量 pri 查詢 scope 例子 row true github

以下內容引用自http://wiki.jikexueyuan.com/project/jsp/expression-language.html:

JSP表達式語言(EL)可以方便地訪問存儲在JavaBean組件中的應用程序的數據。JSP EL允許創建表達式(a)算術和(b)邏輯。在一個JSP EL表達式中,可以使用整數、浮點型數字、字符串、內置的布爾常量值為true和false和null。

一、簡單的語法

通常,當給JSP標簽指定一個屬性值時,只需使用一個字符串。例如:

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

JSP EL允許給表達式指定這些屬性值。一個簡單的JSP EL語法如下:

${expr}

這裏的expr是指定表達式本身。在JSP EL中最常見的操作符是.和[]。這兩個操作符允許訪問Java beans和內置JSP對象的各種屬性。

例如可以用一個表達式編寫上面的語法<jsp:setProperty>標簽,如下:

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

當JSP編譯器在一個屬性中看到了${}形式,它可以生成計算表達式的代碼,並且替換表達式的值。

還可以在模板文本中對一個標簽使用JSP EL表達式。例如,把<jsp:text>標簽簡單的插入到一個JSP的主體內容中。在下面的<jsp:text>聲明中,插入<h1>Hello JSP!</h1>到JSP輸出:

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

可以在<jsp:text>標簽(或任何其他標簽)的標簽體內引入一個JSP EL表達式,對屬性使用${}語法。例如:

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

EL表達式可以使用括號組成子表達式。例如,${(1 + 2)*3} = 9,但${1+(2*3)} = 7。

禁止EL表達式的計算,指定頁面指令的isELIgnored屬性如下:

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

這個屬性的有效值是true和false。如果它是true,當它們出現在靜態文本或標簽屬性時,EL表達式被忽略。如果它是false,EL表達式都由容器進行計算。

二、EL的基本操作

JSP表達式語言(EL)支持大多數Java支持的算術和邏輯運算符。下面是最常用的操作符的列表:

操作描述
. 訪問bean屬性或映射項
[] 訪問數組或鏈表元素
( ) 組成子表達式來修改計算順序
+
- 減或負數
*
/ or div
% or mod 模計算/余數
== or eq 等於
!= or ne 不等於
< or lt 小於
> or gt 大於
<= or le 小於等於
>= or gt 大於等於
&& or and 邏輯與
|| or or 邏輯或
! or not 一元布爾補集
empty 空的變量值

三、JSP EL中的函數

JSP EL同樣允許使用函數表達式。這些功能必須定義在自定義標簽庫中。一個函數利用下面的語法使用:

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

其中,ns是函數的命名空間,func是函數名,param1是第一個參數值。例如,函數fn:length,它是JSTL庫的一部分,可以使用它得到一個字符串的長度,如下所示:

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

要從(標準或自定義)標簽庫中使用一個函數,必須在服務器上安裝庫,而且必須在JSP中使用<taglib>指令來引用該庫。

四、JSP EL隱式對象

JSP表達式語言支持以下隱式對象:

隱式對象描述
pageScope 變量範圍是頁面範圍
requestScope 變量範圍是請求範圍
sessionScope 變量範圍是會話範圍
applicationScope 變量範圍是應用範圍
param 請求參數作為字符串
paramValues 請求參數作為字符串集合
header HTTP請求標頭作為字符串
headerValues HTTP請求標頭作為字符串集合
initParam 上下文初始化參數
cookie Cookie 值
pageContext 當前頁面的 JSP PageContext 對象

可以在表達式中使用這些對象,把它們看做是變量。這裏有一些明確概念的例子:

1、pageContext對象

pageContext對象允許訪問pageContext JSP對象。通過pageContext對象,可以訪問請求對象。例如,要訪問請求傳入的查詢字符串,可以使用下面的表達式:

${pageContext.request.queryString}

2、Scope對象

sessionScope、pageScope、requestScop、applicationScope變量在每個級別範圍提供變量存儲。

例如,如果需要顯式地在應用範圍內訪問box變量,可以通過applicationScope變量作為applicationScope.box來訪問。

3、param和paramValues對象

param和paramValues對象通常通過request.getParameter和request.getParameterValues方法來有效的訪問參數值。

例如,使用表達式param.order{param["order"]}來訪問命名為order的參數。

下面是訪問命名為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對象返回字符串數組。

這將產生如下所示結果:

技術分享

4、header和headerValues對象

header和headerValue對象通常通過request.getHeader和request.getHeaders方法來有效的訪問標頭值。

例如,使用表達式header.useragent{header["user-agent"]}來訪問命名得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>

header對象返回單個字符串值,而headerValues對象返回字符串數組。

這將產生如下所示結果:

技術分享

測試工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test21

JSP的EL表達式語言