1. 程式人生 > 其它 >Web基礎知識(13)- JSP (五)

Web基礎知識(13)- JSP (五)

JSP 表示式語言(EL)


為了簡化 JSP 頁面,JSP 2.0 新增了 EL(Expression Language)表示式語言。EL 提供了更為簡潔、方便的形式來訪問變數和引數,不僅可以簡化 JSP 頁面程式碼,還會使開發者的邏輯變得更加清晰。


1. EL表示式的語法

    EL 表示式語法如下:

        ${EL表示式}

    EL 表示式語法以 ${ 開頭,以 } 結束,中間為合法的表示式。

        ${name}
    
    表示獲取引數 name 的值,它等同於 <%=request.getParameter('name') %>。
    
    從形式和語法上可以看出,EL 表示式簡化了 JSP 原有的表示式。在實際開發中,EL 表示式也是經常使用的方式。

    EL 表示式定義了許多運算子,如算術運算子、比較運算子、邏輯運算子等,使用這些運算子,可以使 JSP 頁面更加簡潔。

2. EL算術運算子

    算術運算子用來進行加、減、乘、除和求餘,EL 表示式算術運算子如下:

運算子 說明 範例 結果
+ ${5+2} 7
- ${5-2} 3
* ${5*2} 10
/ 或 div ${5/2} 2
% 或 mod 求餘 ${5%2} 1


    注意:EL 的 + 運算子與 Java 的 + 運算子不一樣,它無法實現兩個字串的連線運算。如果該運算子連線的兩個值不能轉換為數值型的字串,則會丟擲異常;反之,EL 會自動將這兩個字元轉換為數值型資料,再進行運算。

    EL 表示式中還可以使用 ( ) 改變優先順序,例如:${2+3*2} 等於 8,${(2+3)*2} 等於 10。

3. EL比較運算子

    比較運算子用來實現兩個表示式的比較,進行比較的表示式可以是數值型或字串。EL 表示式比較運算子如下:

運算子 說明 範例 結果
== 或 eq 等於 ${6==6}, ${"A" eq "a"} true, false
!= 或 ne 不等於 ${6!=6}, ${“A” ne “a”} false, true
< 或 lt 小於 ${3<8}, ${"A" lt "a"} true, true
> 或 gt 大於 ${3>8}, ${"A" gt "a"} false, false
<= 或 le 小於等於 ${3<=8}, ${"A" le "a"}  true, true
>= 或 ge 大於等於 ${3>=8}, ${"A" ge "a"} false, false

 

4. EL邏輯運算子

    邏輯運算子兩邊的表示式必須是布林型(Boolean)變數,其返回結果也是布林型(Boolean)。EL 表示式邏輯運算子如下:

運算子 說明 範例 結果
&& 或 and ${2>1 && 3<4 } 或 ${2>1 and 3<4 } true
|| 或 or  ${2<1 || 3>4} 或 ${2<1 or 3>4} false
! 或 not ${!(2>4)} 或 ${not (2>4)}  true

 

5. EL其它運算子



    1) . 和 []

        . 和 [] 是 EL 中最常用的運算子,用來訪問 JavaBean 中的屬性和隱式物件的資料。一般情況下,. 用來訪問 JavaBean 屬性或 Map 型別的值,[]用來訪問陣列或者列表的元素。

    2) empty

        empty 用來判斷 EL 表示式中的物件或者變數是否為空。若為空或者 null,返回 true,否則返回 false。

    3) 條件運算子

        EL 表示式中,條件運算子的語法和 Java 的完全一致,如下:

            ${條件表示式 ? 表示式1 : 表示式2}

        其中,條件表示式用於指定一個判定條件,該表示式的結果為 boolean 型別。如果該表示式的運算結果為 true,則返回表示式 1 的值;反之,返回表示式 2 的值。


6. EL運算子優先順序

    在 EL 表示式中,多種運算子混合運算時,優先順序如下表所示(由高至低,由左至右)。

序號 優先順序
1 [] .
2 ()
3 -(負)、not、! 、empty
4 * 、 / 、 div 、% 、mod
5 +、-(減)
6 <、>、<=、>=、lt、gt、le、ge
7 ==、!-、eq、ne
8 &&、and
9 ||、or
10 ${A?B:C}

 


7. EL保留字

    保留字是系統預留的名稱。在為變數命名時,應該避開這些預留的名稱,以免程式編譯時發生錯誤。EL 表示式的保留字如下表所示。

        lt  le    gt    ge  eq  ne  true  false
        and     or     not  instanceof  div  mod  empty  null

8. 禁用EL表示式

    如果不想使用 EL 表示式,可以禁用 EL 表示式。禁用 EL 表示式有以下 3 種方法:

    1) 禁用單個EL表示式

        在 EL 表示式前加 \,例如:

            \${2+3}

        頁面輸出:

            ${2+3}

    2) 禁用當前頁面的EL表示式

        將 page 指令中的 isELIgnored 屬性設定為 true,如下:

            <%@ page isELIgnored="true" %>

    3) 禁用整個Web應用的EL表示式

        在 web.xml 中配置 <el-ignored> 元素,如下:

        <jsp-property-group>
            <url-pattern>*jsp</url-pattern>
            <el-ignored>false</el-ignored>
        </jsp-propery-group>


9. EL內建物件

    為了顯示方便,EL 表示式語言提供了許多內建物件,可以通過不同的內建物件來輸出不同的內容。EL 表示式內建物件如下:

內建物件 說明
pageScope 獲取 page 範圍的變數
requestScope 獲取 request 範圍的變數
sessionScope 獲取 session 範圍的變數
applicationScope 獲取 application 範圍的變數
param 相當於 request.getParameter(String name),獲取單個引數的值
paramValues 相當於 request.getParameterValues(String name),獲取引數集合中的變數值
header 相當於 request.getHeader(String name),獲取 HTTP 請求頭資訊
headerValues 相當於 request.getHeaders(String name),獲取 HTTP 請求頭陣列資訊
initParam 相當於 application.getInitParameter(String name),獲取 web.xml 檔案中的引數值
cookie 相當於 request.getCookies(),獲取 cookie 中的值
pageContext 表示當前 JSP 頁面的 pageContext 物件


    從以上方法可以看出,EL 表示式可以輸出 4 種屬性範圍的內容。如果在不同的屬性範圍中設定了同一個屬性名稱,則按照 page、request、session、application 的順序依次查詢。

    我們也可以指定要取出哪一個範圍的變數,例如:${pagesScope.name},表示取出 page 範圍的 name 變數。


示例

1) EL 運算子、pageScope、requestScope、sessionScope、applicationScope 演示

        el.jsp 程式碼如下:

 1         <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
 2         <%@ page import="com.example.*,java.util.*"%>
 3         <!DOCTYPE html>
 4         <html>
 5         <body>
 6 
 7             <p><strong>EL算術運算子</strong></p>
 8             <p>\${5+2}: ${5+2}</p>
 9             <p>\${5-2}: ${5-2}</p>
10             <p>\${5*2}: ${5*2}</p>
11             <p>\${5/2}: ${5/2}</p>
12             <p>\${5%2}: ${5%2}</p>
13 
14             <p><strong>EL比較運算子</strong></p>
15             <p>\${6==6}: ${6==6}</p>
16             <p>\${"A" eq "a"}: ${"A" eq "a"}</p>
17             <p>\${6!=6}: ${6!=6}</p>
18             <p>\${"A" ne "a"}: ${"A" ne "a"}</p>
19             <p>\${3<8}: ${3<8}</p>
20             <p>\${"A" lt "a"}: ${"A" lt "a"}</p>
21             <p>\${3>8}: ${3>8}</p>
22             <p>\${"A" gt "a"}: ${"A" gt "a"}</p>
23             <p>\${3<=8}: ${3<=8}</p>
24             <p>\${"A" le "a"}: ${"A" le "a"}</p>
25             <p>\${3>=8}: ${3>=8}</p>
26             <p>\${"A" ge "a"}: ${"A" ge "a"}</p>
27 
28             <p><strong>EL邏輯運算子</strong></p>
29             <p>\${2>1 && 3<4}: ${2>1 && 3<4}</p>
30             <p>\${2<1 or 3>4}: ${2<1 or 3>4}</p>
31             <p>\${!(2>4)}: ${!(2>4)}</p>
32 
33             <p><strong>EL其它運算子</strong></p>
34             <%
35                 Test test = new Test();
36                 test.setName("Web Basic");
37                 session.setAttribute("test", test);
38 
39                 List list = new ArrayList();
40                 list.add("Java");
41                 list.add("Python");
42                 session.setAttribute("list", list);
43 
44                 String cart = null;
45             %>
46             <p>\${test.name}: ${test.name}</p>
47             <p>\${list[1]}: ${list[1]}</p>
48             <p>\${empty cart?"cart is empty":cart}: ${empty cart?"cart is empty":cart}</p>
49 
50             <p><strong>EL內建物件</strong></p>
51             <%
52                 pageContext.setAttribute("info", "page's value");
53                 request.setAttribute("info", "request's value");
54                 session.setAttribute("info", "session's value'");
55                 application.setAttribute("info", "application's value'");
56             %>
57             <p>\${info}: ${info}</p>
58             <p>\${pageScope.info}: ${pageScope.info}</p>
59             <p>\${requestScope.info}: ${requestScope.info}</p>
60             <p>\${sessionScope.info}: ${sessionScope.info}</p>
61             <p>\${applicationScope.info}: ${applicationScope.info}</p>
62 
63         </body>
64         </html>


    2) param、paramValues、cookie 演示

        login.jsp 程式碼如下:

 1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
 2             <!DOCTYPE html>
 3             <html>
 4             <body>
 5                 <%
 6                     request.setCharacterEncoding("UTF-8");
 7                     response.addCookie(new Cookie("wb_name", "WebBasic Name"));
 8                 %>
 9                 <form action="${pageContext.request.contextPath}/jsp/el2.jsp" method="post">
10                     <p>Name: <input type="text" name="name" value="Java" /><br>
11                         <input type="text" name="name" value="Python" /><br>
12                         <input type="text" name="name" value="Php" /></p>
13 
14                     <p>Url: <input type="text" name="url" value="www.test.com" /> </p>
15                     <p><input type="submit" value="Submit" /></p>
16                 </form>
17             </body>
18             </html>


            表單的 action 屬性也是一個 EL 表示式。${pageContext.request.contextPath} 等價於 <%=request.getContextPath()%>,意思就是取出部署的應用程式名,或者是當前的專案名稱。

        el2.jsp 程式碼如下:

 1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
 2             <!DOCTYPE html>
 3             <html>
 4             <body>
 5                 <%
 6                     request.setCharacterEncoding("UTF-8");
 7                 %>
 8                 <p>\${paramValues.name[0]}: ${paramValues.name[0]}</p>
 9                 <p>\${param.url}: ${param.url}</p>
10                 <p>\${cookie.wb_name.value}: ${cookie.wb_name.value}</p>
11             </body>
12             </html>