課件J2EE架構(gòu)與程序設(shè)計(jì)_第1頁
課件J2EE架構(gòu)與程序設(shè)計(jì)_第2頁
課件J2EE架構(gòu)與程序設(shè)計(jì)_第3頁
課件J2EE架構(gòu)與程序設(shè)計(jì)_第4頁
課件J2EE架構(gòu)與程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩265頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

J2EE架構(gòu)與程序設(shè)計(jì)主講:XXX西北工業(yè)大學(xué)軟件與微電子學(xué)院J2EE架構(gòu)與程序設(shè)計(jì)主講:XXX第六章JSP(上)第六章JSP(上)主要內(nèi)容JSP基本語法JSP運(yùn)行機(jī)制JSP壽命周期管理JSP屬性主要內(nèi)容JSP基本語法概述JSP最終以servlet方式在容器中運(yùn)行容器將JSP文件翻譯成servlet類的源文件(.java),然后將其編譯成servletclass以和手工編寫servlet同樣的方式運(yùn)行servlet概述JSP最終以servlet方式在容器中運(yùn)行概述例子JSP:BasicCounter.jsp工具類:Counter.javaJava代碼片斷概述例子Java代碼片斷概述部署方法

Tomcat訪問若將包目錄和類文件放在WEB-INF/classes目錄下,則web應(yīng)用的所有部分都能訪問到它http://localhost:8080/testJSP1/BasicCounter.jsp概述部署方法若將包目錄和類文件放在WEB-INF/classJSP基本語法指令(directive)一個(gè)JSP元素,用來給JSP容器一個(gè)說明,在翻譯的時(shí)候被解釋。有三種JSP指令:page,include,taglibpage指令定義與頁面相關(guān)的屬性,JSP2.0定義了13種屬性import定義將在生成的servlet類中添加的Javaimport語句。缺省情況下自動(dòng)加入:java.lang,javax.servlet,javax.servlet.http,javax.servlet.jspisThreadSafe定義生成的servlet是否實(shí)現(xiàn)SingleThreadModel。缺省值為“true”,表示web應(yīng)用是線程安全的,不需要實(shí)現(xiàn)SingleThreadModel。若值為“false”,表示生成的servlet實(shí)現(xiàn)SingleThreadModelcontentType定義JSP響應(yīng)的MIME類型isELIgnored定義當(dāng)JSP頁面翻譯的時(shí)候,是否EL表達(dá)式被忽略JSP基本語法指令(directive)JSP基本語法isErrorPage定義當(dāng)前的頁面是否為另一個(gè)JSP頁面的錯(cuò)誤頁面。缺省值為“false”。如果值為“true”,頁面可以訪問隱含的exception對(duì)象;否則不能訪問errorPage定義一個(gè)URL資源,未捕獲的異常將發(fā)送到該資源。如果該資源為JSP頁面,則該頁面有一個(gè)isErrorPage=“true”的page指令language定義在腳本、表達(dá)式和聲明中使用的腳本語言,現(xiàn)在其值只能為“java”extends定義本JSP頁面將被容器編譯成的servlet類的超類session定義該JSP頁面是否有一個(gè)隱含的session對(duì)象,缺省為“true”JSP基本語法isErrorPageJSP基本語法buffer定義隱含的out對(duì)象如何處理緩沖,參考JspWriterautoFlush定義緩沖了的輸出是否自動(dòng)提交(flush),缺省值為“true”info定義一個(gè)字符串,它可以放進(jìn)轉(zhuǎn)換后的JSP頁面,并可以通過servlet的getServletInfo()方法獲得pageEncoding定義JSP頁面的字符編碼。缺省值為:“ISO-8859-1”JSP基本語法bufferJSP基本語法例子:使用import屬性導(dǎo)入外部的包導(dǎo)入一個(gè)包導(dǎo)入多個(gè)包注意@符號(hào)用逗號(hào)分隔JSP基本語法例子:使用import屬性導(dǎo)入外部的包注意@符JSP基本語法include指令定義一段文字或代碼,它可以在當(dāng)前頁面被解析時(shí)加入其中增強(qiáng)了代碼的復(fù)用性例如:<%@includefile=”wickedHeader.html”%>taglib指令定義JSP可以使用的標(biāo)簽庫例如:<%@taglibtagdir=”/WEB-INF/tags/cool”prefix=”cool”%>JSP基本語法include指令JSP基本語法表達(dá)式(expression)表達(dá)式在運(yùn)行時(shí)轉(zhuǎn)化成out.print()的參數(shù)不能將返回值為void的方法作為表達(dá)式注意“=”符號(hào)JSP基本語法表達(dá)式(expression)注意“=”符JSP基本語法聲明(declaration)在java代碼片斷(scriptlet)中定義的變量所有的java代碼片斷和表達(dá)式代碼都在一個(gè)service方法中,所以在java代碼片斷中聲明的變量總是本地變量!生成的servlet代碼在:yourTomcatHomeDir/work/Catalina/yourServerName/yourWebAppName/org/apache/jspJSP基本語法聲明(declaration)所有的java代JSP基本語法如何定義靜態(tài)變量?JSP聲明用于聲明生成的servlet類的成員,即變量和方法<%!和%>間的部分將被添加到service方法之外可以定義靜態(tài)變量和方法變量定義注意“!”符號(hào)JSP基本語法如何定義靜態(tài)變量?注意“!”符號(hào)JSP基本語法方法定義JSP基本語法方法定義JSP運(yùn)行機(jī)制容器如何處理JSP查找指令,獲取解析JSP所需的信息創(chuàng)建HttpServlet子類對(duì)于Tomcat5而言,生成的servlet擴(kuò)展如果有一個(gè)具有import屬性的page指令,將import聲明寫在類前面的包聲明之后對(duì)于Tomcat5而言,包聲明為:如果有聲明(declarations),就將它們寫入類文件,通常在類聲明之后,service方法之前創(chuàng)建service方法,方法名為_jspService()。它將被servlet超類的重載service()方法調(diào)用,并接收HttpServletRequest和HttpServletResponse。容器聲明并初始化所有隱含對(duì)象將HTML文本、java代碼片斷、表達(dá)式整理到service方法中,格式化并寫入PrintWriter響應(yīng)輸出JSP運(yùn)行機(jī)制容器如何處理JSPJSP運(yùn)行機(jī)制一個(gè)例子JSP運(yùn)行機(jī)制一個(gè)例子JSP運(yùn)行機(jī)制隱含對(duì)象封裝了其它隱含對(duì)象。通過它可以獲得其他隱含對(duì)象和屬性的引用在errorpage中使用JSP運(yùn)行機(jī)制隱含對(duì)象封裝了其它隱含對(duì)象。通過它可以獲得其他JSP壽命周期管理JSP壽命周期容器實(shí)例化servlet并運(yùn)行jspInit()方法對(duì)象現(xiàn)在成為一個(gè)servlet,準(zhǔn)備接收客戶請(qǐng)求容器創(chuàng)建一個(gè)新的線程來處理客戶請(qǐng)求,servlet的_jspService()方法運(yùn)行以后與傳統(tǒng)servlet處理方式無異轉(zhuǎn)換和編譯工作僅進(jìn)行一次JSP壽命周期管理JSP壽命周期容器實(shí)例化servlet并運(yùn)JSP壽命周期管理生成的servlet容器從JSP生成一個(gè)類,它實(shí)現(xiàn)HttpJspPage接口jspInit()方法從init()方法調(diào)用,可重載jspDestroy()方法從destroy()方法調(diào)用,可重載_jspService()方法從service()方法調(diào)用,不能重載。完全由容器開發(fā)商從JSP代碼生成JSP壽命周期管理生成的servletJSP壽命周期管理初始化JSP可以在JSP中進(jìn)行生成的servlet初始化配置servlet初始化參數(shù)JSP聲明重載jspInit()方法JSP壽命周期管理初始化JSP重載jspInit()方法JSP屬性使用四種隱含對(duì)象get/set屬性對(duì)應(yīng)四種不同的作用域除了標(biāo)準(zhǔn)的servletrequest,session和context作用域外,增加了page作用域?qū)?yīng)pageContext對(duì)象JSP屬性使用四種隱含對(duì)象get/set屬性JSP屬性在JSP中,可以只通過pageContext隱含對(duì)象,get/set任何作用域中的屬性pageContextJSP屬性在JSP中,可以只通過pageContext隱含對(duì)思考與討論題JSP指令有哪些,怎樣表示JSP表達(dá)式的本質(zhì)JSP聲明怎樣轉(zhuǎn)換成Java代碼JSP運(yùn)行機(jī)制JSP隱含對(duì)象有哪些,與標(biāo)準(zhǔn)servletAPI對(duì)象如何對(duì)應(yīng)?JSP的壽命周期怎樣自定義地初始化一個(gè)JSPJSP的四種作用域思考與討論題JSP指令有哪些,怎樣表示思考與討論題JSP指令有哪些,怎樣表示JSP表達(dá)式的本質(zhì)JSP聲明怎樣轉(zhuǎn)換成Java代碼JSP運(yùn)行機(jī)制JSP隱含對(duì)象有哪些,與標(biāo)準(zhǔn)servletAPI對(duì)象如何對(duì)應(yīng)?JSP的壽命周期怎樣自定義地初始化一個(gè)JSPJSP的四種作用域思考與討論題JSP指令有哪些,怎樣表示主要內(nèi)容JSP(下)JavaBean標(biāo)準(zhǔn)動(dòng)作(StandardAction)JSP表達(dá)式語言(EL)其他JSP標(biāo)準(zhǔn)動(dòng)作IncludeForward主要內(nèi)容JSP(下)JavaBean標(biāo)準(zhǔn)動(dòng)作(Standa概述將所有的Java代碼寫在JSP頁面中是一種壞習(xí)慣Web頁面設(shè)計(jì)師可能不懂Java在JSP中寫Java代碼使其難于更改和維護(hù)解決方案Action是一種JSP元素,它可以作用于隱含對(duì)象和其他服務(wù)器端對(duì)象,或定義新的腳本變量遵從XMLelement語法規(guī)范:starttag,body,endtag;tag必須使用前綴分為標(biāo)準(zhǔn)Action和自定義ActionEL提供了一種調(diào)用Java代碼的簡單方法可以部分地取代JSP中的Java代碼片斷和表達(dá)式使用EL,不需要在JSP中寫方法的代碼,可以寫在JSP外部,用EL調(diào)用EL對(duì)非Java程序員來說更簡單,對(duì)Java程序員來說更容易維護(hù)概述將所有的Java代碼寫在JSP頁面中是一種壞習(xí)慣JavaBean標(biāo)準(zhǔn)動(dòng)作JavaBean標(biāo)準(zhǔn)動(dòng)作目標(biāo):消除JSP中的腳本(Java代碼片斷、聲明、表達(dá)式)例子:ServletJSPJavaBean標(biāo)準(zhǔn)動(dòng)作JavaBean標(biāo)準(zhǔn)動(dòng)作JavaBean標(biāo)準(zhǔn)動(dòng)作用<jsp:useBean>聲明和初始化一個(gè)bean屬性用<jsp:getProperty>獲取bean對(duì)象型屬性的屬性值用<jsp:useBean>創(chuàng)建一個(gè)bean如果<jsp:useBean>找不到一個(gè)名為“person”的屬性對(duì)象,它就創(chuàng)建一個(gè)生成的servlet根據(jù)id和scope的值檢查bean,如果不存在相應(yīng)bean對(duì)象,它就用class中的值實(shí)例化一個(gè)對(duì)象,并把它賦予id,然后將它設(shè)置成scope中的一個(gè)屬性標(biāo)識(shí)一個(gè)JavaBean標(biāo)準(zhǔn)動(dòng)作聲明bean對(duì)象的標(biāo)識(shí)符聲明bean對(duì)象的類聲明bean對(duì)象的屬性范圍標(biāo)識(shí)標(biāo)準(zhǔn)動(dòng)作標(biāo)識(shí)實(shí)際的bean對(duì)象。與<jsp:useBean>標(biāo)簽中的“id”值匹配標(biāo)識(shí)屬性名(在bean類中用get/set方法讀取和設(shè)置)缺省為“page”不能是抽象的,且必須有一個(gè)無參數(shù)的構(gòu)造方法JavaBean標(biāo)準(zhǔn)動(dòng)作用<jsp:useBean>聲明和初JavaBean標(biāo)準(zhǔn)動(dòng)作容器生成的servlet的_jspService()方法根據(jù)id的值定義一個(gè)變量。這個(gè)變量可以被JSP的其它部分引用試圖在tag中定義的作用域中獲取屬性,并將結(jié)果賦予id變量如果在定義的作用域中沒有一個(gè)具有這樣名字的屬性最后,在定義的作用域中將這個(gè)新對(duì)象設(shè)置為一個(gè)屬性JavaBean標(biāo)準(zhǔn)動(dòng)作容器生成的servlet的_jspSJavaBean標(biāo)準(zhǔn)動(dòng)作<jsp:setProperty>設(shè)置bean屬性值作為<jsp:useBean>元素體的<jsp:setProperty>當(dāng)useBean有元素體時(shí),才加入代碼;利用反射機(jī)制的通用的設(shè)置屬性方法,等價(jià)于person.setName(“Fred”);AttributePropertyPropertyvalue<jsp:useBean>元素體中的代碼運(yùn)行是有條件的。只有當(dāng)找不到bean型屬性,并且創(chuàng)建了一個(gè)新的bean時(shí)才運(yùn)行JavaBean標(biāo)準(zhǔn)動(dòng)作<jsp:setProperty>當(dāng)JavaBean標(biāo)準(zhǔn)動(dòng)作多態(tài)bean引用<jsp:useBean>標(biāo)簽的type屬性生成的servlet類引用類型是抽象類PersonBean對(duì)象類型是具體類Employeetype可以是:類、抽象類或接口type用于定義bean(可以是抽象的);class用于實(shí)例化bean(必須是具體的),有:typex=newclass()JavaBean標(biāo)準(zhǔn)動(dòng)作多態(tài)bean引用引用類型是抽象類PeJavaBean標(biāo)準(zhǔn)動(dòng)作<jsp:useBean>標(biāo)簽中使用type屬性,不使用class屬性如果在給定作用域中存在名為id的bean對(duì)象屬性,該bean對(duì)象滿足type定義,則可以運(yùn)行Else,則拋出異常:判斷題servletJSPJavaBean標(biāo)準(zhǔn)動(dòng)作<jsp:useBean>標(biāo)簽中使用JavaBean標(biāo)準(zhǔn)動(dòng)作在<jsp:setProperty>標(biāo)簽中使用param屬性例子:直接將請(qǐng)求發(fā)送到JSP,不經(jīng)過servletHTMLTestBean.jsp使用param屬性與請(qǐng)求參數(shù)名相同JavaBean標(biāo)準(zhǔn)動(dòng)作在<jsp:setProperty>進(jìn)一步改進(jìn)JavaBean標(biāo)準(zhǔn)動(dòng)作使用與Beanproperty同名的請(qǐng)求參數(shù)HTMLTestBean.jsp如果請(qǐng)求參數(shù)與beanproperty名匹配,則不需在<jsp:setProperty>標(biāo)簽中為該屬性賦值遍歷并找到與請(qǐng)求參數(shù)匹配的beanproperty名,并將其值設(shè)為相應(yīng)的請(qǐng)求參數(shù)值Bean標(biāo)簽可以從請(qǐng)求參數(shù)自動(dòng)轉(zhuǎn)換到String和原數(shù)據(jù)類型的propertyJavaBean標(biāo)準(zhǔn)動(dòng)作使用與Beanproperty同名JavaBean標(biāo)準(zhǔn)動(dòng)作Beanproperty的類型不是String或原類型打印person的dog的名字ServletJavaBean標(biāo)準(zhǔn)動(dòng)作Beanproperty的類型不是JavaBean標(biāo)準(zhǔn)動(dòng)作result.jsp<jsp:getProperty>只能訪問bean型屬性的properties,不能訪問嵌套的propertiesDog’snameis:SpikeDog’snameis:foo.Dog@799338實(shí)際是調(diào)用了toString()方法JavaBean標(biāo)準(zhǔn)動(dòng)作result.jsp<jsp:getJSP表達(dá)式語言(EL)EL提供了一種調(diào)用Java代碼的簡單方法用EL獲取嵌套的bean類型屬性的property相當(dāng)簡單使用非Java語法解構(gòu)EL通常寫在大括號(hào)中,前面加$符號(hào)第一個(gè)變量是隱含對(duì)象或?qū)傩訨SP表達(dá)式語言(EL)EL提供了一種調(diào)用Java代碼的簡單JSP表達(dá)式語言(EL)都是Map對(duì)象是對(duì)pageContext對(duì)象的引用(pageContext是一個(gè)JavaBean)除了pageContext外,EL隱含對(duì)象與JSP腳本中使用的隱含對(duì)象不同JSP表達(dá)式語言(EL)都是Map對(duì)象是對(duì)pageConteJSP表達(dá)式語言(EL)使用“.”操作符可以訪問property和Map的值左邊只能是Map或Bean右邊必須是一個(gè)Map的key或一個(gè)bean的property名右邊必須遵循Java命名規(guī)則必須以字母、下劃線或$符號(hào)開始不能用Java保留關(guān)鍵字……JSP表達(dá)式語言(EL)使用“.”操作符JSP表達(dá)式語言(EL)使用[]操作符左邊還可以是List或數(shù)組右邊還可以是數(shù)字、能轉(zhuǎn)換成數(shù)字的其他類型、其他不符合Java命名規(guī)則的標(biāo)志符對(duì)于Bean和Map,“.”和“[]”操作符可以互換如果[]中不是字符串,將被求值(看作屬性或隱含對(duì)象)優(yōu)先JSP表達(dá)式語言(EL)使用[]操作符優(yōu)先JSP表達(dá)式語言(EL)例子ServletJSP結(jié)果JSP表達(dá)式語言(EL)例子JSP表達(dá)式語言(EL)在括號(hào)中使用嵌套表達(dá)式ServletJSP結(jié)果JSP表達(dá)式語言(EL)在括號(hào)中使用嵌套表達(dá)式JSP表達(dá)式語言(EL)EL隱含對(duì)象作用域?qū)傩缘腗ap請(qǐng)求參數(shù)的Map請(qǐng)求的header的MapCookie的Map上下文初始化參數(shù)的Map不是Map,是對(duì)pageContext對(duì)象的引用,相當(dāng)于BeanJSP表達(dá)式語言(EL)EL隱含對(duì)象作用域?qū)傩缘腗ap請(qǐng)求參JSP表達(dá)式語言(EL)Scope隱含對(duì)象使用Scope隱含對(duì)象獲取各個(gè)作用域中的屬性,不是屬性對(duì)象的properties為了獲得各個(gè)作用域的properties,需要使用pageContext意思是:pageContext有一個(gè)requestproperty,request有一個(gè)methodproperty請(qǐng)求參數(shù)對(duì)于特定參數(shù)名只有一個(gè)參數(shù)值時(shí)用param隱含對(duì)象對(duì)于特定參數(shù)名有多個(gè)參數(shù)值時(shí)用paramValues隱含對(duì)象JSP表達(dá)式語言(EL)Scope隱含對(duì)象JSP表達(dá)式語言(EL)例子:HTMLJSPJSP表達(dá)式語言(EL)例子:JSP表達(dá)式語言(EL)獲得服務(wù)器主機(jī)信息使用HttpServletRequest對(duì)象的getHeader(String)方法使用隱含對(duì)象header/headerValues獲得cookie獲得上下文初始化參數(shù)DD沒有g(shù)etCookie(cookieName)方法!JSP表達(dá)式語言(EL)獲得服務(wù)器主機(jī)信息沒有g(shù)etCookJSP表達(dá)式語言(EL)在EL中使用其它操作符算術(shù)操作符+,-,*,/(div),%(mod)邏輯操作符&&(and),||(or),!(not)關(guān)系操作符==(eq),!=(ne),<(lt),>(gt),<=(le),>=(ge)例子JSP表達(dá)式語言(EL)在EL中使用其它操作符JSP表達(dá)式語言(EL)Servlet代碼JSP代碼falsetruefalsetruefalsetruefalseInfinity“num”屬性自動(dòng)轉(zhuǎn)換成intInteger自動(dòng)轉(zhuǎn)換成它的原類型優(yōu)先級(jí):從左到右在標(biāo)簽中可以使用ELJSP表達(dá)式語言(EL)Servlet代碼falsetrueinclude標(biāo)準(zhǔn)動(dòng)作重用代碼段的兩種方法Include指令I(lǐng)nclude標(biāo)準(zhǔn)動(dòng)作例子需復(fù)用的JSP文件Header.jsp使用兩種方法復(fù)用Header.jsp的Contact.jsp二者效果完全相同,但是底層實(shí)現(xiàn)卻不同include標(biāo)準(zhǔn)動(dòng)作重用代碼段的兩種方法include標(biāo)準(zhǔn)動(dòng)作生成的servlet代碼(取自_jspService()方法)Header.jsp使用include指令的JSP使用include標(biāo)準(zhǔn)動(dòng)作的JSPinclude標(biāo)準(zhǔn)動(dòng)作生成的servlet代碼(取自_jspinclude標(biāo)準(zhǔn)動(dòng)作異同點(diǎn)Include指令在轉(zhuǎn)換JSP頁面時(shí)將Header.jsp源碼插入客戶端請(qǐng)求Contact.jsp頁面,容器讀取Contact.jsp并開始一個(gè)轉(zhuǎn)換過程容器看到include指令,將Header.jsp和Contact.jsp的源代碼組合在一起,并把它轉(zhuǎn)換成servlet的Java源文件容器將轉(zhuǎn)換而來的源文件編譯成servlet類。此后與其他servlet運(yùn)行過程相同。以前的步驟不會(huì)再進(jìn)行。include標(biāo)準(zhǔn)動(dòng)作異同點(diǎn)客戶端請(qǐng)求Contact.jspinclude標(biāo)準(zhǔn)動(dòng)作Include標(biāo)準(zhǔn)動(dòng)作在運(yùn)行時(shí)將Header.jsp的響應(yīng)插入客戶端請(qǐng)求Contact.jsp頁面,容器讀取Contact.jsp并開始一個(gè)轉(zhuǎn)換過程容器看到include標(biāo)準(zhǔn)動(dòng)作,并使用它在生成的servlet代碼中插入一個(gè)方法調(diào)用,該方法調(diào)用可以在運(yùn)行時(shí)動(dòng)態(tài)地將Header.jsp的響應(yīng)加入Contact.jsp的響應(yīng)中。容器為兩個(gè)JSP都生成servlet容器將轉(zhuǎn)換而來的源文件編譯成servlet類。生成的servlet類文件加載到容器的虛擬機(jī)中并初始化。然后,容器為請(qǐng)求分配一個(gè)線程并調(diào)用JSP的_jspService()方法Contactservlet調(diào)用執(zhí)行動(dòng)態(tài)include的方法,依不同產(chǎn)品實(shí)現(xiàn)的方法不同。include標(biāo)準(zhǔn)動(dòng)作Include標(biāo)準(zhǔn)動(dòng)作在運(yùn)行時(shí)將Heainclude標(biāo)準(zhǔn)動(dòng)作使用<jsp:param>定制嵌入的頁面的內(nèi)容在源頁面和嵌入的頁面之間傳遞請(qǐng)求參數(shù)<jsp:include>標(biāo)簽可以有內(nèi)容,在其中添加嵌入的頁面可用的請(qǐng)求參數(shù)主頁面嵌入的文件只能用于include標(biāo)準(zhǔn)動(dòng)作,不能用于include指令include標(biāo)準(zhǔn)動(dòng)作使用<jsp:param>定制嵌入的頁forward標(biāo)準(zhǔn)動(dòng)作<jsp:forwardpage=“target.jsp”/>作用相當(dāng)于RequestDispatcherBuffer在forward發(fā)生之前就被清空了例子使用forward標(biāo)準(zhǔn)動(dòng)作的頁面Hello.jsp請(qǐng)求轉(zhuǎn)發(fā)至的頁面HandleIt.jspforward標(biāo)準(zhǔn)動(dòng)作<jsp:forwardpage=“思考與討論題JavaBean標(biāo)準(zhǔn)動(dòng)作的使用方法JavaBean標(biāo)準(zhǔn)動(dòng)作中使用多態(tài)BeanEL的語法“.”和“[]”的區(qū)別EL的隱含對(duì)象Include指令和標(biāo)準(zhǔn)動(dòng)作的異同思考與討論題JavaBean標(biāo)準(zhǔn)動(dòng)作的使用方法主要內(nèi)容JSTL核心tag變量相關(guān)tag流控制tagURL管理tag其它tag主要內(nèi)容JSTL核心tag概述需求創(chuàng)建自己的動(dòng)作盡量避免在JSP中編碼腳本將頁面設(shè)計(jì)與Java編碼工作分離方案標(biāo)準(zhǔn)的定制化標(biāo)簽庫:JSPStandardTagLibrary直接使用J2EE提供的JSTL標(biāo)簽避免編寫定制化標(biāo)簽處理器完全自定義的標(biāo)簽庫需要自己編寫定制化標(biāo)簽處理器部署自己編寫的標(biāo)簽使用自己編寫的標(biāo)簽概述需求<c:out>標(biāo)簽格式化輸出處理特異化字符實(shí)際得到想得到顯示效果顯示效果pageContent是一個(gè)Bean類型的屬性,它有一個(gè)名為currentTip的property,值為“<b></b>tagsmakethingsbold”<c:out>標(biāo)簽格式化輸出實(shí)際得到想得到顯示效果顯示效果p<c:out>標(biāo)簽顯式地聲明特異字符的轉(zhuǎn)換方式:使用c:out的escapeXml屬性設(shè)置值為true表示上表中的字符轉(zhuǎn)換成對(duì)應(yīng)的實(shí)體碼設(shè)置值為false表示把字符以HTML方式解析并顯示缺省值為truec:out的安全價(jià)值:輸出所有用戶字符串時(shí)使用c:out標(biāo)簽,設(shè)定escapeXml=true,避免不良腳本運(yùn)行的機(jī)會(huì)顯示效果<c:out>標(biāo)簽顯式地聲明特異字符的轉(zhuǎn)換方式:使用c:ou<c:out>標(biāo)簽為Null值提供缺省的輸出Null值渲染成空字符為c:out標(biāo)簽使用default屬性定義缺省輸出還可以這樣表示:顯示成如果value屬性為null,則使用缺省值作為輸出<c:out>標(biāo)簽為Null值提供缺省的輸出顯示成如果val<c:forEach>標(biāo)簽在一個(gè)集合上迭代,每次對(duì)應(yīng)一個(gè)集合元素把集合中的每個(gè)元素賦予用var屬性定義的變量每輪迭代變量的值會(huì)改變,保存集合中的每個(gè)元素,其作用域?yàn)闃?biāo)簽內(nèi)部集合,可以是:數(shù)組、Collection、Map、用逗號(hào)分割的字符串等<c:forEach>標(biāo)簽在一個(gè)集合上迭代,每次對(duì)應(yīng)一個(gè)集合<c:forEach>標(biāo)簽使用varStatus屬性varStatus屬性創(chuàng)建了一個(gè)新變量,它是一個(gè)javax.servlet.jsp.jstl.core.LoopTagStatus對(duì)象LoopTagStatus類有一個(gè)count成員變量,作用是給出當(dāng)前迭代記數(shù)值<c:forEach>標(biāo)簽使用varStatus屬性<c:forEach>標(biāo)簽<c:forEach>標(biāo)簽的begin,end屬性用于選擇集合的一個(gè)子集作為迭代集<c:forEach>標(biāo)簽的step屬性用于跳過特定元素<c:forEach>標(biāo)簽<c:forEach>標(biāo)簽的beg<c:if>標(biāo)簽設(shè)定條件按照test屬性的值是否為true有條件地執(zhí)行標(biāo)簽體JSPinputComments.jsp<c:if>標(biāo)簽設(shè)定條件<c:choose>標(biāo)簽<c:choose>和<c:when><c:otherwise>一起組成if…elseif…else結(jié)構(gòu)<c:choose>標(biāo)簽<c:choose>和<c:when<c:set>標(biāo)簽設(shè)置beanproperty、Map、屬性變量的值有var屬性的<c:set>標(biāo)簽沒有標(biāo)簽體有標(biāo)簽體可選屬性,設(shè)定變量的范圍如果在指定的作用域中沒有指定的屬性,則創(chuàng)建一個(gè)(假設(shè)value屬性不為空)按照value屬性計(jì)算結(jié)果的類型,自動(dòng)設(shè)定var屬性的類型計(jì)算標(biāo)簽體的值,并把它設(shè)置成var變量的值如果value計(jì)算結(jié)果為null,變量將被移除<c:set>標(biāo)簽設(shè)置beanproperty、Map、屬<c:set>標(biāo)簽有target屬性的<c:set>標(biāo)簽沒有標(biāo)簽體有標(biāo)簽體如果target是一個(gè)Map,設(shè)置鍵值為“dogName”的元素值target必須不為空如果target是一個(gè)bean,設(shè)置property“dogName”的值可以是字符串或表達(dá)式必須是對(duì)象,不能是屬性的“id”名<c:set>標(biāo)簽有target屬性的<c:set>標(biāo)簽如果<c:set>標(biāo)簽注意事項(xiàng)不能同時(shí)使用“var”和“target”屬性Scope是可選的,缺省值為page作用域如果“value”為空,則“var”命名的屬性將被移除如果“var”命名的屬性不存在,它就被創(chuàng)建,但前提是“value”不為空如果“target”表達(dá)式為空,容器拋出異常“target”不能設(shè)置成屬性名,而是實(shí)際的屬性對(duì)象如果“target”表達(dá)式不是Map或Bean,容器拋出異常如果“target”表達(dá)式是一個(gè)bean,但是bean不具有“property”定義的成員變量,容器拋出異常。<c:set>標(biāo)簽注意事項(xiàng)<c:remove>標(biāo)簽用于移除一個(gè)屬性Var屬性必須是字符串!不能是一個(gè)表達(dá)式可選的,但是如果不寫,則移除所有作用域中的屬性結(jié)果:userStatus已經(jīng)移除,所以此后的EL表達(dá)式不會(huì)打印任何東西<c:remove>標(biāo)簽用于移除一個(gè)屬性Var屬性必須是字符<c:import>標(biāo)簽三種添加外部資源的方法Include指令靜態(tài)的:在JSP轉(zhuǎn)換成Java代碼的時(shí)候,從file屬性指定的文件中向當(dāng)前頁面添加內(nèi)容Include標(biāo)準(zhǔn)動(dòng)作動(dòng)態(tài)的:在請(qǐng)求的時(shí)候,從page屬性指定的頁面中向當(dāng)前頁面添加內(nèi)容<c:import>JSTL標(biāo)簽動(dòng)態(tài)的:在請(qǐng)求的時(shí)候,從URL屬性指定的資源向當(dāng)前頁面添加內(nèi)容。與<jsp:include>相似,但是更加強(qiáng)大和靈活,URL可以來自容器外部<c:import>標(biāo)簽三種添加外部資源的方法<c:import>標(biāo)簽定制添加的內(nèi)容JSPHeader.jsp<c:import>標(biāo)簽定制添加的內(nèi)容<c:url>標(biāo)簽復(fù)習(xí):servletURL重寫獲取session在URL后面附加sessionID信息在value中設(shè)置的URL后添加JSESSIONID在JSP中進(jìn)行URL重寫<c:url>標(biāo)簽復(fù)習(xí):servletURL重寫獲取ses<c:url>標(biāo)簽使用<c:url>處理參數(shù)用HTTP請(qǐng)求的get方法傳遞參數(shù)處理url編碼問題url中應(yīng)避免不安全的或保留的字符,如空格用“+”替換在<c:url>標(biāo)簽體中使用<c:param>結(jié)果是:<c:url>標(biāo)簽使用<c:url>處理參數(shù)結(jié)果是:<c:url>標(biāo)簽使用var屬性可選屬性,將URL值賦予一個(gè)變量,以后使用<c:url>標(biāo)簽使用var屬性<c:catch>標(biāo)簽JSP錯(cuò)誤處理使用page指令的isErrorPage和errorPage屬性errorPage.jspbadPage.jsp<c:catch>標(biāo)簽JSP錯(cuò)誤處理<c:catch>標(biāo)簽在DD中為整個(gè)web應(yīng)用配置錯(cuò)誤頁面使用<exception-type>使用<error-code>在錯(cuò)誤頁中使用隱含對(duì)象exception處理異??梢栽谔囟↗SP中使用page指令的errorPage屬性重載以上定義可以是具體的異常類型必須是絕對(duì)地址,對(duì)應(yīng)web應(yīng)用的根<c:catch>標(biāo)簽在DD中為整個(gè)web應(yīng)用配置錯(cuò)誤頁面可<c:catch>標(biāo)簽使用<c:catch>標(biāo)簽捕獲和處理異常拋出的異常被捕獲,不會(huì)觸發(fā)錯(cuò)誤頁結(jié)果:<c:catch>標(biāo)簽使用<c:catch>標(biāo)簽捕獲和處理異<c:catch>標(biāo)簽使用<c:catch>的var屬性只有<%@pageisErrorPage=“true”%>的頁面才可以使用exception隱含對(duì)象如何在引起錯(cuò)誤的頁面中處理異常?創(chuàng)建了一個(gè)頁面范圍內(nèi)的屬性,并將exception對(duì)象賦予它“myException”屬性是一個(gè)exception對(duì)象,實(shí)現(xiàn)了Throwable接口,所以可以調(diào)用它的getMessage()方法<c:catch>標(biāo)簽使用<c:catch>的var屬性創(chuàng)建JSPTag家族JSPTag家族JSPTag家族The“Formatting”libraryInternationalization<fmt:message><fmt:setLocale><fmt:bundle><fmt:setBundle><fmt:param><fmt:requestEncoding>Formatting<fmt:timeZone><fmt:setTimeZone><fmt:formatNumber><fmt:parseNumber><fmt:parseDate>JSPTag家族The“Formatting”librJSPTag家族The“SQL”libraryDatabaseaccess<sql:query><sql:update><sql:setDataSource><sql:param><sql:dateParam>JSPTag家族The“SQL”libraryJSPTag家族The“XML”libraryCoreXMLactions<x:parse><x:out><x:set>XMLflowcontrol<x:if><x:choose><x:when><x:otherwise><x:forEach>Transformactions<x:transform><x:param>JSPTag家族The“XML”libraryJSPTag家族The“function”libraryCollectionlengthlengthStringmanipulationtoUpperCase,toLowerCasesubstring,substringAfter,substringBeforetrimreplaceindexOf,startsWith,endsWith,contains,containsIgnoreCasesplit,joinescapeXmlJSPTag家族The“function”librar主要內(nèi)容自定義Tag開發(fā)TagFiles如何使用自定義TagTag處理器SimpleTag處理器ClassicTag處理器Tag的嵌套訪問主要內(nèi)容自定義Tag開發(fā)TagFiles概述什么是定制的標(biāo)簽(CustomTag)是一種用戶自定義的JSP語言元素容器將JSP轉(zhuǎn)化成servlet時(shí),Tag被轉(zhuǎn)化成對(duì)Tag處理器的操作運(yùn)行時(shí),容器調(diào)用這些操作也稱為自定義標(biāo)簽自定義標(biāo)簽的特點(diǎn)可以通過調(diào)用它的頁面?zhèn)鬟f來的屬性進(jìn)行定制化可以向調(diào)用它的頁面?zhèn)骰刈兞靠梢栽L問JSP頁面可用的所有對(duì)象可以互相通信可以嵌套,并通過私有變量通信概述什么是定制的標(biāo)簽(CustomTag)概述創(chuàng)建tag處理器的方法TagFiles用于開發(fā)展現(xiàn)為中心的自定義Tag可利用已經(jīng)存在的標(biāo)簽庫可供不懂Java的頁面編輯人員使用被容器轉(zhuǎn)化成simpletag處理器SimpleTags只能用于在屬性值或tag體中不使用腳本的tag中ClassicTags只能用于在屬性值或tag體中需要使用腳本的tag中概述創(chuàng)建tag處理器的方法TagFiles復(fù)習(xí):向JSP中動(dòng)態(tài)添加可復(fù)用的內(nèi)容<jsp:include><c:import>通過<jsp:param>和<c:param>創(chuàng)建嵌入的文件可以使用的請(qǐng)求參數(shù),這樣可以定制嵌入的文件的行為問題只是為了給嵌入的文件一些客戶化信息,就創(chuàng)建新的請(qǐng)求參數(shù)?請(qǐng)求參數(shù)能否將客戶發(fā)送的表單中的數(shù)據(jù)作為請(qǐng)求的一部分?應(yīng)用會(huì)經(jīng)常添加或變更請(qǐng)求參數(shù),用它們給嵌入的文件傳值是否清晰?怎樣使嵌入的內(nèi)容容易理解?TagFiles復(fù)習(xí):向JSP中動(dòng)態(tài)添加可復(fù)用的內(nèi)容TagFiles使用TagFile將需嵌入的文件擴(kuò)展名改為.tagHeader.tag將以上tag文件放到一個(gè)目錄下,如WEB-INF/tags在源JSP中使用taglib指令,并調(diào)用tagTag文件存放的位置Tag的名字就是tag文件的文件名TagFiles使用TagFileTag文件存放的位置TTagFiles給tagflie傳遞數(shù)據(jù)使用tag的屬性在JSP中調(diào)用tag在Tag文件Header.tag中使用屬性問題使用tag時(shí),如何快速知曉屬性名?屬性是可選的還是必需的?屬性只能是一個(gè)字符串文本嗎?能不能用表達(dá)式?Tag屬性的作用域限制在Tag內(nèi)部TagFiles給tagflie傳遞數(shù)據(jù)Tag屬性的作用TagFiles屬性指令Header.tag使用tag的JSP頁面屬性是必需的屬性可以是字符串文本或表達(dá)式TagFiles屬性指令屬性是必需的屬性可以是字符串文本或TagFiles使用tag體傳遞大段文本在JSP中調(diào)用tagTagFile:Header.tag被替換成tagbody中的內(nèi)容TagFiles使用tag體傳遞大段文本被替換成tagbTagFiles使用tag指令的body-content屬性聲明tag體的內(nèi)容屬性值scriptless:缺省值,表示不能有腳本元素。腳本元素是Java代碼片斷(<%...%>);表達(dá)式(<%=…%>);和聲明(<%!...%>)empty:tag體中不能有內(nèi)容tagdependent:將tag體看作純文本,EL,tags和腳本將不被求值TagFiles使用tag指令的body-content屬例子:在JSP中調(diào)用tagTagFile:Header.tagTagFiles例子:TagFilesTagFiles容器查找Tag文件的方法WEB-INF/tags目錄WEB-INF/tags的子目錄WEB-INF/lib目錄的JAR文件中的META-INF/tags目錄WEB-INF/lib目錄的JAR文件中的META-INF/tags的子目錄如果tag文件部署在JAR文件中,則對(duì)應(yīng)該tag文件必須有一個(gè)TLD為什么不統(tǒng)一使用TLD聲明tag?必須有一個(gè)TLD與之對(duì)應(yīng)TagFiles容器查找Tag文件的方法必須有一個(gè)TLD與如何使用自定義Tag認(rèn)識(shí)TagLibraryDescriptor(TLD)TLD描述了EL函數(shù)(ELfunctions)自定義Tag用EL函數(shù)擴(kuò)展EL的功能通過EL表達(dá)式調(diào)用一個(gè)POJO上的靜態(tài)方法通過四個(gè)步驟完成寫一個(gè)具有公共靜態(tài)方法的Java類寫TLD文件,它實(shí)現(xiàn)了定義函數(shù)功能的Java類到調(diào)用函數(shù)的JSP頁面間的映射在JSP中使用taglib指令使用EL調(diào)用該函數(shù)如何使用自定義Tag認(rèn)識(shí)TagLibraryDescri如何使用自定義Tag功能方法必須是公共靜態(tài)的函數(shù)名rollIt()來自于TLD中的name,而不是實(shí)際Java類中的方法名uri屬性將TLD的名字告訴容器,以便容器知道JSP調(diào)用EL函數(shù)時(shí)應(yīng)調(diào)用哪個(gè)Java方法如何使用自定義Tag功能方法必須是公共靜態(tài)的函數(shù)名rollI如何使用自定義Tag部署EL函數(shù)提供函數(shù)方法的Java類必須能被Web應(yīng)用的各部分訪問到,所以應(yīng)該部署到WEB-INF/classes目錄中TLD文件放在WEB-INF目錄或其子目錄中,并保證JSP中的taglib指令的uri屬性與TLD的<rui>元素匹配調(diào)用EL函數(shù)的JSP頁面聲明了函數(shù)類,方法簽名和函數(shù)名的TLD定義了函數(shù)功能的Java類如何使用自定義Tag部署EL函數(shù)調(diào)用EL函數(shù)的JSP頁面聲明說明“user”屬性是一個(gè)運(yùn)行時(shí)表達(dá)式屬性(即不能是字符串文本)。如果值為“false”或不定義該元素,則只能使用字符串文本作為屬性值如何使用自定義Tag用TLD描述自定義Tag該tag(不是值)是強(qiáng)制性的,指明tag庫的版本強(qiáng)制性的,主要為工具使用在taglib指令中使用的唯一名字必需的,在tag中使用,如<my:advice>可選的必需的,當(dāng)JSP中使用tag時(shí),容器調(diào)用該類必需的,說明tag體為空如果tag有屬性,則每個(gè)tag屬性必須有一個(gè)<attribute>元素說明“user”屬性是一個(gè)運(yùn)行時(shí)表達(dá)式屬性(即不能是字符串文如何使用自定義Tag使用自定義tag使用SimpleTag的JSP與TLD中的<uri>元素值匹配此處可以使用EL,因?yàn)?lt;rtexprevalue>的值為“true”(假定“userName”屬性已經(jīng)存在)。屬性值可以是三種表達(dá)式:①EL表達(dá)式;②腳本表達(dá)式,如<mine:adviceuser=‘<%=request.getAttribute(“username”)%>’/>③<jsp:attribute>標(biāo)準(zhǔn)動(dòng)作,如<mine:advice><jsp:attributename=“user”>${userName}</jsp:attribute></mine:advice>TLD定義<body-content>為空時(shí),仍可以使用<jsp:attribute>TLD定義了tag不能有體,所以使用空標(biāo)簽如何使用自定義Tag使用自定義tag與TLD中的<uri>元如何使用自定義Tag自定義tag處理器Simpletag處理器擴(kuò)展了SimpleTagSupport實(shí)現(xiàn)了兩個(gè)關(guān)鍵方法doTag():執(zhí)行實(shí)際工作setUser():接收屬性值的方法當(dāng)JSP使用TLD中定義的名字調(diào)用tag時(shí),容器調(diào)用doTag()方法容器調(diào)用該方法,從tag屬性中設(shè)置值。使用JavaBeanproperty命名規(guī)則:“user”屬性應(yīng)該傳遞給setUser()方法如何使用自定義Tag自定義tag處理器當(dāng)JSP使用TLD中定如何使用自定義TagTag體中的內(nèi)容TLD中<body-content>元素的定義<body-content>empty</body-content>Tag不能有tag體<body-content>scriptless</body-content>tag不能有腳本元素(代碼片斷、腳本表達(dá)式、聲明),但是可以是文字、EL和自定義或標(biāo)準(zhǔn)動(dòng)作<body-content>tagdependent</body-content>tag體被看作純文本,所以EL,tags和動(dòng)作將不被求值<body-content>JSP</body-content>tag體可以是JSP中能使用任何東西如何使用自定義TagTag體中的內(nèi)容如何使用自定義Tag容器怎樣找到TLD建立uri到TLD實(shí)際位置的映射JSP2.0以前,在DD中配置JSP2.0,Web應(yīng)用部署時(shí),容器自動(dòng)在TLD文件和<uri>名字間建立映射,在DD中可以沒有<taglib>條目容器首先查找DD中是否有<taglib>,如果有則使用它創(chuàng)建map如果沒有,則在特定位置查找TLD,并為tag庫建立map如何使用自定義Tag容器怎樣找到TLD如何使用自定義Tag容器在四個(gè)地方尋找TLD文件直接在WEB-INF中找在WEB-INF的子目錄中找在WEB-INF/lib中的JAR文件的META-INF目錄中找在WEB-INF/lib中的JAR文件的META-INF的子目錄中找如何使用自定義Tag容器在四個(gè)地方尋找TLD文件Tag處理器Tag處理器是執(zhí)行tag工作的Java類比EL函數(shù)更強(qiáng)大和靈活Tag處理器類可以訪問tag屬性tag體pagecontext,因此可以獲得各個(gè)作用域中的屬性及請(qǐng)求和響應(yīng)自定義tag處理器分為Classictag處理器JSP2.0以前的tag處理器Simpletag處理器JSP2.0引入的簡單模型,結(jié)合JSTL和TagFile,幾乎可以滿足所有可能遇到的需求Tag處理器Tag處理器是執(zhí)行tag工作的Java類SimpleTag處理器創(chuàng)建一個(gè)SimpleTag處理器寫一個(gè)擴(kuò)展SimpleTagSupport的類重載doTag()方法SimpleTag處理器創(chuàng)建一個(gè)SimpleTag處理器SimpleTag處理器為Tag創(chuàng)建TLD:simple.tldSimpleTag處理器為Tag創(chuàng)建TLD:simpleSimpleTag處理器部署tag處理器和TLD將TLD放到WEB-INF中將tag處理器類按照包結(jié)構(gòu)放到WEB-INF/classes中編寫使用tag的JSP:useTag.jspSimpleTag處理器部署tag處理器和TLDSimpleTag處理器SimpletagAPISimpletag處理器必須實(shí)現(xiàn)SimpleTag接口最簡單的方法是擴(kuò)展SimpleTagSupport類一般只需重載doTag()方法有一些壽命周期方法。當(dāng)tag被調(diào)用時(shí),容器調(diào)用這些方法一般只需要擴(kuò)展該類需要重載工具方法SimpleTag處理器SimpletagAPI有一些SimpleTag處理器Simpletag的壽命周期自己編寫相關(guān)代碼重載該方法處理器獲得到PageContext的一個(gè)引用(PageContext是JspContext的子類)嵌套的tag可以父子之間進(jìn)行通信如果tag有屬性,則調(diào)用每個(gè)屬性的setter方法(這里將處理一個(gè)特殊的異常)如果tag有tag體,則將它封裝成JspFragment的實(shí)例傳到此方法中真正執(zhí)行tag的業(yè)務(wù)邏輯SimpleTag處理器Simpletag的壽命周期自己SimpleTag處理器在tag體中使用EL調(diào)用tag的JSP頁面tag處理器的doTag()方法先設(shè)置屬性然后調(diào)用tag體處理tag體,將它打印到響應(yīng)。null參數(shù)意思是輸出到response對(duì)象上,還可以傳進(jìn)其它writer對(duì)象tag被調(diào)用時(shí),“message”還不是一個(gè)屬性SimpleTag處理器在tag體中使用EL先設(shè)置屬性然后SimpleTag處理器tag體的迭代處理調(diào)用tag的JSP頁面tag處理器的doTag()方法將屬性值設(shè)置成數(shù)組中的下一個(gè)元素值tag被調(diào)用時(shí),“movie”屬性還不存在,tag處理器迭代調(diào)用,并設(shè)置它的值SimpleTag處理器tag體的迭代處理將屬性值設(shè)置成數(shù)SimpleTag處理器處理有屬性的tag需要在TLD中設(shè)置屬性在tag處理器中為每個(gè)屬性提供一個(gè)Bean類型的setter方法例子SimpleTag處理器處理有屬性的tagSimpleTag處理器為屬性寫一個(gè)setter方法。該方法名必須與TLD中的屬性名匹配在TLD中定義屬性SimpleTag處理器為屬性寫一個(gè)setter方法。該方SimpleTag處理器JspFragment類代表了JSP代碼能運(yùn)行并產(chǎn)生輸出容器將tag體封裝成JspFragment,并傳回tag處理器的setJspBody()方法JspFragment不能包含任何腳本元素可以包含文本、標(biāo)準(zhǔn)和自定義動(dòng)作、EL表達(dá)式可以將JspFragment對(duì)象傳給其它對(duì)象,而這些對(duì)象可以調(diào)用JspFragment的getJspContext()方法getJspContext()方法是tag體向其它對(duì)象傳遞信息的媒介如果想獲得tag體的內(nèi)容,可以用invoke(java.io.Writer)方法將內(nèi)容傳給Writer,然后從Writer中獲得內(nèi)容進(jìn)一步處理SimpleTag處理器JspFragment類SimpleTag處理器使用javax.servlet.jsp.SkipPageException中止處理頁面讓tag拋出SkipPageException異常不會(huì)輸出出來SimpleTag處理器使用javax.servlet.jSimpleTag處理器只能中止直接調(diào)用tag的頁面PageA.jsp包含了PageB.jspPageB.jsp調(diào)用tagtag處理器的doTag()方法中止了PageB,但是PageA依然運(yùn)行不會(huì)輸出出來PageA依然運(yùn)行!SimpleTag處理器只能中止直接調(diào)用tag的頁面PagClassicTag處理器Tag處理器APIClassicTag處理器Tag處理器APIClassicTag處理器簡單的Classictag處理器調(diào)用classictag的JSPTLDClassicTag處理器簡單的Classictag處理ClassicTag處理器Classictag處理器擴(kuò)展TagSupport,表示是一個(gè)Classictag處理器重載doStartTag()方法沒有聲明IOException!從TagSupport繼承了pageContext成員變量,而SimpleTag中使用getJspContext()方法必須使用try/catch必須返回一個(gè)int告訴容器下一步該怎么辦。SKIP_BODY表示忽略tag體ClassicTag處理器Classictag處理器擴(kuò)展ClassicTag處理器處理tag體Simpletag處理器在調(diào)用JspFragment的invoke()方法是處理tag體Classictag處理器在doStartTag()和doEndTag()方法之間處理tag體使用tag的JSP方法一:Simpletag處理器ClassicTag處理器處理tag體ClassicTag處理器方法二:Classictag處理器處理tag體Simpletag處理器可以方便迭代處理tag體,但Classictag處理器行嗎?ClassicTag處理器方法二:Classictag處ClassicTag處理器Classictag的壽命周期嵌套的tag可以父子之間進(jìn)行通信如果tag有屬性,則調(diào)用每個(gè)屬性的setter方法doAfterBody()使得可以在tag體運(yùn)行之后做一些工作,不像其它方法,它可以被多次調(diào)用通常在doStartTag()或doAfterBody()之后被調(diào)用一次在tag被第一次調(diào)用時(shí)實(shí)例化,以后容器可以復(fù)用它給處理器一個(gè)到PageContext的引用在doStartTag()和doEndTag()之間處理tag體ClassicTag處理器Classictag的壽命周期ClassicTag處理器壽命周期取決于返回值根據(jù)doStartTag()的返回值,容器判斷是否處理tag體(假設(shè)有)根據(jù)doEndTag()的返回值,容器判斷是否繼續(xù)處理調(diào)用tag的頁面返回值是int型,在Tag和IterationTag接口中定義擴(kuò)展TagSupport時(shí)可能的返回值doStartTag()doAfterBody()doEndTag()SKIP_BODYEVAL_BODY_INCLUDESKIP_BODYEVAL_BODY_AGAINSKIP_PAGEEVAL_PAGE只有它在IterationTag接口中定義,其他都在Tag中定義象在Simpletag中拋出SkipPageException異常一樣ClassicTag處理器壽命周期取決于返回值SKIP_BClassicTag處理器關(guān)系圖ClassicTag處理器關(guān)系圖ClassicTag處理器IterationTag接口用于迭代處理tag體doAfterBody()方法的返回值為EVAL_BODY_AGAIN,則容器再次處理tag體doAfterBody()方法的返回值為SKIP_BODY,則容器調(diào)用doEndTag()方法用Classictag處理器處理Simpletag器迭代處理tag體的例子ClassicTag處理器IterationTag接口用于ClassicTag處理器迭代處理tag體的Classictag處理器代碼doAfterBody()是在tag被處理后調(diào)用的,所以為了避免第一輪“movie”屬性輪空,加入這兩行代碼ClassicTag處理器迭代處理tag體的ClassicClassicTag處理器注意doStartTag()和doEndTag()只運(yùn)行一次如果想讓tag體被處理,必需重載doStartTag()方法Simpletag處理器不被容器復(fù)用,而Classictag處理器可以被容器池化并復(fù)用,所以必須小心實(shí)例變量的值,最好在doStartTag()中重置如果TLD中聲明tag體為空,則doStartTag()方法必須返回SKIP_BODY!ClassicTag處理器注意ClassicTag處理器訪問tag體內(nèi)容通過繼承BodyTagSupport,可以獲得兩個(gè)壽命周期方法setBodyContent(BodyContent)doInitBody()還得到了doStartTag()方法的一個(gè)新的返回值:EVAL_BODY_BUFFERED,它還是缺省值BodyContent實(shí)際是一個(gè)java.io.Writer,所以可以將它轉(zhuǎn)換成其它IO流ClassicTag處理器訪問tag體內(nèi)容ClassicTag處理器實(shí)現(xiàn)BodyTag接口的tag的壽命周期ClassicTag處理器實(shí)現(xiàn)BodyTag接口的tag的Tag的嵌套訪問嵌套tag可以訪問它的父tag一個(gè)嵌套tag用Classictag處理器獲得父tag用Simpletag處理器獲得父tagTag的嵌套訪問嵌套tag可以訪問它的父tag用ClassiTag的嵌套訪問使用getParent()方法,Classictag可以訪問父ClassictagSimpletag既可以訪問父Simpletag,也可以訪問父Classictag例子:子tag訪問父tag的屬性JSPTag的嵌套訪問使用getParent()方法,Tag的嵌套訪問SimpleInnertag處理器ClassicParenttag處理器Tag的嵌套訪問SimpleInnertag處理器Tag的嵌套訪問獲得任意祖先tag使用TagSupport和SimpleTagSupport的findAncestorWithClass()方法起始tag需要定位的tag的類型找到第一個(gè)是指定的類的實(shí)例的tagTag的嵌套訪問獲得任意祖先tag起始tag需要定位的tag思考與討論題TagFile的開發(fā)方法SimpleTag處理器的開發(fā)方法ClassicTag處理器的開發(fā)方法SimpleTag和ClassicTag的壽命周期比較Simpletag處理器與Classictag處理器開發(fā)的異同點(diǎn)如何訪問tag的父及祖先tag思考與討論題TagFile的開發(fā)方法J2EE架構(gòu)與程序設(shè)計(jì)主講:XXX西北工業(yè)大學(xué)軟件與微電子學(xué)院J2EE架構(gòu)與程序設(shè)計(jì)主講:XXX第六章JSP(上)第六章JSP(上)主要內(nèi)容JSP基本語法JSP運(yùn)行機(jī)制JSP壽命周期管理JSP屬性主要內(nèi)容JSP基本語法概述JSP最終以servlet方式在容器中運(yùn)行容器將JSP文件翻譯成servlet類的源文件(.java),然后將其編譯成servletclass以和手工編寫servlet同樣的方式運(yùn)行servlet概述JSP最終以servlet方式在容器中運(yùn)行概述例子JSP:BasicCounter.jsp工具類:Counter.javaJava代碼片斷概述例子Java代碼片斷概述部署方法

Tomcat訪問若將包目錄和類文件放在WEB-INF/classes目錄下,則web應(yīng)用的所有部分都能訪問到它http://localhost:8080/testJSP1/BasicCounter.jsp概述部署方法若將包目錄和類文件放在WEB-INF/classJSP基本語法指令(directive)一個(gè)JSP元素,用來給JSP容器一個(gè)說明,在翻譯的時(shí)候被解釋。有三種JSP指令:page,include,taglibpage指令定義與頁面相關(guān)的屬性,JSP2.0定義了13種屬性import定義將在生成的servlet類中添加的Javaimport語句。缺省情況下自動(dòng)加入:java.lang,javax.servlet,javax.servlet.http,javax.servlet.jspisThreadSafe定義生成的servlet是否實(shí)現(xiàn)SingleThreadModel。缺省值為“true”,表示web應(yīng)用是線程安全的,不需要實(shí)現(xiàn)SingleThreadModel。若值為“false”,表示生成的servlet實(shí)現(xiàn)SingleThreadModelcontentType定義JSP響應(yīng)的MIME類型isELIgnored定義當(dāng)JSP頁面翻譯的時(shí)候,是否EL表達(dá)式被忽略JSP基本語法指令(directive)JSP基本語法isErrorPage定義當(dāng)前的頁面是否為另一個(gè)JSP頁面的錯(cuò)誤頁面。缺省值為“false”。如果值為“true”,頁面可以訪問隱含的exception對(duì)象;否則不能訪問errorPage定義一個(gè)URL資源,未捕獲的異常將發(fā)送到該資源。如果該資源為JSP頁面,則該頁面有一個(gè)isErrorPage=“true”的page指令language定義在腳本、表達(dá)式和聲明中使用的腳本語言,現(xiàn)在其值只能為“java”extends定義本JSP頁面將被容器編譯成的servlet類的超類session定義該JSP頁面是否有一個(gè)隱含的session對(duì)象,缺省為“true”JSP基本語法isErrorPageJSP基本語法buffer定義隱含的out對(duì)象如何處理緩沖,參考JspWriterautoFlush定義緩沖了的輸出是否自動(dòng)提交(flush),缺省值為“true”info定義一個(gè)字符串,它可以放進(jìn)轉(zhuǎn)換后的JSP頁面,并可以通過servlet的getServletInfo()方法獲得pageEncoding定義JSP頁面的字符編碼。缺省值為:“ISO-8859-1”JSP基本語法bufferJSP基本語法例子:使用import屬性導(dǎo)入外部的包導(dǎo)入一個(gè)包導(dǎo)入多個(gè)包注意@符號(hào)用逗號(hào)分隔JSP基本語法例子:使用import屬性導(dǎo)入外部的包注意@符JSP基本語法include指令定義一段文字或代碼,它可以在當(dāng)前頁面被解析時(shí)加入其中增強(qiáng)了代碼的復(fù)用性例如:<%@includefile=”wickedHeader.html”%>taglib指令定義JSP可以使用的標(biāo)簽庫例如:<%@taglibtagdir=”/WEB-INF/tags/cool”prefix=”cool”%>JSP基本語法include指令JSP基本語法表達(dá)式(expression)表達(dá)式在運(yùn)行時(shí)轉(zhuǎn)化成out.print()的參數(shù)不能將返回值為void的方法作為表達(dá)式注意“=”符號(hào)JSP基本語法表達(dá)式(expression)注意“=”符JSP基本語法聲明(declaration)在java代碼片斷(scriptlet)中定義的變量所有的java代碼片斷和表達(dá)式代碼都在一個(gè)service方法中,所以在java代碼片斷中聲明的變量總是本地變量!生成的servlet代碼在:yourTomcatHomeDir/work/Catalina/yourServerName/yourWebAppName/org/apache/jspJSP基本語法聲明(declaration)所有的java代JSP基本語法如何定義靜態(tài)變量?JSP聲明用于聲明生成的servlet類的成員,即變量和方法<%!和%>間的部分將被添加到service方法之外可以定義靜態(tài)變量和方法變量定義注意“!”符號(hào)JSP基本語法如何定義靜態(tài)變量?注意“!”符號(hào)JSP基本語法方法定義JSP基本語法方法定義JSP運(yùn)行機(jī)制容器如何處理JSP查找指令,獲取解析JSP所需的信息創(chuàng)建HttpServlet子類對(duì)于Tomcat5而言,生成的servlet擴(kuò)展如果有一個(gè)具有import屬性的page指令,將import聲明寫在類前面的包聲明之后對(duì)于Tomcat5而言,包聲明為:如果有聲明(declarations),就將它們寫入類文件,通常在類聲明之后,service方法之前創(chuàng)建service方法,方法名為_jspService()。它將被servlet超類的重載service()方法調(diào)用,并接收HttpServletRequest和HttpServletResponse。容器聲明并初始化所有隱含對(duì)象將HTML文本、java代碼片斷、表達(dá)式整理到service方法中,格式化并寫入PrintWriter響應(yīng)輸出JSP運(yùn)行機(jī)制容器如何處理JSPJSP運(yùn)行機(jī)制一個(gè)例子JSP運(yùn)行機(jī)制一個(gè)例子JSP運(yùn)行機(jī)制隱含對(duì)象封裝了其它隱含對(duì)象。通過它可以獲得其他隱含對(duì)象和屬性的引用在errorpage中使用JSP運(yùn)行機(jī)制隱含對(duì)象封裝了其它隱含對(duì)象。通過它可以獲得其他JSP壽命周期管理JSP壽命周期容器實(shí)例化servlet并運(yùn)行jspInit()方法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論