EL表達式
EL的全稱是表達式語言(Expression Language,EL),它是JSP2.0新增加的技術規範。引入EL表達式語言目的之一是爲JSP頁面計算、訪問和打印數據提供方便,儘可能減少JSP頁面中的Java代碼,使JSP頁面更簡潔、更易於開發和維護。
EL表達式的基本語法
前者爲即時計算。後者爲延遲計算,通常用於JSF框架中
EL表達式可以寫在HTML標記的標記體內,也可以寫標記屬性值內。
EL表達式中數值常量直接書寫,例如:${3+5}
EL隱含對象
EL定義了11個隱含對象來方便讀取JSP環境中的數據。
訪問JSP域變量
EL訪問4個JSP域變量(pageContext、request、session和application)對應的EL隱含對象是:pageScope、requestScope、sessionScope和applicationScope。
例如:
<%
session.setAttribute("aa","bb");
application.setAttribute("cc","dd");
%>
${sessionScope.aa}
${applicationScope.cc}
讀取request請求報頭
在EL表達式中讀取request請求報頭信息的隱含對象有header、headerValues
讀取cookie
讀取客戶端cookies對象的EL隱含對象cookie。
讀取客戶端表單或查詢串參數
讀取客戶端表單或查詢串中參數的EL隱含對象爲param或paramValues。
讀取上下文初始化參數
通過EL的initParam隱含對象可讀取上下文初始化參數。
EL運算符
EL表達式中可使用的運算符有:算術算符、關係算符、邏輯算符。
算術算符
主要有+、-、*、/、%、(),含義和用法基本同Java語言。例如:
<body>
${3+(8*4)}
</body>
關係算符
主要有:>(大於)、<(小於)、<=(小於等於)、>=(大於等於)、==(等於)、!=(不等於),含義和用法基本同Java語言,例如:
<body>
${7<5}
</body>
邏輯算符
主要有&&、||、!,算符含義同Java,這三個算符也可用保留字and、or、not表示,例如:
<%
session.setAttribute("a","3");
request.setAttribute("b","5");
%>
${a==3 && a<b}
empty和not empty //(!empty)算符
empty算符的作用是判斷作用範圍變量的取值是否爲空null,爲空則返回true,非空則返回false。
${empty s}//s=null s="" 都爲true
. 與 [] 算符
EL使用“.”或“[]”來讀取變量中的數據,兩個算符的作用相同。
EL的自動數據類型轉換
EL會根據表達式的運算性質,將讀取到的數據自動轉換爲適合的數據類型後再參與表達式的運算。
訪問JSP隱含對象中的getXXX()方法
在EL表達式中訪問JSP隱含對象的getXXX()方法,EL語法如下:
${pageContext.JSP隱含對象名.XXX}
例如,訪問request隱含對象的getRequestURI()方法,EL語法爲:
${pageContext.request.requestURI}
訪問JavaBean中的屬性
EL表達式通過“.”算符訪問JavaBean中的屬性,基本用法爲:
${JavaBean名.屬性名}
“.”算符實際上是調用JavaBean中的getXXX()方法。
JSTL
JSTL,即JSP標準標記庫(JSP Standard Tag Library),它是SUN公司爲簡化JSP頁面設計而提出的一種技術規範。JSTL使用一套新的標準標籤庫取代原來的scriptlet(代碼嵌入<% %>中)進行JSP頁面開發,使頁面代碼的可讀性有了顯著提高。
JSTL標記的結構
一個JSTL標記主要包含三部份:起始標記(可能包含屬性)、標記體、結束標記。如:
<c:if test="${6>5}">
結果:6>5
</c:if>
JSTL標記的使用
要在JSP頁面中使用JSTL標記(有5個標籤庫),首先要使用taglib指令聲明,基本語法爲:
<%@ taglib uri=“標記庫的URI” prefix=“標記前綴” %>
例如:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:out value="JSTL的使用"/>
JSTL核心標記庫
JSTL核心標記庫提供了控制流、循環語句、異常處理、信息輸出、變量定義等動作。
<c:set>標記
用於定義一個JSP作用範圍變量,並對變量進行賦值。主要有以下兩種用法:
用<c:set>定義作用範圍變量,語法如下:
<c:set var=“變量名” [value=“對象”] [scope=“作用範圍”]>
[標記體]
</c:set>
例子:
<c:if test="${empty c}">
<c:set var="c" value="1" scope="session"></c:set>
</c:if>
<c:if test="${not empty c}">
<c:set var="c" value="${c+1}" scope="session"></c:set>
</c:if>
${c}
用<c:set>操作JavaBean對象,基本用法如下:
<c:set target=“Bean對象名” property=“屬性名” [value=“新值”]>
[新值]
</c:set>
<c:remove>標記
<c:remove>用於移除一個作用範圍變量,基本語法如下:
<c:remove var=“對象的變量名” scope=“作用範圍”/>
例子:
<c:set var="c" scope="session"></c:set>
<c:out>標記
用來顯示數據,功能相當於<%=%>。可輸出常量或EL表達式。語法如下:
<c:out value=“待顯示的數據” [default=“變量的默認值”]
[escapeXml=“true|false”]>
[變量的默認值]
</c:out>
例子
<c:out value="<要顯示的數據對象(未使用轉義字符)>" escapeXml="true" default="默認值"></c:out>
<c:catch>標記
用來捕獲異常,基本語法如下:
<c:catch [var=“變量名”]>
… 可能發生異常的代碼段 …
</c:catch>
例子:
<c:catch var ="catchException">
<% int x = 5/0;%>
</c:catch>
<c:if test = "${catchException != null}">
<p>異常爲 : ${catchException} <br />
發生了異常: ${catchException.message}</p>
</c:if>
<c:if>標記
類似於Java語言中的if語句,用於測試判斷。基本語法爲:
<c:if test= “{條件表達式1}”>
<c:if test="${條件表達式2}">
條件都成立時,最後顯示的內容.
</c:if>
</c:if>
例子:
<c:if test="${6>5}">
結果:6>5
</c:if>
<c:choose>標記
實現多分支判斷。它的基本語法爲:
<c:choose>
<c:when test=“${條件表達式1}”>
… 標記體1 …
</c:when>
… 其它的<c:when>標記 …
<c:otherwise>
… 標記體n …
</c:otherwise>
</c:choose>
例子
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>你的工資爲 : <c:out value="${salary}"/></p>
<c:choose>
<c:when test="${salary <= 0}">
太慘了。
</c:when>
<c:when test="${salary > 1000}">
不錯的薪水,還能生活。
</c:when>
<c:otherwise>
什麼都沒有。
</c:otherwise>
</c:choose>
<c:redirect>標記
實現重定向功能,它的基本用法如下:
<c:redirect url="" [context=""]>
…[<c:param>]…
</c:redirect>
例子
<c:redirect url="http://www.runoob.com"/>
<c:forEach>標記
(1) 計數循環
實現類似Java的for計數循環,它的基本用法如下:
<c:forEach begin=“初值”
end=“終值”
[step=“步長”]
[var=“變量”]
[varStatus=“狀態變量”]>
… 標記體(循環體) …
</c:forEach>
例子:
<c:forEach begin="1" end="10" var="i" varStatus="j">
${i}
<br/>
</c:forEach>
(2) 集合或數組的遍歷
使用<c:forEach>來遍歷集合對象或數組的基本用法如下:
<c:forEach items=“對象名” var=“變量” [varStatus=“狀態變量”]>
… 標記體(循環體) …
</c:forEach>
例子:
<c:forEach items="sdgsdhs" var="i" >
${i}
</c:forEach>
<c:forTokens>標記
用來遍歷一個字符串中的單詞,單詞用指定分隔符隔開。基本用法爲:
<c:forTokens items=“字符串” delims=“單詞分隔符”
[varStatus=“狀態變量”] [begin=“起始位置”]
[end=“結束位置”] Step=“步長值” var=“變量”>
…(循環體)…
</c:forTokens>
例子:
<c:forTokens items="google,runoob,taobao,dsge" delims="," begin="0" end="3" step="2" var="name">
<c:out value="${name}"/><p>
</c:forTokens>
<c:import>標記
將其它文本資源包含到當前頁面中。基本用法爲:
<c:import url="" [context=""] [var=""] [scope=""] [charEncoding=""]>
… [<c:param>] …
</c:import>
例子:
<c:import var="data" url="http://www.runoob.com"/>
<c:out value="${data}"/>