一、 EL表達式:java
●須要EL表達式的緣由:正則表達式 ◆在JSP中使用Java腳本的侷限:數據庫 1)、在JSP頁面中嵌入大量的Java代碼;express 2)、訪問結構比較複雜的數據時代碼煩瑣,且常常須要強制類型轉換;數組 eg:<% session Employee employee = (Employee) request.getAttribute("employee");app Computer comp = employee.getComputer();jsp 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; |
二、 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表達式語言把它做爲內置對象的一個主要緣由;
|
三、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" /> ★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 屬性執行主體內容固定的次數; |
四、JSTL遍歷集合:
數組或集合 |
訪問方式 |
int[] ages = { 1, 2, 3, 4, 5 }; // 普通數組,JSTL直接使用JSP賦值表達式來取 |
遍歷數組: <c:forEach var="age" items="<%= ages %>"> <c:out value="${age}" /> </c:forEach> |
List<String> names = new LinkedList<String>(); // List names.add("Biao"); names.add("彪"); names.add("雷"); request.setAttribute("names", names); // 添加到request |
遍歷List: <c:forEach var="name" items="<%= names %>"> <c:out value="${name}" /> </c:forEach>
遍歷List: <c:forEach var="name" items="${names}"> <c:out value="${name}" /> </c:forEach> |
List<User> users = new ArrayList<User>(); // JavaBean的List users.add(new User("黃彪", "xxxxxx")); users.add(new User("昊天", "xxxxxx")); users.add(new User("姐姐", "yyyyyy")); users.add(new User("丫頭", "zzzzzz")); session.setAttribute("users", users); // 添加到session |
遍歷UserBean的List: <c:forEach var="user" items="${users}"> <c:out value="${user.username}"/> <c:out value="${user.password}"/> </c:forEach> |
Set<String> set = new TreeSet<String>(); // Set set.add("One"); set.add("One"); set.add("Two"); set.add("Three"); set.add("Set"); |
遍歷Set: <c:forEach var="entry" items="<%= set %>"> <c:out value="${entry}" /> </c:forEach>
|
Map<String, String> map = new HashMap<String, String>(); // Map map.put("1", "黃彪"); map.put("2", "丫頭"); map.put("3", "哥哥"); map.put("4", "笨蛋"); |
遍歷Map: //注意:遍歷map時候var="entry"只能這麼寫; <c:forEach var="entry" items="<%= map %>"> key:<c:out value="${entry.key}"/> value:<c:out value="${entry.value}"/> </c:forEach> |
五、總結:
|