1、EL表達式簡介 (1)EL 全名為Expression Language。EL主要作用: (2)獲取數據: EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域 中檢索java對象、獲取數據。(某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組) (3)執行運算: 利用EL表達式可以在JSP頁面中執行一些基本的關系運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null} (4)獲取web開發常用對象 EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕松獲得對web常用對象的引用,從而獲得這些對象中的數據。 (5)調用Java方法 EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。 2、EL注意事項 (1)EL表達式是JSP 2.0(JavaEE1.4)規范中的一門技術 。因此,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。 (2)注意:有些Tomcat服務器如不能使用EL表達式 (1)升級成tomcat6 (2)在JSP中加入<%@ page isELIgnored="false" %> 3、EL表達式獲取數據 (1)使用EL表達式獲取數據語法:“${標識符}” (2)EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符為關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。 (3)示例:${user} (4)EL表達式也可以很輕松獲取JavaBean的屬性,或獲取數組、Collection、Map類型集合的數據,例如: ${user.address.city} ${user.list[0]}:訪問有序集合某個位置的元素 ${map.key} : 獲得map集合中指定key的值 (5) 和 [ ] 區別 (6)結合JSTL的foreach標簽,使用EL表達式也可以很輕松迭代各種類型的數組或集合,示例: 迭代數組 迭代collection類型集合 迭代map類型集合 (7)${propName}在四個域中搜尋proName屬性,輸出該值到輸出流中 ${pageScope/requestScope/sessionScope/applicationScope.proName}獲取指定域中的屬性 ${attr[0]}獲取域中的集合的指定元素 ${list[0]}獲取list中的指定位置元素 ${map.keyName}獲取map中指定鍵的值 ${bean.propName}獲取javaBean的屬性,可以認為是調用了javaBean的getXXX方法, ~最重要的一個應用場景:在寫路徑的時候最好不要把web應用名稱寫死,java中應該用request.getContextPath去獲取。jsp中就用el獲取:${pageContext.request.contextPth} ~.和[]區別使用點的地方都可以用中括號,如果屬性名是數字或包含特殊符號(.-)就必須使用中括號。例子:${map["first.name"]} <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="com.itheima.Person"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <hr><h1>獲取常量值進行輸出</h1> ${123.123 } ${'xxxx' } ${false } <hr><h1>獲取變量值進行輸出,注意只能獲取域中的值</h1> <% pageContext.setAttribute("name","小昭"); int age = 16; pageContext.setAttribute("age",age); %> ${name } ${age} <hr><h1>獲取數組中的數據</h1> <% int [] nums = {111,222,333}; pageContext.setAttribute("nums",nums); %> ${nums[1] } <hr><h1>獲取集合中的數據</h1> <% List list = new ArrayList(); list.add("芷若妹子"); list.add("金毛獅王謝遜"); list.add("韋一笑"); pageContext.setAttribute("list",list); %> ${list[0] } <hr><h1>獲取Map中的數據</h1> 在el表達式中使用點號和中括號不一樣的地方: 在el中使用中括號的地方都可以使用點號去替代,但是如果中括號中的內容為數字或包含了特殊字符(.-)就必須用中括號不能用點號。 <% Map map = new HashMap(); map.put("name","奧巴馬"); map.put("nick.name","aobama"); map.put("age",55); map.put("sex","女"); pageContext.setAttribute("map",map); pageContext.setAttribute("age","name"); %> ${map[age] } ${map["age"] } ${map.age } ${map["nick.name"] } <hr><h1>獲取JavaBean的屬性</h1> <% Person p = new Person(); p.setName("克林頓"); p.setAge(66); pageContext.setAttribute("p",p); %> ${p.name } ${p.age } ${pageContext.request.contextPath } <a href=" ${pageContext.request.contextPath }/index.jsp">xxx</a> </body> </html> 4、EL表達式執行運算 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="com.itheima.Person"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <hr><h1>el進行算數運算,會試圖將參與運算的非數字轉換為數字進行運算,如果不能轉為一個數字則直接拋出異常</h1> ${1+1 } ${1+"1" } <%-- ${1+"a" }--%> <hr><h1>el進行比較運算</h1> > gt >= ge <= le < lt == eq != ne ${2>1 } ${2 gt 1 } ${1 == 1 } ${1 != 1 } <hr><h1>el進行邏輯運算</h1> && and || or ! not ${1==1 && 2>1 } ${1 eq 1 and 2 gt 1 } <hr><h1>empty運算符: 檢查對象是否為null或“空”</h1> 判斷對象是否為null 判斷字符串是否為空字符串 判斷數組、集合是否為空的 <% Person p = null; pageContext.setAttribute("p",p); String str = ""; pageContext.setAttribute("str",str); List list = new ArrayList(); pageContext.setAttribute("list",list); %> ${empty list } <hr><h1>三元表達式</h1> <% int num = 100; pageContext.setAttribute("num",num); %> ${num>100 ? "num確實大於100" :"num沒有大於100"} </body> </html> 5、EL表達式保留關鍵字 6、獲得web開發常用對象 (1)EL表達式語言中定義了11個隱含對象,使用這些隱含對象可以很方便地獲取web開發中的一些常見對象,並讀取這些對象的數據。 (2)語法:${隱式對象名稱} :獲得對象的引用 測試各個隱式對象 注意事項 測試headerValues時,如果頭裡面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”] 測試cookie時,例${cookie.key}取的是cookie對象,如訪問cookie的名稱和值,須${cookie.key.name}或${cookie.key.value} pageContext:代表pageContext對象,注意和pageScope進行區分 pageScope:代表page域,可以用來獲取page域中的屬性 reqeustScope:代表reqeust域,可以用來獲取reqeust域中的屬性 sessionScope:代表session域,可以用來獲取session域中的屬性 applicationScope:代表application域,可以用來獲取application域中的屬性 param 代表請求參數組成的map集合${param.userName} paramValues 代表請求參宿組成的map集合,但是此集合的value是String[],用來獲取一名多值的param header 獲取請求頭組成的map headerValues 獲取請求頭組成的map但是value是一個String[],用來獲取一名多值的head cookie 獲取cookie組成的map對象,此map的值是一個cookie對象${cookie.cookieName.cookieValue} initParam 以map封裝的web.xml中配置的整個web應用的初始化參數 7、使用EL調用Java方法 EL表達式語法允許開發人員開發自定義函數,以調用Java類的方法。 示例:${prefix:method(params)} 在EL表達式中調用的只能是Java類的靜態方法。 這個Java類的靜態方法需要在TLD文件中描述,才可以被EL表達式調用。 EL自定義函數用於擴展EL表達式的功能,可以讓EL表達式完成普通Java程序代碼所能完成的功能 8、EL Function開發步驟 el表達式可以調用java中的靜態方法,分如下步驟完成: (1)編寫一個類,其中應該包含要使用el調用的靜態方法 (2)編寫一個tld文件,描述該方法的調用,在創建tld文件時應選用2.0版本的jsp配置,指定名稱空間uri和縮寫prefix (3)在tld文件中配置方法信息 <function> <name>encodeURL</name>el在調用時所使用的方法名 <function-class>cn.itheima.util.EncodeURL</function-class>靜態方法所在的類全路徑名 <function-signature> java.lang.String EncodURL( java.lang.String )//對該方法的描述:返回值類型 方法名(參數類型) </function-signature> </function> (4)在jsp中使用<%@ taglib uri="" prefix="ppp"%>引入tld文件 (5)在jsp中使用${ppp:encodeURL("xxxx")}調用 2.5SUN提供的EL函數庫,基本上都是對字符串進行操作的函數,請參考張老師寫的《第8章 標准標簽庫_0519.doc》 9、開發EL Function注意事項 (1)編寫完標簽庫描述文件後,需要將它放置到<web應用>\WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的任意子目錄中。 (2)TLD文件中的<uri> 元素用指定該TLD文件的URI,在JSP文件中需要通過這個URI來引入該標簽庫描述文件。 (3)<function>元素用於描述一個EL自定義函數,其中: <name>子元素用於指定EL自定義函數的名稱。 <function-class>子元素用於指定完整的Java類名, <function-signature>子元素用於指定Java類中的靜態方法的簽名,方法簽名必須指明方法的返回值類型及各個參數的類型,各個參數之間用逗號分隔。 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib uri="http://www.itheima.com/MyFunc" prefix="myFunc" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> ${fn:toLowerCase("sadfasdfSADFsdfsSDfsdf") } ${fn:toUpperCase("sadfasdfSADFsdfsSDfsdf") } <a href='#'>xxx</a> ${fn:escapeXml("<a href='#'>xxx</a>") } ${myFunc:encode("中國","utf-8") } </body> </html> package com.itheima; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class MyURLEncoder { public static String encode(String str,String charSet){ try { return URLEncoder.encode(str, charSet); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(); } } } <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>myFunc</short-name> <uri>http://www.itheima.com/MyFunc</uri> <function> <name>encode</name> <function-class>com.itheima.MyURLEncoder</function-class> <function-signature>java.lang.String encode(java.lang.String,java.lang.String)</function-signature> </function> </taglib> 10、JSTL中的常用EL函數 (1)由於在JSP頁面中顯示數據時,經常需要對顯示的字符串進行處理,SUN公司針對於一些常見處理定義了一套EL函數庫供開發者使用。 (2)這些EL函數在JSTL開發包中進行描述,因此在JSP頁面中使用SUN公司的EL函數庫,需要導入JSTL開發包,並在頁面中導入EL函數庫,如下所示: 在頁面中使用JSTL定義的EL函數: <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> (3) JavaServer Pages Standard Tag Library 由JCP(Java Community Process)指定標准 提供給 Java Web 開發人員一個標准通用的標簽函數庫 和 EL 配合來取代傳統直接在頁面上嵌入 Java 程序(Scripting)的做法,以提高程序可讀性、維護性和方便性 一般我們使用JSTL1.1以上的版本,應為從這個版本開始支持EL表達式 JSTL1.0默認不支持el表達式,不建議使用 3.2JSTL標簽庫 ****核心標簽庫 (core) --- c 國際化標簽 fmt 數據庫標簽 sql --Servlet XML標簽 xml JSTL函數(EL函數) el 3.3JSTL核心標簽庫 <c:out> 標簽用於輸出一段文本內容到pageContext對象當前保存的“out”對象中。 <c:set>標簽用於把某一個對象存在指定的域范圍內,或者設置Web域中的java.util.Map類型的屬性對象或JavaBean類型的屬性對象的屬性。 <c:remove>標簽用於刪除各種Web域中的屬性 <c:catch>標簽用於捕獲嵌套在標簽體中的內容拋出的異常,其語法格式如下:<c:catch [var="varName"]>nested actions</c:catch> <c:if test=“”>標簽可以構造簡單的“if-then”結構的條件表達式 <c:choose>標簽用於指定多個條件選擇的組合邊界,它必須與<c:when>和<c:otherwise>標簽一起使用。使用<c:choose>,<c:when>和<c:otherwise>三個標簽,可以構造類似 “if-else if-else” 的復雜條件判斷結構。 <c:forEach>標簽用於對一個集合對象中的元素進行循環迭代操作,或者按指定的次數重復迭代執行標簽體中的內容。 <c:forTokens>用來浏覽一字符串中所有的成員,其成員是由定義符號所分隔的 <c:param>標簽 在JSP頁面進行URL的相關操作時,經常要在URL地址後面附加一些參數。<c:param>標簽可以嵌套在<c:import>、<c:url>或<c:redirect>標簽內,為這些標簽所使用的URL地址附加參數。 <c:import> 標簽,實現include操作 <c:url>標簽用於在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識號以參數形式附加在URL地址後面 <c:redirect>標簽用於實現請求重定向 11、fn:toLowerCase fn:toLowerCase函數將一個字符串中包含的所有字符轉換為小寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數,例如 fn:toLowerCase("Www.IT315.org") 的返回值為字符串“www.it315.org” fn:toLowerCase("")的返回值為空字符串 12、fn:toUpperCase fn:toUpperCase函數將一個字符串中包含的所有字符轉換為大寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數。例如: fn:toUpperCase("Www.IT315.org") 的返回值為字符串“WWW.IT315.ORG” fn:toUpperCase("")的返回值為空字符串 13、fn:trim fn:trim函數刪除一個字符串的首尾的空格,並返回刪除空格後的結果字符串,它接收一個字符串類型的參數。需要注意的是,fn:trim函數不能刪除字符串中間位置的空格。 例如,fn:trim(" www.it315.org ") 的返回值為字符串“www.it 315.org”。 14、fn:split (1)fn:split函數以指定字符串作為分隔符,將一個字符串分割成字符串數組並返回這個字符串數組。 (2)fn:split函數接收兩個字符串類型的參數,第一個參數表示要分割的字符串,第二個參數表示作為分隔符的字符串。 (3)例如,fn:split("www.it315.org", ".")[1]的返回值為字符串“it315”。 15、fn:length (1)fn:length函數返回一個集合或數組大小,或返回一個字符串中包含的字符的個數,返回值為int類型。fn:length函數接收一個參數,這個參數可以是<c:forEach>標簽的items屬性支持的任何類型,包括任意類型的數組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。 (2)如果fn:length函數的參數為null或者是元素個數為0的集合或數組對象,則函數返回0;如果參數是空字符串,則函數返回0。 16、fn:join (1)fn:join函數以一個字符串作為分隔符,將一個字符串數組中的所有元素合並為一個字符串並返回合並後的結果字符串。fn:join函數接收兩個參數,第一個參數是要操作的字符串數組,第二個參數是作為分隔符的字符串。 (2)如果fn:join函數的第二個參數是空字符串,則fn:join函數的返回值直接將元素連接起來。例如: 假設stringArray是保存在Web域中的一個屬性,它表示一個值為{"www","it315","org"}的字符串數組,則fn:join(stringArray, “.")返回字符串“www.it315.org” fn:join(fn:split("www,it315,org", ","), ".") 的返回值為字符串“www.it315.org” 17、fn:indexOf (1)fn:indexOf函數返回指定字符串在一個字符串中第一次出現的索引值,返回值為int類型。fn:indexOf函數接收兩個字符串類型的參數,如果第一個參數字符串中包含第二個參數字符串,那麼,不管第二個參數字符串在第一個參數字符串中出現幾次,fn:indexOf函數總是返回第一次出現的索引值;如果第一個參數中不包含第二個參數,則fn:indexOf函數返回-1。如果第二個參數為空字符串,則fn:indexOf函數總是返回0。例如: (2)fn:indexOf("www.it315.org","t3") 的返回值為5 18、fn:contains (1)fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值為布爾類型。fn:contains函數在比較兩個字符串是否相等時是大小寫敏感的。 (2)fn:contains函數接收兩個字符串類型的參數,如果第一個參數字符串中包含第二個參數字符串,則fn:contains函數返回true,否則返回false。如果第二個參數的值為空字符串,則fn:contains函數總是返回true。實際上,fn:contains(string, substring)等價於fn:indexOf(string, substring) != -1。 (3)忽略大小的EL函數:fn:containsIgnoreCase 19、fn:startsWith (1)fn:startsWith函數用於檢測一個字符串是否是以指定字符串開始的,返回值為布爾類型。 (2)fn:startsWith函數接收兩個字符串類型的參數,如果第一個參數字符串以第二個參數字符串開始,則函數返回true,否則函數返回false。如果第二個參數為空字符串,則fn:startsWith函數總是返回true。例如: (3)fn:startsWith("www.it315.org","it315")的返回值為false (4)與之對應的EL函數:fn:endsWith 20、fn:replace (1)fn:replace函數將一個字符串中包含的指定子字符串替換為其它的指定字符串,並返回替換後的結果字符串。fn:replace方法接收三個字符串類型的參數,第一個參數表示要操作的源字符串,第二個參數表示源字符串中要被替換的子字符串,第三個參數表示要被替換成的字符串。例如: (2)fn:replace("www it315 org", " ", ".")的返回值為字符串“www.it315.org” 21、fn:substring (1)fn:substring函數用於截取一個字符串的子字符串並返回截取到的子字符串。fn:substring函數接收三個參數,第一個參數是用於指定要操作的源字符串,第二個參數是用於指定截取子字符串開始的索引值,第三個參數是用於指定截取子字符串結束的索引值,第二個參數和第三個參數都是int類型,其值都從0開始。例如: (2)fn:substring("www.it315.org", 4, 9) 的返回值為字符串“it315” 22、fn:substringAfter (1)fn:substringAfter函數用於截取並返回一個字符串中的指定子字符串第一次出現之後的子字符串。fn:substringAfter函數接收兩個字符串類型的參數,第一個參數表示要操作的源字符串,第二個參數表示指定的子字符串,例如: (2)fn:substringAfter(“www.it315.org”, “.”)的返回值為字符串“it315.org”。 (3)與之對應的EL函數為:fn:substringBefore ==================================================== 內容小結: 1.請你總結JSP的組成部分,以及各個部分翻譯成servlet過程的翻譯規則 2.請你總結JSP中的PAGE指令(session errorpage iserrorpage pageEncoding import isELIgnored(EL表達式是從javaee4開始支持 ,javaee4以前的版本中,如果像在jsp頁面使用el,請設isELIgnored為false)) 3.總結四大作用域的生命周期、作用范圍、作用 4.總結9大隱式對象(out、pageContext) 5.el獲取數據(域、數組、集合、Map、javaBean) el進行簡單運算 el11個內置對象實驗一下(請你千萬做一遍,做一遍你就記住了,記住了以後就不愁了) ~el調用java方法。 將sun提供的el函數庫中的主要的方法試用一下。