




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章EL和JSTL《Java
Web程序設(shè)計(jì)任務(wù)教程(第2版)》學(xué)習(xí)目標(biāo)/Target
掌握EL的基本語法熟悉EL中常見的隱式對象
了解JSTL標(biāo)簽庫熟悉JSTL的下載與使用
掌握Core標(biāo)簽庫中的常用標(biāo)簽章節(jié)概述/
Summary
前面我們學(xué)習(xí)了JSP頁面,在JSP開發(fā)中,為了獲取Servlet域?qū)ο笾写鎯Φ臄?shù)據(jù),經(jīng)常需要書寫很多Java代碼,這樣的話會使JSP頁面混亂。為了降低JSP頁面的復(fù)雜度,增強(qiáng)代碼的重用性,Sun公司制定了一套標(biāo)準(zhǔn)標(biāo)簽庫JSTL,同時為了獲取Servlet域?qū)ο笾写鎯Φ臄?shù)據(jù),JSP2.0規(guī)范還提供了EL(表達(dá)式語言),大大降低了開發(fā)的難度。本章將針對EL以及JSTL標(biāo)簽庫進(jìn)行詳細(xì)講解。目錄/Contents010203ELEL隱式對象JSTL04JSTL中的Core標(biāo)簽庫EL7.17.1.1EL基本語法先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握EL的基本語法EL全稱為ExpressionLanguage,即表達(dá)式語言。它是JSP2.0引入的一個新內(nèi)容。EL可以簡化JSP開發(fā)中的對象引用,從而規(guī)范頁面代碼,增加程序的可讀性及可維護(hù)性。EL為不熟悉Java語言頁面開發(fā)的人員提供了一個開發(fā)JavaWeb應(yīng)用的新途徑。EL的概念7.1.1EL基本語法EL的語法非常簡單,都是以“${”符號開始,以“}”符號結(jié)束的,具體格式如下:EL的語法7.1.1EL基本語法${表達(dá)式}“${表達(dá)式}”中的表達(dá)式必須符合EL語法要求。小提示:由于EL的語法以“${"開頭,如果在JSP網(wǎng)頁中要顯示“${"字符串,必須在前面加上“\”符號,即“\${",或者寫成“${${}",也就是用表達(dá)式輸出“${"符號。STEP01為了證明EL可以簡化JSP頁面,接下來通過一個案例對比使用Java代碼與EL獲取信息。在IDEA中創(chuàng)建chapter07的Web項(xiàng)目,并配置Tomcat、加載Servlet-aip.jar包,然后在項(xiàng)目的src目錄下創(chuàng)建包c(diǎn)n.itcast.servlet,在包中創(chuàng)建一個用于存儲用戶名和密碼的類MyServlet,具體代碼如下所示。@WebServlet(name="MyServlet",urlPatterns=
"/MyServlet")publicclassMyServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ request.setAttribute("username","itcast"); request.setAttribute("password","123");RequestDispatcherdispatcher=request .getRequestDispatcher("/myjsp.jsp"); dispatcher.forward(request,response); }7.1.1EL基本語法STEP02在web目錄下編寫一個名稱為myjsp的JSP文件,使用該頁面輸出MyServlet所存儲的信息,myjsp代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"><html><head></head><body> 用戶名:
<%=request.getAttribute("username")%>
<br/> 密碼:
<%=request.getAttribute("password")%>
<br/></body></html>7.1.1EL基本語法STEP03在文件myjsp.jsp中,使用Java代碼獲取Servlet中存儲的數(shù)據(jù)。下面修改文件myjsp.jsp,在myjsp.jsp文件中,通過EL獲取MyServlet中存儲的信息,修改后的頁面代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><html><head></head><body> 用戶名:
<%=request.getAttribute("username")%>
<br/> 密碼:<%=request.getAttribute("password")%>
<br/> <hr/> 使用EL:<br/> 用戶名:
${username}
<br/> 密碼:
${password}
<br/></body></html>7.1.1EL基本語法STEP04修改完成之后,在IDEA中啟動Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter07/MyServlet”訪問MyServlet頁面,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.1.1EL基本語法由上圖中可知,使用EL同樣可以成功獲取Servlet中存儲的數(shù)據(jù),但EL明顯簡化了JSP頁面的書寫,使程序簡潔易維護(hù)。另外,當(dāng)域?qū)ο罄锩娴闹挡淮嬖跁r,使用EL獲取域?qū)ο罄锩娴闹禃r返回空字符串;而使用Java方式獲取時,如果返回值是null,會報(bào)空指針異常,所以在實(shí)際開發(fā)中推薦使用EL的方式獲取域?qū)ο笾写鎯Φ臄?shù)據(jù)。使用Java代碼與EL獲取信息的對比7.1.1EL基本語法(1)EL可以與JavaScript語句結(jié)合使用。(2)EL可以自動進(jìn)行類型轉(zhuǎn)換。如果想通過EL獲取兩個字符串?dāng)?shù)值(如number1和number2)的和,可以直接通過“+”符號進(jìn)行連接(如${number1+number2})。(3)EL不僅可以訪問一般變量,還可以訪問JavaBean中的屬性、嵌套屬性和集合對象。(4)在EL中,可以執(zhí)行算術(shù)運(yùn)算、邏輯運(yùn)算、關(guān)系運(yùn)算和條件運(yùn)算等。(5)在EL中,可以獲取pageContext對象,進(jìn)而獲取其他內(nèi)置對象。(6)在使用EL進(jìn)行除法運(yùn)算時,如果除數(shù)為0,則返回表示無窮大的Infinity,而不返回錯誤。(7)在EL中,可以訪問JSP的作用域(request、session、application以及page)。EL基本語法的特點(diǎn)7.1.1EL基本語法7.1.2EL中的標(biāo)識符先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉EL中的標(biāo)識符在EL中,經(jīng)常需要使用一些符號標(biāo)記一些名稱,如變量名、自定義函數(shù)名等,這些符號被稱為標(biāo)識符。EL中的標(biāo)識符可以由任意的大小寫字母、數(shù)字和下劃線組成,為了避免出現(xiàn)非法的標(biāo)識符,在定義標(biāo)識符時還需要遵循以下規(guī)范:(1)不能以數(shù)字開頭。(2)不能是EL中的關(guān)鍵字,如and、or、gt等。(3)不能是EL隱式對象,如pageContext。(4)不能包含單引號(')、雙引號(")、減號(-)和正斜線(/)等特殊字符。EL中標(biāo)識符的規(guī)范7.1.2EL中的標(biāo)識符合法的標(biāo)識符:EL中標(biāo)識符的列舉7.1.2EL中的標(biāo)識符usernameusername123user_name_userName不合法的標(biāo)識符:123usernameoruser"namepageContext7.1.3EL中的關(guān)鍵字先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉EL中的關(guān)鍵字關(guān)鍵字就是編程語言里事先定義好并賦予了特殊含義的單詞,和其他語言一樣,EL中也定義了許多關(guān)鍵字,如false、not等。EL中所有的關(guān)鍵字如下所示:EL中的關(guān)鍵字and eq gt true instanceof or ne le false empty not lt ge null div mod7.1.3EL中的關(guān)鍵字7.1.4EL中的變量先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉EL中的變量EL中的變量就是一個基本的存儲單元,EL中的變量不用事先定義就可以直接使用。EL可以將變量映射到一個對象上,具體示例如下所示:EL中的變量${product}7.1.4EL中的變量在上述示例中,product就是一個變量,通過表達(dá)式${product}就可以訪問變量product的值。7.1.5EL中的常量先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉EL中的常量布爾常量用于區(qū)分一個事物的正反兩面,它的值只有兩個,分別是true和false。EL中的常量—布爾常量7.1.5EL中的常量整型常量與Java中的十進(jìn)制的整型常量相同,它的取值范圍是Java語言中定義的常量Long.MIN_VALUE到Long.MAX_VALUE之間,即(-2)∧63~2∧63-1之間的整數(shù)。EL中的常量—整型常量7.1.5EL中的常量浮點(diǎn)數(shù)常量用整數(shù)部分加小數(shù)部分表示,也可以用指數(shù)形式表示,例如,1.2E4和1.2都是合法的浮點(diǎn)數(shù)常量。浮點(diǎn)數(shù)常量的取值范圍是Java語言中定義的常量Double.MIN_VALUE到Double.MAX_VALUE之間,即4.9E-324~1.8E308之間的浮點(diǎn)數(shù)。EL中的常量—浮點(diǎn)數(shù)常量7.1.5EL中的常量字符串常量是用單引號或雙引號引起來的一連串字符。由于字符串常量需要用單引號或雙引號引起來,所以字符串本身包含的單引號或雙引號需要用反斜杠(\)進(jìn)行轉(zhuǎn)義,即用“\'”表示字面意義上的單引號,用“\"”表示字面意義上的雙引號。如果字符串本身包含反斜杠(\),也要進(jìn)行轉(zhuǎn)義,即用“\\”表示字面意義上的一個反斜杠。需要注意的是,只有字符串常量用單引號引起來時,字符串本身包含的單引號才需要進(jìn)行轉(zhuǎn)義,而雙引號不必進(jìn)行轉(zhuǎn)義,例如,'ab\'4c"d5\\e'表示的字符串是ab'4c"d5\e;只有字符串常量用雙引號引起來時,字符串本身包含的雙引號才需要進(jìn)行轉(zhuǎn)義,而單引號不必轉(zhuǎn)義,例如"ab'4c\"d5\\e"表示的字符串是ab'4c"d5\e。EL中的常量—字符串常量7.1.5EL中的常量Null常量用于表示變量引用的對象為空,它只有一個值,用null表示。EL中的常量—Null常量7.1.5EL中的常量7.1.6EL訪問數(shù)據(jù)先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握EL中的點(diǎn)運(yùn)算符(.)和方括號運(yùn)算符([])的使用EL中的點(diǎn)運(yùn)算符,用于訪問JSP頁面中某些對象的屬性,如JavaBean對象中的屬性、List集合中的屬性、Array數(shù)組中的屬性等,其用法示例如下:EL中的運(yùn)算符—點(diǎn)運(yùn)算符(.)7.1.6EL訪問數(shù)據(jù)${}在上述語法格式中,表達(dá)式${}中點(diǎn)運(yùn)算符的作用就是訪問customer對象中的name屬性。EL中的中括號運(yùn)算符與點(diǎn)運(yùn)算符的功能相同,都用于訪問JSP頁面中某些對象的屬性,當(dāng)獲取的屬性名中包含一些特殊符號,如“-”或“?”等非字母或數(shù)字的符號,就只能使用中括號運(yùn)算符訪問該屬性。中括號運(yùn)算符的用法示例如下:EL中的運(yùn)算符—方括號運(yùn)算符([])7.1.6EL訪問數(shù)據(jù)${user["My-Name"]}(1)點(diǎn)運(yùn)算符和方括號運(yùn)算符在某種情況下可以互換,如${}等價于
${student["name"]}。(2)中括號運(yùn)算符還可以訪問List集合或數(shù)組中指定索引的某個元素,如表達(dá)式
${users[0]}用于訪問集合或數(shù)組中第一個元素。(3)中括號運(yùn)算符和點(diǎn)運(yùn)算符可以相互結(jié)合使用,例如,表達(dá)式${users[0].userName}
可以訪問集合或數(shù)組中的第一個元素的userName屬性。
EL中的運(yùn)算符在實(shí)際中的應(yīng)用7.1.6EL訪問數(shù)據(jù)7.1.7EL中的運(yùn)算符先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握EL中的運(yùn)算符的使用算術(shù)運(yùn)算符7.1.7EL中的運(yùn)算符算術(shù)運(yùn)算符說明算術(shù)表達(dá)式結(jié)果+加${10+2}12-減${10-2}8*乘${10*2}20/(或div)除${10/4}或${10div2}2.5%(或mod)取模(取余)${10%4}或${10mod2}2EL中的算術(shù)運(yùn)算符用于對整數(shù)和浮點(diǎn)數(shù)的值進(jìn)行算術(shù)運(yùn)算。這些運(yùn)算符相對來說比較簡單。在使用這些運(yùn)算符時需要注意兩個問題。(1)“-”運(yùn)算符即可以作為減號,也可以作為負(fù)號。(2)“/”或“div”運(yùn)算符在進(jìn)行除法運(yùn)算時,商為小數(shù)。EL的“+”運(yùn)算符與Java的“+”運(yùn)算符不同,它不能實(shí)現(xiàn)兩個字符串之間的連接,如果使用該運(yùn)算符連接兩個不可以轉(zhuǎn)換為數(shù)值型的字符串,將拋出異常;如果使用該運(yùn)算符連接兩個可以轉(zhuǎn)換為數(shù)值型的字符串,EL會自動將這兩個字符串轉(zhuǎn)換為數(shù)值型,再進(jìn)行加法運(yùn)算。算術(shù)運(yùn)算符的小提示7.1.7EL中的運(yùn)算符比較運(yùn)算符7.1.7EL中的運(yùn)算符比較運(yùn)算符說明算術(shù)表達(dá)式結(jié)果==(或eq)等于${10==2}或${10eq2}false!=(或ne)不等于${10!=2}或${10ne2}true<(或lt)小于${10<2}或${10lt2}false>(或gt)大于${10>2}或${10gt2}true<=(或le)小于等于${10<=2}或${10le2}false>=(或ge)大于等于${10>=2}或${10ge2}trueEL中的比較運(yùn)算符用于比較兩個操作數(shù)的大小,操作數(shù)可以是各種常量、EL變量或EL表達(dá)式,所有的比較運(yùn)算符執(zhí)行的結(jié)果都是布爾類型。(1)比較運(yùn)算符中的“==”是兩個等號,千萬不可只寫一個等號。(2)為了避免與JSP頁面的標(biāo)簽產(chǎn)生沖突,對于后4種比較運(yùn)算符,EL中通常使用上表中括號內(nèi)的表示方式,例如,使用“l(fā)t”代替“<”運(yùn)算符,如果運(yùn)算符后面是數(shù)字,在運(yùn)算符和數(shù)字之間至少要有一個空格,例如${1lt2},但后面如果有其他符號時則可以不加空格,例如${1lt(1+1)}。比較運(yùn)算符的注意點(diǎn)7.1.7EL中的運(yùn)算符邏輯運(yùn)算符7.1.7EL中的運(yùn)算符比較運(yùn)算符說明算術(shù)表達(dá)式結(jié)果邏輯運(yùn)算符說明算術(shù)表達(dá)式結(jié)果&&(and)邏輯與${true&&false}或${trueandfalse}false||(or)邏輯或${false||true}或${falseortrue}trueEL中的邏輯運(yùn)算符用于對結(jié)果為布爾類型的表達(dá)式進(jìn)行運(yùn)算,運(yùn)算的結(jié)果仍為布爾類型。需要注意的是,在使用&&運(yùn)算符時,如果有一個表達(dá)式結(jié)果為false,則整個表達(dá)式結(jié)果必為false;在使用||運(yùn)算符時,如果有一個表達(dá)式的結(jié)果為true,則整個表達(dá)式結(jié)果必為true。邏輯運(yùn)算符的注意點(diǎn)7.1.7EL中的運(yùn)算符empty運(yùn)算符7.1.7EL中的運(yùn)算符在EL中,判斷對象是否為空,可以通過empty運(yùn)算符實(shí)現(xiàn),該運(yùn)算符是一個前綴(prefix)運(yùn)算符,即empty運(yùn)算符位于操作數(shù)前方,用來確定一個對象或變量是否為null或空。empty運(yùn)算符的語法格式如下:${emptyexpression}在上述語法格式中,expression用于指定要判斷的變量或?qū)ο?。empty運(yùn)算符7.1.7EL中的運(yùn)算符定義兩個request范圍內(nèi)的變量user和userl,分別設(shè)置它們的值為null和"",示例代碼如下:<%request.setAttribute("user”,"");%><%request.setAttribute("user1",null);%>通過empty運(yùn)算符判斷user和userl是否為空,代碼如下:${emptyuser} //返回值為true${emptyuser1} //返回值為true由上述代碼可知一個變量或?qū)ο鬄閚ull或空,代表的意義是不同的。null
表示這個變量沒有指明任何對象,而空表示這個變量所屬的對象內(nèi)容為空,例如,空字符串、空的數(shù)組或者空的List容器。條件運(yùn)算符7.1.7EL中的運(yùn)算符EL中條件運(yùn)算符(?:)用于執(zhí)行某種條件判斷,它類似于Java語言中的if-else語句,其語法格式如下:${A?B:C}在上述語法格式中,表達(dá)式A的計(jì)算結(jié)果為布爾類型,如果表達(dá)式A的計(jì)算結(jié)果為true,就執(zhí)行表達(dá)式B,并返回B的值作為整個表達(dá)式的結(jié)果;如果表達(dá)式A的計(jì)算結(jié)果為false,就執(zhí)行表達(dá)式C,并返回C的值作為整個表達(dá)式的結(jié)果。例如,表達(dá)式${(1==2)?3:4}的結(jié)果就是4。“()”運(yùn)算符7.1.7EL中的運(yùn)算符EL中的小括號用于改變其他運(yùn)算符的優(yōu)先級,例如,表達(dá)式${a*b+c},正常情況下會先計(jì)算a*b的積,然后再將計(jì)算的結(jié)果與c相加,如果在這個表達(dá)式中加一個小括號運(yùn)算符,將表達(dá)式修改為${a*(b+c)},則會先計(jì)算b與c的和,再將計(jì)算的結(jié)果與a相乘。“()”運(yùn)算符的優(yōu)先級7.1.7EL中的運(yùn)算符EL中的運(yùn)算符都有不同的運(yùn)算優(yōu)先級,當(dāng)EL中包含多種運(yùn)算符時,它們必須按照各自優(yōu)先級的大小進(jìn)行運(yùn)算。EL中運(yùn)算符的優(yōu)先級如下表所示。優(yōu)先級運(yùn)算符1[].2()3-(unary)not!empty4*/div%mod5+-(binary)6<><=>=ltgtlege7==!=eqne8&&and9||or10?:注意:在應(yīng)用EL取值時,沒有數(shù)組的下標(biāo)越界,沒有空指針異常,沒有字符串的拼接。EL隱式對象7.2EL隱式對象7.2EL隱式對象為了能夠獲得Web應(yīng)用程序中的相關(guān)數(shù)據(jù),EL提供了11個隱式對象,這些對象類似于JSP的內(nèi)置對象,可以直接通過對象名進(jìn)行各種操作。在EL的隱式對象中,除PageContext是JavaBean對象,對應(yīng)于javax.servlet.jsp.PageContext類型外,其他的隱式對象都對應(yīng)于java.util.Map類型。這些隱式對象可以分為頁面上下文對象、訪問作用域范圍的隱式對象和訪問環(huán)境信息的隱式對象3種。EL中的隱式對象7.2EL隱式對象隱式對象名稱描
述pageContext對應(yīng)于JSP頁面中的pageContext對象pageScope代表page域中用于保存屬性的Map對象requestScope代表request域中用于保存屬性的Map對象sessionScope代表session域中用于保存屬性的Map對象applicationScope代表application域中用于保存屬性的Map對象param表示一個保存了所有請求參數(shù)的Map對象paramValues表示一個保存了所有請求參數(shù)的Map對象,它對于某個請求參數(shù),返回的是一個String類型數(shù)組header表示一個保存了所有http請求頭字段的Map對象headerValues表示一個保存了所有http請求頭字段的Map對象,返回String類型數(shù)組cookie用于獲取使用者的cookie值,cookie的類型是MapinitParam表示一個保存了所有Web應(yīng)用初始化參數(shù)的Map對象EL隱式對象7.2EL隱式對象在上表列舉的隱式對象中,pageContext可以獲取其他10個隱式對象,pageScope、requestScope、sessionScope、applicationScope是用于獲取指定域的隱式對象;param和paramValues是用于獲取請求參數(shù)的隱式對象,header和headerValues是用于獲取HTTP請求消息頭的隱式對象;cookie是用于獲取Cookie信息的隱式對象;initParam是用于獲取Web應(yīng)用初始化信息的隱式對象。7.2.1pageContext對象先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉使用pageContext對象獲取JSP頁面pageContext對象的用法為了獲取JSP頁面的隱式對象,可以使用EL中的pageContext隱式對象。pageContext隱式對象用法示例代碼如下:${pageContext.response.characterEncoding}pageContext對象用于獲取response對象中的characterEncoding屬性。7.2.1pageContext對象STEP01在chapter07項(xiàng)目的web目錄下創(chuàng)建一個名為pageContext.jsp的文件用于演示pageContext隱式對象的具體用法。pageContext.jsp代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><html><head></head><body>
請求URI為:${pageContext.request.requestURI}<br/> Content-Type響應(yīng)頭:${pageContext.response.contentType}<br/>
服務(wù)器信息為:${pageContext.servletContext.serverInfo}<br/> Servlet注冊名為:${pageContext.servletConfig.servletName}<br/></body></html>7.2.1pageContext對象STEP02在IDEA中啟動Tomcat服務(wù)器,在地址欄中輸入“http://localhost:8080/chapter07/pageContext.jsp”訪問pageContext.jsp頁面,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.2.1pageContext對象需要注意的是,不要將EL中的隱式對象與JSP中的隱式對象混淆,只有pageContext對象是它們所共有的,其他隱式對象則毫不相關(guān)。7.2.2Web域相關(guān)對象先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉使用pageContext對象提供的4個用于訪問作用域范圍的隱式對象Web域相關(guān)對象7.2.2Web域相關(guān)對象在EL中提供了4個用于訪問作用域范圍的隱式對象,即pageScope、requestScope、sessionScope和applicationScope。應(yīng)用這4個隱式對象指定所要查找的標(biāo)識符的作用域后,系統(tǒng)將不再按照默認(rèn)的順序(page、Request、session及application)查找相應(yīng)的標(biāo)識符。它們與JSP中的page、request、session及application內(nèi)置對象類似,只不過這4個隱式對象只能用于獲取指定范圍內(nèi)的屬性值,而不能獲取其他相關(guān)信息。Web域相關(guān)對象的示例7.2.2Web域相關(guān)對象Web域相關(guān)對象的示例代碼如下:${pageScope.userName}${requestScope.userName}${sessionScope.userName}${applicationScope.userName}pageScope、requestScope、sessionScope和applicationScope4個隱式對象都可以通過setAttribute()方法存儲屬性,通過getAttribute()方法獲取屬性。STEP01接下來通過一個案例演示這4個隱式對象如何訪問JSP域?qū)ο笾械膶傩?。在chapter07項(xiàng)目的web目錄下,新建一個名為scopes.jsp的文件,代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><html><head></head><body> <%pageContext.setAttribute("userName","itcast");%> <%request.setAttribute("bookName","JavaWeb");%> <%session.setAttribute("userName","itheima");%> <%application.setAttribute("bookName","Java基礎(chǔ)");%>
表達(dá)式\${pageScope.userName}的值為:${pageScope.userName}<br/>
表達(dá)式\${requestScope.bookName}的值為:${requestScope.bookName}<br/>
表達(dá)式\${sessionScope.userName}的值為:${sessionScope.userName}<br/>
表達(dá)式\${applicationScope.bookName}的值為:${applicationScope.bookName}<br/>
表達(dá)式\${userName}的值為:${userName}</body></html>7.2.2Web域相關(guān)對象Web域相關(guān)對象7.2.2Web域相關(guān)對象在scopes.jsp文件中,使用pageScope、requestScope、sessionScope和applicationScope這四個隱式對象成功的獲取到了相應(yīng)JSP域?qū)ο笾械膶傩灾?。需要注意的是,使用EL獲取某個域?qū)ο笾械膶傩詴r,也可以不使用這些隱式對象指定查找域,而直接引用域中的屬性名稱,例如,表達(dá)式${userName}就是在page、request、session、application這4個作用域內(nèi)按順序依次查找userName屬性。STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/scopes.jsp”訪問scopes.jsp頁面,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.2.2Web域相關(guān)對象7.2.3訪問環(huán)境信息的隱式對象先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉使用param和paramValues兩個隱式對象獲取客戶端傳遞的請求參數(shù)獲取客戶端傳遞的請求參數(shù)7.2.3訪問環(huán)境信息的隱式對象在JSP頁面中,經(jīng)常需要獲取客戶端傳遞的請求參數(shù),為此,EL提供了param和paramValues兩個隱式對象,這兩個隱式對象專門用于獲取客戶端訪問JSP頁面時傳遞的請求參數(shù)。param對象的語法7.2.3訪問環(huán)境信息的隱式對象param對象用于獲取請求參數(shù)的某個值,它是Map類型,與request.getParameter()方法相同,在使用EL獲取參數(shù)時,如果參數(shù)不存在,返回的是空字符串,而不是null。param對象的語法格式比較簡單,具體示例如下:${param.num}paramValues對象的語法7.2.3訪問環(huán)境信息的隱式對象如果一個請求參數(shù)有多個值,可以使用paramValues對象獲取請求參數(shù)的所有值,該對象返回請求參數(shù)所有值組成的數(shù)組,如果要獲取某個請求參數(shù)的第一個值,可以使用如下代碼:${paramValues.nums[0]}STEP01接下來通過一個案例演示param和paramValues隱式對象如何獲取請求參數(shù)的值。在chapter07項(xiàng)目的web目錄下,新建一個名為param.jsp的文件,具體代碼如下所示。<bodystyle="text-align:center;"> <formaction="${pageContext.request.contextPath}/param.jsp"> num1:<inputtype="text"name="num1"><br/> num2:<inputtype="text"name="num"><br/> num3:<inputtype="text"name="num"><br/><br/> <inputtype="submit"value="提交"/> <inputtype="submit"value="重置"/><hr/> num1:
${param.num1}
<br
/> num2:
${paramValues.num[0]}
<br/> num3:
${paramValues.num[1]}
<br/> </form></body>7.2.3訪問環(huán)境信息的隱式對象STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/param.jsp”訪問param.jsp頁面,效果如下圖所示。7.2.3訪問環(huán)境信息的隱式對象STEP03在上圖的表單中輸入三個數(shù)字,分別為10、20、30,然后單擊提交按鈕,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.2.3訪問環(huán)境信息的隱式對象需要注意的是,如果一個請求參數(shù)有多個值,那么在使用param獲取請求參數(shù)時,則返回請求參數(shù)的第一個值。7.2.4Cookie對象先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉在JSP開發(fā)中獲取客戶端的Cookie對象Cookie對象在JSP開發(fā)中,經(jīng)常需要獲取客戶端的Cookie信息,為此,在EL中,提供了Cookie隱式對象,該對象是一個集合了所有Cookie信息的Map集合,Map集合中元素的鍵為各個Cookie的名稱,值則為對應(yīng)的Cookie對象。cookie對象用法示例如下:獲取cookie對象的信息:${cookie.userName}獲取cookie對象的名稱:${cookie.userN}獲取cookie對象的值:${cookie.userName.value}7.2.4Cookie對象STEP01在chapter07項(xiàng)目的web目錄下新建一個名為cookie.jsp的文件用于演示如何獲取Cookie對象中的信息。cookie.jsp的實(shí)現(xiàn)如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><html><head></head><body> Cookie對象的信息:<br/>
${cookie.userName}<br/> Cookie對象的名稱和值:<br/>
${cookie.userN}=${cookie.userName.value}
<%response.addCookie(newCookie("userName","itcast"));%></body></html>7.2.4Cookie對象STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/cookie.jsp”訪問cookie.jsp頁面,由于是瀏覽器第一次訪問cookie.jsp頁面,此時,服務(wù)器還沒有接收到名為userName的Cookie信息,所以,瀏覽器窗口中不會顯示。接下來刷新瀏覽器,第二次訪問cookie.jsp頁面,此時瀏覽器窗口中顯示的結(jié)果如下圖所示。7.2.4Cookie對象Cookie對象運(yùn)行圖的解釋由上圖可知,瀏覽器窗口中顯示了獲取到的Cookie信息,這是因?yàn)榈谝淮卧L問服務(wù)器時,服務(wù)器會向?yàn)g覽器回寫一個Cookie,此時的Cookie信息是存儲在瀏覽器中的,當(dāng)刷新瀏覽器,第二次訪問cookie.jsp頁面時,由于瀏覽器中已經(jīng)存儲了名為userName的Cookie信息,瀏覽器會將此Cookie信息一同發(fā)送給服務(wù)器,這時使用表達(dá)式${cookie.userN
}和${cookie.userName.value
}便可以獲取Cookie的名稱和值。7.2.4Cookie對象7.2.5initParam對象先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉使用initParam對象獲取Web應(yīng)用初始化參數(shù)的值STEP01initParam對象用于獲取Web應(yīng)用初始化參數(shù)的值,下面通過一個案例具體講解initParam對象的使用。在chapter07項(xiàng)目的web.xml文件中設(shè)置一個初始化參數(shù)author,具體代碼如下:<context-param><param-name>author</param-name><param-value>黑馬程序員</param-value></context-param>7.2.5initParam對象使用initParam對象獲取參數(shù)author的代碼如下:${initParam.author}STEP02在chapter07項(xiàng)目的web包下創(chuàng)建initParam.jsp的文件,代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><html><head></head><body> Author的值為:${initParam.author}</body></html>7.2.5initParam對象STEP03在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/initParam.jsp”訪問initParam.jsp頁面,瀏覽器窗口中顯示的結(jié)果如下所示。7.2.5initParam對象JSTL7.37.3.1什么是JSTL先定一個小目標(biāo)!
先定一個小目標(biāo)!了解JSTL是什么,能夠知道JSTL用于做什么JSTL從JSP1.1規(guī)范開始,JSP就支持使用自定義標(biāo)簽,使用自定義標(biāo)簽大大降低了JSP頁面的復(fù)雜度,同時增強(qiáng)了代碼的重用性。為此,許多Web應(yīng)用廠商都制定了自身應(yīng)用的標(biāo)簽庫,然而同一功能的標(biāo)簽由不同的Web應(yīng)用廠商制定可能是不同的,這就導(dǎo)致市面上出現(xiàn)了很多功能相同的標(biāo)簽,令網(wǎng)頁制作者無從選擇,為了解決這個問題,Sun公司制定了一套標(biāo)準(zhǔn)標(biāo)簽庫(JavaServerPagesStandardTagLibrary),簡稱JSTL。7.3.1什么是JSTLJSTL的標(biāo)簽庫雖然JSTL叫做標(biāo)準(zhǔn)標(biāo)簽庫,但實(shí)際上它是由5個功能不同的標(biāo)簽庫組成。這5個標(biāo)簽庫分別是核心標(biāo)簽庫、國際化/格式化標(biāo)簽庫、SQL標(biāo)簽庫、XML標(biāo)簽庫和函數(shù)標(biāo)簽庫。在使用這些標(biāo)簽庫之前,必須在JSP頁面的頂部使用<%@taglib%>指令定義引用的標(biāo)簽庫和訪問前綴。7.3.1什么是JSTLJSTL的標(biāo)簽庫—核心標(biāo)簽庫使用核心標(biāo)簽庫的taglib指令格式如下:7.3.1什么是JSTL<%@taglibprefix="c"url="/jsp/jstl/core"%>核心標(biāo)簽庫主要用于完成JSP頁面的常用功能,包括JSTL的表達(dá)式標(biāo)簽、URL標(biāo)簽、流程控制標(biāo)簽。例如,用于輸出文本內(nèi)容的<c:out>標(biāo)簽、用于條件判斷的<c:if>標(biāo)簽、用于迭代循環(huán)的<c:forEach>標(biāo)簽等。JSTL的標(biāo)簽庫—格式標(biāo)簽庫使用格式標(biāo)簽庫的taglib指令格式如下:7.3.1什么是JSTL<%@taglibprefix"fmt"url="/jsp/jstl/fmt"%>國際化/格式化標(biāo)簽庫,它包含實(shí)現(xiàn)Web應(yīng)用程序的國際化標(biāo)簽和格式化標(biāo)簽。例如,設(shè)置JSP頁面的本地信息、設(shè)置JSP頁面的時區(qū)、使日期按照本地格式顯示等。JSTL的標(biāo)簽庫—SQL標(biāo)簽庫使用SQL標(biāo)簽庫的taglib指令格式如下:7.3.1什么是JSTL<%@taglibprefix="sql"url="/jsp/jstl/sql"%>SQL標(biāo)簽庫,它包含了用于訪問數(shù)據(jù)庫和操作數(shù)據(jù)庫的標(biāo)簽。例如,獲取數(shù)據(jù)庫連接、從數(shù)據(jù)庫表中檢索數(shù)據(jù)等。由于在軟件分層開發(fā)模型中,JSP頁面僅作為顯示層,一般不會在JSP頁面中直接操作數(shù)據(jù)庫,所以,JSTL中提供的這套標(biāo)簽庫不經(jīng)常使用。JSTL的標(biāo)簽庫—XML標(biāo)簽庫使用XML標(biāo)簽庫的taglib指令格式如下:7.3.1什么是JSTL<%@taglibprefx="xml"url="/jsp/jstl/xml"%>XML文檔的標(biāo)簽庫,它包含對XML文檔中的數(shù)據(jù)進(jìn)行操作的標(biāo)簽。例如,解析XML文件、輸出XML文檔中的內(nèi)容,以及迭代處理XML文檔中的元素。XML廣泛應(yīng)用于Web開發(fā),使用XML標(biāo)簽庫處理XML文檔更加簡單方便。JSTL的標(biāo)簽庫—函數(shù)標(biāo)簽庫使用函數(shù)標(biāo)簽庫的taglib指令格式如下:7.3.1什么是JSTL<%@taglibprefix="fn"url="/jsp/jstl/functions"%>函數(shù)標(biāo)簽庫,它提供了一套自定義EL函數(shù),包含了JSP網(wǎng)頁制作者經(jīng)常要用到的字符串操作。例如,提取字符串中的子字符串、獲取字符串的長度等。7.3.2JSTL的下載和使用先定一個小目標(biāo)!
先定一個小目標(biāo)!熟悉JSTL的下載和使用7.3.2JSTL的下載和使用下載JSTL包從Apache的網(wǎng)站下載JSTL的JAR包jakarta-taglibs-standard-1.1.2.zip,將下載好的JSTL安裝包進(jìn)行解壓,此時,在lib目錄下可以看到兩個JAR文件,分別為jstl.jar和standard.jar。其中,jstl.jar文件包含JSTL規(guī)范中定義的接口和相關(guān)類,standard.jar文件包含用于實(shí)現(xiàn)JSTL的.class文件以及JSTL中5個標(biāo)簽庫描述符文件(TLD)。7.3.2JSTL的下載和使用步驟1步驟2步驟3導(dǎo)入JSTL包在chapter07項(xiàng)目的web包的WEB-INF包中新建lib包,將jstl.jar和standard.jar這兩個文件復(fù)制到lib目錄下。7.3.2JSTL的下載和使用步驟3導(dǎo)入JSTL包下面需要在IDEA中配置導(dǎo)入的兩個文件才可以正常使用。在IDEA界面單擊【File】→【Setting】,在Setting界面下單擊【languages&Frameworks】→【SchemasandDTDs】。步驟2步驟17.3.2JSTL的下載和使用導(dǎo)入JSTL包在上圖中單擊右上角“”進(jìn)入MapExternalResource界面。步驟1步驟2步驟3在上圖中的【URI】選項(xiàng)中填入/jsp/jstl/core,在【File】選項(xiàng)中找到解壓文件jakarta-taglibs-standard-1.1.2的tld目錄下的c.tld文件,單擊【OK】按鈕完成導(dǎo)入。至此,JSTL安裝配置完成,在chapter07項(xiàng)目中就可以使用JSTL標(biāo)簽庫了。7.3.2JSTL的下載和使用測試JSTL由于在測試的時候需要使用<c:out>標(biāo)簽,所以需要使用taglib指令導(dǎo)入Core標(biāo)簽庫,具體代碼如下:<%@tagliburi="/jsp/jstl/core"prefix="c"%>taglib指令的uri屬性用于指定引入標(biāo)簽庫描述符文件的URI,prefix屬性用于指定引入標(biāo)簽庫描述符文件的前綴,在JSP文件中使用這個標(biāo)簽庫中的某個標(biāo)簽時,都需要使用這個前綴。STEP01接下來編寫一個簡單的JSP文件test.jsp,使用taglib指令引入Core標(biāo)簽庫,在該文件中使用<c:out>標(biāo)簽,具體代碼如下。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><html><head></head><body> <c:outvalue="HelloWorld!"></c:out></body></html> 7.3.2JSTL的下載和使用STEP02在IDEA中啟動Tomcat服務(wù)器,打開瀏覽器,在地址欄中輸入地址“http://localhost:8080/chapter07/test.jsp”訪問test.jsp頁面,此時,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.3.2JSTL的下載和使用JSTL中的Core標(biāo)簽庫7.47.4.1表達(dá)式標(biāo)簽先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握J(rèn)STL核心標(biāo)簽庫中的<c:out>和<c:remove>標(biāo)簽<c:out>標(biāo)簽在JSP頁面中,最常見的操作就是向頁面輸出一段文本信息,為此,Core標(biāo)簽庫提供了<c:out>標(biāo)簽,該標(biāo)簽可以將一段文本內(nèi)容或表達(dá)式的結(jié)果輸出到客戶端。如果<c:out>標(biāo)簽輸出的文本內(nèi)容中包含需要進(jìn)行轉(zhuǎn)義的特殊字符,例如>、<、&、'、"等,<c:out>標(biāo)簽會默認(rèn)對它們進(jìn)行HTML編碼轉(zhuǎn)換后再輸出。7.4.1表達(dá)式標(biāo)簽<c:out>標(biāo)簽兩種語法格式<c:out>標(biāo)簽有兩種語法格式,具體如下:語法1:沒有標(biāo)簽體的情況7.4.1表達(dá)式標(biāo)簽<c:outvalue="value"[default="defaultValue"][escapeXml="{true|false}"]/>語法2:有標(biāo)簽體的情況<c:outvalue="value"[escapeXml="{true|false}"]>defaultValue</c:out><c:out>標(biāo)簽<c:out>標(biāo)簽的語法格式中,沒有標(biāo)簽體的情況,需要使用default屬性指定默認(rèn)值,有標(biāo)簽體的情況,在標(biāo)簽體中指定輸出的默認(rèn)值。<c:out>標(biāo)簽有多個屬性,下面對這些屬性進(jìn)行講解。(1)value屬性用于指定輸出的文本內(nèi)容。(2)default屬性用于指定當(dāng)value屬性為null時所輸出的默認(rèn)值,該屬性是可選的(中括號中的屬性都是可選的)。(3)escapeXml屬性用于指定是否將>、<、&、'、"等特殊字符進(jìn)行HTML編碼轉(zhuǎn)換后再進(jìn)行輸出,默認(rèn)值為true。7.4.1表達(dá)式標(biāo)簽需要注意的是,只有當(dāng)value屬性值為null時,<c:out>標(biāo)簽才會輸出默認(rèn)值,如果沒有指定默認(rèn)值,則默認(rèn)輸出空字符串。STEP01使用<c:out>標(biāo)簽輸出默認(rèn)值有兩種方式,一是通過使用<c:out>標(biāo)簽的default屬性輸出默認(rèn)值,二是通過使用<c:out>標(biāo)簽的標(biāo)簽體輸出默認(rèn)值。接下來通過一個案例演示這兩種使用方式。在chapter07項(xiàng)目的web目錄下創(chuàng)建一個名為c_out1.jsp的文件,具體代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><html><head></head><body> <%--第1個out標(biāo)簽--%> userName屬性的值為:
<c:outvalue="${param.username}"default="unknown"/><br/> <%--第2個out標(biāo)簽--%> userName屬性的值為:
<c:outvalue="${param.username}">
unknown
</c:out></body></html>7.4.1表達(dá)式標(biāo)簽STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/c_out1.jsp”訪問c_out1.jsp頁面,瀏覽器窗口中的顯示結(jié)果如下圖所示。7.4.1表達(dá)式標(biāo)簽瀏覽器窗口輸出了兩個默認(rèn)值均為unknown,這是通過使用<c:out>標(biāo)簽的default屬性以及標(biāo)簽體兩種方式來設(shè)置的默認(rèn)值,這兩種方式實(shí)現(xiàn)的效果相同。由于在客戶端訪問c_out1.jsp頁面時,并沒有傳遞username參數(shù),所以表達(dá)式${param.username}的值為null,<c:out>標(biāo)簽就會輸出默認(rèn)值。STEP03如果不想讓<c:out>標(biāo)簽輸出默認(rèn)值,可以在客戶端訪問c_out1.jsp頁面時傳遞一個參數(shù),在瀏覽器地址欄中輸入“http://localhost:8080/chapter07/c_out1.jsp?username=itcast”,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.4.1表達(dá)式標(biāo)簽瀏覽器窗口中輸出了itcast,這是因?yàn)樵诳蛻舳嗽L問c_out1.jsp頁面時傳遞了一個username參數(shù),該參數(shù)的值為itcast,因此,表達(dá)式${param.username}就會獲取到這個參數(shù)值,并將其輸出到JSP頁面中。STEP01<c:out>標(biāo)簽有一個重要的屬性escapeXml,該屬性可以將特殊的字符進(jìn)行HTML編碼轉(zhuǎn)換后再輸出。接下來通過一個案例演示如何使用escapeXml屬性將特殊字符進(jìn)行轉(zhuǎn)換。在chapter07項(xiàng)目的web目錄下創(chuàng)建一個名為c_out2.jsp的文件,具體代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><html><head></head><body> <c:outvalue="${param.username}"escapeXml="false"> <metahttp-equiv="refresh" content="0;url="/> </c:out></body></html>7.4.1表達(dá)式標(biāo)簽STEP02在IDEA中重啟Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/c_out2.jsp”訪問c_out2.jsp頁面,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.4.1表達(dá)式標(biāo)簽瀏覽器窗口中顯示的是網(wǎng)站的信息,這是因?yàn)樵?lt;c:out>標(biāo)簽中將escapeXml的屬性值設(shè)置為false,因此,<c:out>標(biāo)簽不會對特殊字符進(jìn)行HTML轉(zhuǎn)換,<meta>標(biāo)簽便可以發(fā)揮作用,在訪問c_out2.jsp頁面時就會跳轉(zhuǎn)到網(wǎng)站。STEP03如果想對頁面中輸出的特殊字符進(jìn)行轉(zhuǎn)義,可以將escapeXml屬性的值設(shè)置為true,下面將文件7-11中<c:out>標(biāo)簽的escapeXml屬性修改為true,再次訪問c_out2.jsp頁面,瀏覽器窗口顯示結(jié)果如下圖所示。7.4.1表達(dá)式標(biāo)簽將文件c_out2.jsp中<c:out>標(biāo)簽的escapeXml屬性值設(shè)置為true后,在JSP頁面中輸入的<meta>標(biāo)簽便會進(jìn)行HTML編碼轉(zhuǎn)換,最終以字符串的形式輸出了。需要注意的是,如果在<c:out>標(biāo)簽中不設(shè)置escapeXml屬性,則該屬性的默認(rèn)值為true。<c:remove>移除標(biāo)簽<c:remove>標(biāo)簽用于移除指定的JSP范圍內(nèi)的變量,其語法格式如下:7.4.1表達(dá)式標(biāo)簽<c:removevar="name"[scope=”范圍”]/><c:remove>標(biāo)簽參數(shù)含義如下:var:用于指定要移除的變量名。scope:用于指定變量的有效范圍,可選值有page、request、session和application,默認(rèn)值為page。如果在該標(biāo)簽中沒有指定變量的有效范圍,那么將分別在page、request、session和application的范圍內(nèi)查找要移除的變量并移除。例如,在一個頁面中,存在不同范圍的兩個同名變量,當(dāng)不指定范圍時移除該變量,這兩個范圍內(nèi)的變量都將被移除。因此,在移除變量時,最好指定變量的有效范圍。7.4.2流程控制標(biāo)簽先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握J(rèn)STL核心標(biāo)簽庫中的<c:if>、<c:choose>、<c:when>和<c:otherwise>標(biāo)簽實(shí)現(xiàn)程序的流程控制流程控制標(biāo)簽流程控制在程序中會根據(jù)不同的條件執(zhí)行不同的代碼產(chǎn)生不同的運(yùn)行結(jié)果,使用流程控制可以處理程序中的邏輯問題。在JSTL中包含<c:if>、<c:choose>等流程控制標(biāo)簽可以實(shí)現(xiàn)程序的流程控制。7.4.2流程控制標(biāo)簽<c:if>標(biāo)簽在程序開發(fā)中,經(jīng)常需要使用if語句進(jìn)行條件判斷,如果要在JSP頁面中進(jìn)行條件判斷,就需要使用Core標(biāo)簽庫提供的<c:if>標(biāo)簽,該標(biāo)簽專門用于完成JSP頁面中的條件判斷,它有兩種語法格式。語法1:沒有標(biāo)簽體的情況<c:iftest="testCondition"var="result"[scope="{page|request|session|application}"]/>語法2:有標(biāo)簽體的情況,在標(biāo)簽體中指定要輸出的內(nèi)容<c:iftest="testCondition"var="result"[scope="{page|request|session|application}"]> bodycontent</c:if>7.4.2流程控制標(biāo)簽<c:if>標(biāo)簽在<c:if>標(biāo)簽格式中,可以看到<c:if>標(biāo)簽有三個屬性,下面對這三個屬性分別進(jìn)行講解。test屬性用于設(shè)置邏輯表達(dá)式。var屬性用于指定邏輯表達(dá)式中變量的名字。scope屬性用于指定var變量的作用范圍,默認(rèn)值為page。7.4.2流程控制標(biāo)簽STEP01接下來通過一個具體的案例演示如何在JSP頁面中使用<c:if>標(biāo)簽。在chapter07項(xiàng)目的web目錄下創(chuàng)建一個名為c_if.jsp的文件,具體代碼如下所示。<%@pagelanguage="java"contentType="text/html;charset=utf-8"import="java.util.*"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><html><head></head><body> <c:setvalue="1"var="visitCount"property="visitCount"/> <c:iftest="${visitCount==1}"> Thisisyoufirstvisit.Welcometothesite! </c:if></body></html>7.4.2流程控制標(biāo)簽STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/c_if.jsp”訪問c_if.jsp頁面,瀏覽器窗口中顯示的結(jié)果如下圖所示。7.4.2流程控制標(biāo)簽<c:choose>、<c:when>和<c:otherwise>標(biāo)簽在程序開發(fā)中不僅需要使用if條件語句,還經(jīng)常會使用if-else語句,為了在JSP頁面中也可以完成同樣的功能,Core標(biāo)簽庫提供了<c:choose>標(biāo)簽,該標(biāo)簽用于指定多個條件選擇的組合邊界,它必須與<c:when>、<c:otherwise>標(biāo)簽一起使用。7.4.2流程控制標(biāo)簽<c:choose>標(biāo)簽<c:choose>標(biāo)簽沒有屬性,在它的標(biāo)簽體中只能嵌套一個或多個<c:when>標(biāo)簽,零個或一個<c:otherwise>標(biāo)簽,并且同一個<c:choose>標(biāo)簽中所有的<c:when>子標(biāo)簽必須出現(xiàn)在<c:otherwise>子標(biāo)簽之前,其語法格式如下:<c:choose> Bodycontent(<when>and<otherwise>subtags)</c:choose>7.4.2流程控制標(biāo)簽<c:when>標(biāo)簽<c:when>標(biāo)簽只有一個test屬性,該屬性的值為布爾類型。test屬性支持動態(tài)值,其值可以是一個條件表達(dá)式,如果條件表達(dá)式的值為true,就執(zhí)行這個<c:when>標(biāo)簽體的內(nèi)容,其語法格式如下:<c:whentest="testCondition"> Bodycontent</c:when>7.4.2流程控制標(biāo)簽<c:otherwise>標(biāo)簽<c:otherwise>標(biāo)簽沒有屬性,它必須作為<c:choose>標(biāo)簽最后分支出現(xiàn),當(dāng)所有的<c:when>標(biāo)簽的test條件都不成立時,才執(zhí)行和輸出<c:otherwise>標(biāo)簽體的內(nèi)容,其語法格式如下:<c:otherwise> conditionalblock</c:otherwise>7.4.2流程控制標(biāo)簽STEP01為了使讀者更好地學(xué)習(xí)<c:choose>、<c:when>和<c:otherwise>這三個標(biāo)簽,接下來通過一個案例演示這些標(biāo)簽的使用。在chapter07項(xiàng)目的web目錄下創(chuàng)建一個名為c_choose.jsp的文件,主要代碼如下所示。<body> <c:choose> <c:whentest="${emptyparam.username}"> unKnownuser. </c:when> <c:whentest="${param.username=='itcast'}"> ${param.username}ismanager. </c:when> <c:otherwise> ${param.username}isemployee. </c:otherwise> </c:choose></body>7.4.2流程控制標(biāo)簽STEP02在IDEA中啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入地址“http://localhost:8080/chapter07/c_choose.jsp”訪問c_choose.jsp頁面,此時,瀏覽器窗口中的顯示結(jié)果如下圖所示。7.4.2流程控制標(biāo)簽當(dāng)使用“http://localhost:8080/chapter07/c_choose.jsp”地址直接訪問c_choose.jsp頁面時,瀏覽器中顯示的信息為“unKnownuser.”,這是因?yàn)樵谠L問c_choose.jsp頁面時并沒有在URL地址中傳遞參數(shù),<c:whentest="${emptyparam.username}">標(biāo)簽中test屬性的值為true,便會輸出<c:when>標(biāo)簽體中的內(nèi)容。STEP03如果在訪問c_choose.jsp頁面時傳遞一個參數(shù)username=itcast,此時瀏覽器窗口中的顯示結(jié)果如下圖所示。7.4.2流程控制標(biāo)簽瀏覽器中顯示的信息為itcastismanager,這是因?yàn)樵谠L問c_choose.jsp頁面時傳遞了一個參數(shù),當(dāng)執(zhí)行<c:whentest="${emptyparam.username}">標(biāo)簽時,test屬性的值為false,不會輸出標(biāo)簽體中的內(nèi)容。然后執(zhí)行<c:whentest="${param.username=='itcast'}">標(biāo)簽,當(dāng)執(zhí)行到該標(biāo)簽時,會判斷test屬性值是否為true,由于在URL地址中傳遞了參數(shù)username=itcast,所以test屬性值為true,就會輸出該標(biāo)簽體中的內(nèi)容itcastismanager。7.4.3循環(huán)標(biāo)簽先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握J(rèn)STL核心標(biāo)簽庫中循環(huán)標(biāo)簽<c:forEach><c:forEach>標(biāo)簽在JSP頁面中,經(jīng)常需要對集合對象進(jìn)行循環(huán)迭代操作,為此,Core標(biāo)簽庫提供了一個<c:forEach>標(biāo)簽,該標(biāo)簽專門用于迭代集合對象中的元素,如Set、List、Map、數(shù)組等,并且能重復(fù)執(zhí)行標(biāo)簽體中的內(nèi)容。7.4.3循環(huán)標(biāo)簽<c:forEach>標(biāo)簽的語法格式7.4.3循環(huán)標(biāo)簽<c:forEach>標(biāo)簽有兩種語法格式,具體如下:語法1:迭代包含多個對象的集合<c:forEach[var="varName"]items="collection"[varStatus="varStatusName"][begin="begin"][end="end"][step="step"]> bodycontent</c:forEach>語法2:迭代指定范圍內(nèi)的集合<c:forEach[var="varName"][varStatus="varStatusName"]begin="begin"end="end"[step="step"]> bodycontent</c:forEach><c:forEach>標(biāo)簽的語法格式7.4.3循環(huán)標(biāo)簽<c:forEach>標(biāo)簽有多個屬性。下面對這些屬性分別進(jìn)行講解。var屬性:用于將當(dāng)前迭代到的元素保存到page域中的名稱。items屬性:用于指定將要迭代的集合對象。varStatus屬性:用于指定將當(dāng)前迭代狀態(tài)信息的對象保存到page域中的名稱。begin屬性:用于指定從集合中第幾個元素開始進(jìn)行迭代,begin的索引值從0開始,
如果沒有指定items屬性,就從begin指定的值開始迭代,直到迭代結(jié)束為止。step屬性:用于指定迭代的步長,即迭代因子的增量。STEP01下面通過案例的方式學(xué)習(xí)<c:forEach>標(biāo)簽的使用。分別使用<c:foreach>標(biāo)簽迭代數(shù)組和Map集合,首先需要在數(shù)組和Map集合中添加幾個元素,然后將數(shù)組賦值給<c:forEach>標(biāo)簽的items屬性,而Map集合對象同樣賦值給<c:forEach>標(biāo)簽的items屬性,之后使用EL獲取Map集合中的鍵和值,具體如下所示。<body>
<%String[]fruits={"apple","orange","g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度新能源項(xiàng)目施工團(tuán)隊(duì)派遣服務(wù)協(xié)議
- 二零二五年度員工期權(quán)激勵計(jì)劃執(zhí)行與員工福利協(xié)議
- 二零二五年度特色商業(yè)街區(qū)商鋪轉(zhuǎn)讓合同
- 2025年度鋼構(gòu)建筑鋼結(jié)構(gòu)加工與施工合同
- 2025年度電子商務(wù)平臺合作協(xié)議簽約變更終止全流程手冊
- 二零二五年度醫(yī)療糾紛調(diào)解與醫(yī)療機(jī)構(gòu)糾紛調(diào)解機(jī)制建設(shè)協(xié)議
- 2025年度電商旺季客服團(tuán)隊(duì)增援服務(wù)協(xié)議
- 2025年度金融科技合作入股協(xié)議書
- 二零二五年度城市綜合體工程款房屋抵償協(xié)議
- 二零二五年度電影學(xué)院電影包場教學(xué)合同
- 【幼兒園園本教研】幼兒表征的教師一對一傾聽策略
- 人教版新教材高一上學(xué)期期末考試數(shù)學(xué)試卷及答案(共五套)
- 采血知情同意書模板
- Mysql 8.0 OCP 1Z0-908 CN-total認(rèn)證備考題庫(含答案)
- 教科版二年級科學(xué)下冊 (磁鐵能吸引什么) 課件
- 學(xué)習(xí)探究診斷 化學(xué) 必修二
- 冀教2011版九年級英語全一冊《Lesson9ChinasMostFamous“Farmer”》教案及教學(xué)反思
- 三年級下冊音樂教學(xué)計(jì)劃含教學(xué)進(jìn)度安排活動設(shè)計(jì)word表格版
- 無極繩絞車檢修技術(shù)規(guī)范
- 雷鋒生平事跡簡介
- 市政工程施工安全檢查標(biāo)準(zhǔn)
評論
0/150
提交評論