JSP 表達式語言


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


        一個簡單的語法

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

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

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

${expr}

其中,expr指的是表達式。在JSP EL中通用的操作符是"."和"[]"。這兩個操作符可讓您透過內嵌的JSP物件存取各種各樣的JavaBean屬性。

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

<jsp:setProperty name="box" property="perimeter" 
                 value="${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                    測驗是否小於
                    > 或 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.jpg

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

隱含物件說明