JSP的EL表達式語言
以下內容引用自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.user−agent或{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表達式語言