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>