使用JSP/Servlet技術開發—— 第八章 JSTL和EL
1、 EL 表示式:
●需要EL表示式的原因:◆在JSP中使用Java指令碼的侷限:1 )、在JSP頁面中嵌入大量的Java程式碼; 2 )、訪問結構比較複雜的資料時程式碼煩瑣,且經常需要強制型別轉換; eg :<% Employee employee = (Employee) request.getAttribute("employee");Computer comp = employee.getComputer();String manufacturer = comp.getManufacturer();%>3 )、EL表示式使JSP的開發變得更加簡單; eg :${requestScope.employee.computer.manufacturer} |
||||||||||||||||||||||||||||
● EL 表示式:EL表示式的全稱是 Expression Language , 它是一種借鑑了 JavaScript 和 XPath 的表示式語言,EL表示式定義了一系列的隱含物件和操作符, 使開發人員能夠很方便地訪問頁面的上下文,以及不用域內的物件,而無須在 JSP 頁面嵌入Java 程式碼,從而使開發人員即使不熟悉 Java 也能輕鬆地 編寫JSP程式; |
||||||||||||||||||||||||||||
● EL 表示式 的功能:替代JSP頁面中資料訪問時的複雜編碼; |
||||||||||||||||||||||||||||
● EL 表示式的特點和使用範圍: ◆ EL 表示式提供了在 Java 程式碼之外, 訪問和處理應用程式資料的功能, 通常用於在某個作用域(page、request、session、application 等) 內取得屬性值,或者做簡單的運算和判斷。 ◆ EL 表示式有以下特點: ★ 自動轉換型別轉換,在使用 EL 得到某個資料時可以自動轉換型別,對於型別的限制比較寬鬆; ★ 使用筒單,與 JSP 頁面中嵌入的 Java 程式碼相比,EL表示式使用起來非常簡單; eg :每個僱員都擁有一臺計算機,如果想得到計算機的生產廠商資訊,只需要把該僱員物件放在某個作用域(此處以 request 為例 ) 中, 然後在 JSP 頁面中呼叫 ${requestScope.employee.computer.manufacturer}即可; |
||||||||||||||||||||||||||||
● EL 表示式的語法: ${ EL expression }◆EL 表示式的兩個要素:$和{ },兩者缺一不可; ▲ 通過變數名取值 ▲ 獲取物件的屬性值 ▲ 獲取集合元素 ▲ 執行表示式 ★1 )、 點操作符:EL 表示式通常由兩部分組成:物件和屬性。就像在Java程式碼中一樣,在 EL 表示式中也可以點操作符“.” 來訪問物件的某個屬性。 eg :通過${ employee.computer }可以訪問 employee 物件computer屬性,而通過引${ employee.computer.manufacturer}則可以訪問某個僱 員所使用的計算機的產廠商; ★ 2) 、[ ]操作符:與點操作符類似,“[ ]”操作符也可以訪問物件的某個屬性,${ employee[“computer”] }可以訪問僱員的計算機屬性。但是, 除此之外,“[ ]”操作符還提供了更加強大的功能: ▲ 當屬性名中包含了特殊字元如 “.”或 '一’ 等的情況下,就不能使用點操作符來訪問,這時只能使用 ”[ ]" 操作符; ▲ 訪問陣列,如果有一個物件名為 array 的陣列,那麼可以根據索引值來訪問其中的元素,如:${array[0]}、${array[1]}等; ▲ “[ ]” 操作符中可以使用變數實現動態訪問,如 ${employee[propertyNamel],propertyName是另一個變數,改變其值可以動態訪問employee 的不同屬性; eg1 :<body> <%// 在Servlet或JSP中儲存資料 Map names = new HashMap();names.put("one", "LiYang");names.put("two", "WangHua");request.setAttribute("names", names);%>// 在JSP中訪問資料 姓名:${ names.one }<br/>姓名:${ names["two"] }<br/></body>分析:在eg1的程式碼中,使用了 Map 儲存姓名的集合,在 JSP 頁面中則分別呼叫了 EL 表示式的兩運算子進行姓名的輸出顯示: 輸出結果: eg2 :<body> <%// 在Servlet或JSP中儲存資料 List names = new ArrayList();names.add(0, "LiYang");names.add(1,"WangHua");request.setAttribute("names",names);%>// 在JSP中訪問資料 姓名:${ names[0] }<br/>姓名:${ names[1] }<br/></body>分析:在eg2的程式碼中,使用了List儲存姓名的集合,在 JSP 頁面中則使用[ ]指定元素下標:輸出結果如下: |
||||||||||||||||||||||||||||
●${變數名}eg : // 在Servlet或JSP中儲存資料 request.setAttribute("username", "LiYang");// 在JSP中訪問資料 姓名: ${username} ${requestScope.username}分析:按照page → request → session → application的作用域順序依次查詢,找到即返回,最終找不到返回null;▲指定作用域:
|
||||||||||||||||||||||||||||
●關係操作符:
|
||||||||||||||||||||||||||||
●邏輯操作符:
|
||||||||||||||||||||||||||||
● Empty 操作符: Empty 操作符 是一個字首操作符,用於檢測一個變數值是否為 null或者為empty ( 如長度為 0的字串變數或集合變數)。例如,變數 a 不存在,則${ empty a }返回的結果為true,${ not empty a }或${ ! empty a }返回的結果為false; |
2、 EL 表示式隱式物件:
● JSP 提供了 page、request、session、application. pageContext 等若干隱式物件。這些隱式物件無需宣告,就可以很方便地在 JSP 頁面中使用。相應地,在 EL 表示式語言中也提供了一系列可以直接使用的隱式物件。EL 隱式物件按照使用途徑的不同分為作用域訪問物件、引數訪問物件和JSP隱式物件; ★ 如下圖: |
||||||||||
●作用域訪問物件: 開發 Java Web 應用時,可以把變數存放在不同作用域中以滿足不同範圍的訪問需求,作用域共有四個選項:page、request、session、application。在 EL 表示式中,為了訪問這四個作用域內的變數和屬性;
★ 當使用 EL 表示式訪問某個變數時,應該指定查詢的範圍,如 ${requestScope.employee}即在請求作用域範圍內查詢 employee 變數,如果不指定查詢範圍, 即${ employee},則會按照 page - request- session - application 的順序依次查詢 employee 變數; |
||||||||||
●引數訪問物件: 引數訪問物件是與頁面輸入引數有關的隱式物件,通過它們可以得到使用者的請求引數;
◆ 兩者之間的不同之處在於,param 物件用於得到請求中單一名稱的引數,而paramValues物件用於得到請求中的多個值。 例如:在使用者註冊時 通常只填寫一個名為 userName 的引數,那麼就可以用${param:username}來訪問此引數, 等同於呼叫 request.getParameter (“usernames”);而在使用者註冊時,也可以選擇多個業餘愛好 (habits) , 這樣通過${paramValues:habits}可以得到使用者所有選擇的值等同於呼叫request.getParameterValues ( “habits”); |
||||||||||
● JSP 隱式物件:為了能夠方便地訪問 JSP 隱式物件,EL表示式語言引入了pageContext;它是 JSP和EL的一個公共物件,通過 pageContext 可以訪問其他八個 JSP 內建物件,這也是EL表示式語言把它作為內建物件的一個主要原因;
|
3、 JSTL 標籤:
●EL表示式封裝了資料訪問的功能,而JSTL標籤庫則封裝了邏輯控制、迴圈控制以及資料格式化等功能,二者結合使用才能完整實現動態頁面的開發需求; |
● JSTL 的全稱是 Java Server Page Standard Tag Library , 即 JSP 標準標籤庫。它包含了在開發JSP頁面時經常用到的一組標準標籤,這些標籤提供了一種不用嵌入 Java 程式碼就可以開發複雜的JSP頁面的途徑。JSTL 標籤庫包含了多種標籤,如通用標籤、條件判斷標籤和迭代標籤等。 |
● 優點:提供一組標準標籤、可用於編寫各種動態功能; |
●使用JSTL的步驟: 1) 、 在工程中引用 JSTL 的兩個jar檔案和標籤庫描述符檔案 (副檔名為 .tld)。 ◆ 正如使用JDBC連線資料庫那樣,使用 JSTL定義的標籤庫也必須在工程中匯入兩個jar檔案,jstl.jar和standard.jar,除此以外,標籤庫描述符檔案也是必 需的,這些資源都能在網上下載得到。 ◆ 在 MyEclipse 中已經集成了 JSTL,因此這一過程可以由工具代為實現,方法如下:首先執行 'File' — 'New' — 'Web Project' 命令, 彈出 'New Web Project' 視窗,在該視窗中的’J2EE Specification Level' 選項組中選中 ’J8va EE 5.0" 或 “ Java EE 6.0' 單選按鈕,MyEclipse會自動在專案中新增 JSTL 所需的jar 檔案和標籤庫描述符檔案。而如果選擇更低的版本,則需要勾選“Add JSTL Libraries to WEB-INF/lib folder?“複選框;如圖所示,然後單擊 ’Finish' 按鈕; 2 )、在需要使用 JSTL 的 JSP 頁面中使用 taglib 指令匯入標籤庫描述符檔案,例如,要使用JSTL核心標籤庫,需要在 JSP 頁面的上方增加如下的 taglib 指令: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>◆ taglib 指令通過 uri 屬性引用某個標籤庫的配置檔案, JSP 頁面中通過 prefix 屬性指定的字首即可訪問該標籤庫中的某個標籤功能,語法:<c:標籤名> 3) 、使用JSTL標籤; |
● JSTL 核心標籤庫:顧名思義,核心標籤庫在 JSTL 中佔有十分重要的地位。JSTL 核心標籤庫按照功能的不同又為通用標籤庫、條件標籤庫、迭代標籤庫等; |
◆ 通用標籤庫:通用標籤庫用於在 JSP 頁面內設定、顯示和刪除變數,它包含三個標籤:<c:set>、<c:out>、<c : remove>; ▲ <c:set> 標籤:<c:set>標籤用於設定作用域變數的值或者作用域變數的屬性值,其語法格式分為如下兩種 (1) 將 value 值儲存到範圍為 scope 的變數 variable 中: <c:set var="variable" value="value" scope="scope" />★ var :屬性的值是設定的變數名 ★ value :屬性的值是賦予變數的值 ★ scope 屬性對應的是變數的作用域,可選值有 page、request、 session和application eg :在請求範圍內將變數 currentlndex 的值設定為 8,用<c:set>標籤可以寫為: <c:set va= “currentlndex“value=”8“ scope="request"> (2) 將value值設定到物件的屬性中: <c:set target="target" property="property" value="value" /> ★ target 屬性是操作的 JavaBean 物件 可以使用 EL 表示式來表示;★ property 屬性:對應 JavaBean 物件的屬性名 ★ value 屬性是賦予 Java8ean 物件屬性的值; eg :// 在Servlet或JSP中設定JavaBean User user = new User();request.setAttribute("user", user);// 在JSP中修改JavaBean的屬性值 <c:set target="${user}" property="name" value="defaultName" />▲<c:out> 標籤:<c:out> 標籤用於將計算的表示式結果輸出顯示,類似於 JSP 中的<%=%>,但是功能更加強大,程式碼也更加簡潔,方便頁面維護。 ◆ 其語法格式分為指定預設值和不指定預設值兩種形式: 1) 、不指定預設值: 語法:<c:out value="value" />★ value 屬性指需要輸出的正則表示式的運算結果,可以通過EL表示式來獲; 2) 、指定預設值: 語法:<c:out value="value" default="default" />★ default 屬性是 value屬性的值為空時輸出的預設值。 ★<c:out> 標籤 還有一個escapeXml屬性:表示是否轉換特殊字元,用於指定在使用 <c:out> 標籤 輸出諸如<、>或 ` 或 “ 或 & 之類在HTML和XML 檔案中具有特殊意義的字元時是否應該進行轉義escapeXml屬性設定為 true , 則會自動進行轉義處理,這也是預設值; eg :out:計算表示式並將結果輸出顯示,轉義特殊字元 <p>${ "<a href='http://www.baidu.com'> 百度</a>" }</p> <p><c:out escapeXml="false" value="<a href='http://www.baidu.com'> 百度</a>" /> </p><p><c:out value="<a href='http://www.baidu.com'> 百度</a>" /></p> 執行結果: 分析:從執行效果可以看出,將 <c:out> 標籤 的 escapeXml 屬性設定為 'false“ 與直接使用 EL 表示式效果相同; ▲ <c : remove> 標籤:<c : remove>分用於移除指定作用域內的指定變數; 語法:<c:remove var="variable" scope="scope" /> ★ var 屬性是指待移除的變數的名稱; ★ scope 屬性是指移除的變數所在的範圍,可選項有 page、request、session、application,如果沒有指定,則預設為 page; eg :在下面示例中,首先使用<c:set>標籤在 page 範圍內設定一個變數的值,通過<c:out>標籤把該量顯示在頁面上,然後用<c : remove>標籤在 page 範圍內刪除該變數,並使用<c:out>標籤檢查該量是否已經刪除; 執行結果: |
◆條件標籤庫: JSTL 的條件標籤包括<c : if> 、<c : choose>、<c:when>和<c : otherwise>標籤; ▲<c : if> 標籤: 用於實現 Java 語言中 if 語句的功能; 語法: <c:if test="codition" var="variable" scope="scope" >主體內容 </c:if>★ test 屬性是判斷條件, 當 condition (可以用EL表示式表示) 的結果為 true 時,會執行主內容,如果為 false 則不會執行; ★ var 屬性定義變最,該變數存放判斷的結果,該屬性可以省略 ★ scope 屬性是指 var 定義變數的儲存範圍,可選值有 page、request、session 和application,該屬性可以省略; eg :使用if標籤判斷是否登入: ▲<c : choose> 標籤:<c : choose>、<c:when>和<c : otherwise> 一起實現互斥條件的執行、類似於 Java 語言的if-else if-else語句。 語法: <c:choose var=“vaeName” scope=“scope”> <c:when test="condition1">內容 1 </c:when><c:when test="condition2">內容 2 </c:when>……<c:otherwise>內容 n </c:otherwise></c:choose >★<c : choose> 是作為 <c :when>和<c : otherwise> 的父標籤使用的,除了空白字元外, <c : choose> 的標籤體只能包含這兩個標籤; ★ <c :when> 標籤必須有一個直接的父標籤 <c : choose> , 而且必須在同一個父標籤下 <c : otherwise> 標籤之前出現,在同一個父標籤 <c : choose> 中, 可以有多個 <c :when> 標籤; ★ <c : otherwise> 標籤必須有一個直接的父標籤 <c : choose> , 而且必須是 <c : choose> 標籤最後一個巢狀的標籤; ★ 在執行時,判斷 <c :when> 標籤的測試條件是否為 true , 第一個測試條件為 true 的 <c :when> 標籤體被 JSP 容器執行。如果沒有滿足條件的 <c :when> 標籤 , 那麼 <c : otherwise> 的標體將被執行; |
◆ 迭代標籤庫:<c:forEach>標籤有兩種語法格式:一種用於遍歷集合物件的成員,另一種用於使語句迴圈執行指定的次數; ▲ 遍歷集合物件的成員: 語法: <c:forEach items="collection" var="varName" begin="start" end="end" step="stepSize" varStatus="status" > … 迴圈體程式碼… </c:forEach>★ var 屬性是對當前成員的引用, 即如果當前迴圈到第一個成員,var 就引用第一個成員,如果當前迴圈到第二個成員,它就引用第二個成員. 以此類推; ★ items :指被迭代的集合物件; ★ varStatus 屬性用於存放 var 引用的成員的相關資訊,如索引等; ★ begin 屬性示開始位置, 預設為 0, 該屬性可以省略; ★ end 屬性表示結束位置,該屬性可以省略; ★ step 表示迴圈的步長,預設為 1,該屬性可以省略; ▲指定語句執行次數:語法:<c:forEach var="varName" varStatus=" varStatusName" begin=" beginIndex" end="endIndex" step="step" > … 迴圈體程式碼… </c:forEach>★ var 屬性是對當前成員的引用; ★ varStatus 屬性用於存放 var 引用的成員的相關資訊,如索引等; ★ begin 屬性表示開始位置, 預設為 0, 該屬性可以省略; ★ end 屬性表示結束位置,該屬性可以省略; ★ step 屬性表示迴圈的步長, 預設為 1, 該屬性可以省略格式; ■ 格式2 與格式 1 的區別是:格式 2 不是對一個集合物件遍歷, 而是根據指定的 begin 屬性、 end屬性以及 step 屬性執行主體內容固定的次數; |
4、 總結:
|
![]() |