Java-Web程序設(shè)計任務(wù)教程第6章-JSP技課件_第1頁
Java-Web程序設(shè)計任務(wù)教程第6章-JSP技課件_第2頁
Java-Web程序設(shè)計任務(wù)教程第6章-JSP技課件_第3頁
Java-Web程序設(shè)計任務(wù)教程第6章-JSP技課件_第4頁
Java-Web程序設(shè)計任務(wù)教程第6章-JSP技課件_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章JSP技術(shù)JSP運行原理page指令JSP隱式對象forward標(biāo)簽JSP聲明include指令include標(biāo)簽第六章JSP技術(shù)JSP運行原理JSP聲明掌握JSP的基本語法和JSP動作元素的使用13了解JSP的特點及其運行原理2熟悉JSP指令和隱式對象的使用掌握了解熟悉學(xué)習(xí)目標(biāo)掌握JSP的基本語法和13了解JSP的特點2熟悉6.1JSP概述6.2JSP基本語法6.3JSP指令6.4JSP隱式對象?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)6.5JSP動作元素6.6階段案例:傳智書城JSP頁面?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)目錄6.1JSP概述6.2JSP基本語法6.3JSP指令6.4J返回目錄.2什么是JSP編寫第一個JSP文件JSP運行原理6.1JSP概述6.1.3知識架構(gòu)返回目錄.2什么是JSP編寫第一個JSP文件返回目錄6.2.1JSP腳本元素JSP注釋6.2JSP基本語法6.2.2知識架構(gòu)返回目錄6.2.1JSP腳本元素JSP注釋6.2JSP基本返回目錄6.3.1page指令include指令6.3JSP指令6.3.2知識架構(gòu)返回目錄6.3.1page指令include指令6.3JS返回目錄.2隱式對象的概述out對象pageContext對象6.4JSP隱式對象.4exception對象知識架構(gòu)返回目錄.2隱式對象的概述out對象page返回目錄6.5.1<jsp:include>動作元素<jsp:forward>動作元素6.5JSP動作元素6.5.2知識架構(gòu)返回目錄6.5.1<jsp:include>動作元素<jsp返回目錄6.6.1【任務(wù)6-1】實現(xiàn)首頁【任務(wù)6-2】實現(xiàn)注冊頁面6.6階段案例:傳智書城JSP頁面6.6.2知識架構(gòu)返回目錄6.6.1【任務(wù)6-1】實現(xiàn)首頁【任務(wù)6-2】實現(xiàn)注在動態(tài)網(wǎng)頁開發(fā)中,經(jīng)常需要動態(tài)生成HTML內(nèi)容,例如,一篇新聞報道的瀏覽次數(shù)需要動態(tài)生成。這時,如果使用Servlet來實現(xiàn)HTML頁面數(shù)據(jù)的統(tǒng)計,需要調(diào)用大量的輸出語句,使靜態(tài)內(nèi)容和動態(tài)內(nèi)容混合在一起,導(dǎo)致程序非常臃腫。為了克服Servlet的這些缺點,Oracle(Sun)公司推出了JSP技術(shù)。接下來,本章將圍繞JSP技術(shù)進行詳細的講解。JSP技術(shù)在動態(tài)網(wǎng)頁開發(fā)中,經(jīng)常需要動態(tài)生成HTML內(nèi)容,例如,一篇新JSP全名是JavaServerPages,它是建立在Servlet規(guī)范之上的動態(tài)網(wǎng)頁開發(fā)技術(shù)。在JSP文件中,HTML代碼與Java代碼共同存在,其中,HTML代碼用來實現(xiàn)網(wǎng)頁中靜態(tài)內(nèi)容的顯示,Java代碼用來實現(xiàn)網(wǎng)頁中動態(tài)內(nèi)容的顯示。為了與傳統(tǒng)HTML有所區(qū)別,JSP文件的擴展名為.jsp。JSP技術(shù)所開發(fā)的Web應(yīng)用程序是基于Java的,它可以用一種簡捷而快速的方法從Java程序生成Web頁面,其使用上具有如下幾點特征:跨平臺:由于JSP是基于Java語言的,它可以使用JavaAPI,所以它也是跨平臺的,可以應(yīng)用于不同的系統(tǒng)中,如Windows、Linux等。當(dāng)從一個平臺移植到另一個平臺時,JSP和JavaBean的代碼并不需要重新編譯,這是因為Java的字節(jié)碼是與平臺無關(guān)的,這也應(yīng)驗了Java語言“一次編譯,到處運行”的特點。JSP概述6.1JSP概述JSP全名是JavaServerPages,它是建立在S業(yè)務(wù)代碼相分離:在使用JSP技術(shù)開發(fā)Web應(yīng)用時,可以將界面的開發(fā)與應(yīng)用程序的開發(fā)分離開。開發(fā)人員使用HTML來設(shè)計界面,使用JSP標(biāo)簽和腳本來動態(tài)生成頁面上的內(nèi)容。在服務(wù)器端,JSP引擎(或容器,本書中指Tomcat)負責(zé)解析JSP標(biāo)簽和腳本程序,生成所請求的內(nèi)容,并將執(zhí)行結(jié)果以HTML頁面的形式返回到瀏覽器。組件重用:JSP中可以使用JavaBean編寫業(yè)務(wù)組件,也就是使用一個JavaBean類封裝業(yè)務(wù)處理代碼或者作為一個數(shù)據(jù)存儲模型,在JSP頁面中,甚至在整個項目中,都可以重復(fù)使用這個JavaBean,同時,JavaBean也可以應(yīng)用到其他Java應(yīng)用程序中。預(yù)編譯:預(yù)編譯就是在用戶第一次通過瀏覽器訪問JSP頁面時,服務(wù)器將對JSP頁面代碼進行編譯,并且僅執(zhí)行一次編譯。編譯好的代碼將被保存,在用戶下一次訪問時,會直接執(zhí)行編譯好的代碼。這樣不僅節(jié)約了服務(wù)器的CPU資源,還大大的提升了客戶端的訪問速度。6.1JSP概述業(yè)務(wù)代碼相分離:在使用JSP技術(shù)開發(fā)Web應(yīng)用時,可以將界面

接下來,通過一個案例來演示第一個JSP文件的創(chuàng)建過程,請查看教材6.1.2小節(jié)。案例代碼6.1JSP概述接下來,通過一個案例來演示第一個JSP文件的創(chuàng)JSP的工作模式是請求/響應(yīng)模式,客戶端首先發(fā)出HTTP請求,JSP程序收到請求后進行處理并返回處理結(jié)果。在一個JSP文件第一次被請求時,JSP引擎(容器)把該JSP文件轉(zhuǎn)換成為一個Servlet,而這個引擎本身也是一個Servlet。JSP的運行過程如圖所示。JSP運行原理6.1JSP概述JSP的工作模式是請求/響應(yīng)模式,客戶端首先發(fā)出HTTP請求JSP的運行過程具體如下:(1)客戶端發(fā)出請求,請求訪問JSP文件。(2)JSP容器先將JSP文件轉(zhuǎn)換成一個Java源文件(JavaServlet源程序),在轉(zhuǎn)換過程中,如果發(fā)現(xiàn)JSP文件中存在任何語法錯誤,則中斷轉(zhuǎn)換過程,并向服務(wù)端和客戶端返回出錯信息。(3)如果轉(zhuǎn)換成功,則JSP容器將生成的Java源文件編譯成相應(yīng)的字節(jié)碼文件*.class。該class文件就是一個Servlet,Servlet容器會像處理其他Servlet一樣來處理它。(4)由Servlet容器加載轉(zhuǎn)換后的Servlet類(.class文件)創(chuàng)建一個該Servlet(JSP頁面的轉(zhuǎn)換結(jié)果)實例,并執(zhí)行Servlet的jspInit()方法。jspInit()方法在Servlet的整個生命周期中只會執(zhí)行一次。6.1JSP概述JSP的運行過程具體如下:6.1JSP概述(5)執(zhí)行jspService()方法來處理客戶端的請求。對于每一個請求,JSP容器都會創(chuàng)建一個新的線程來處理它。如果多個客戶端同時請求該JSP文件,則JSP容器也會創(chuàng)建多個線程,使得每一個客戶端請求都對應(yīng)一個線程。JSP運行過程中采用的這種多線程的執(zhí)行方式可以極大地降低對系統(tǒng)資源的需求,提高系統(tǒng)的并發(fā)量并縮短響應(yīng)時間。需要注意的是,由于第(4)步生成的Servlet是常駐內(nèi)存的,所以響應(yīng)速度非??臁#?)如果JSP文件被修改了,則服務(wù)器將根據(jù)設(shè)置決定是否對該文件重新編譯,如果需要重新編譯,則使用重新編譯后的結(jié)果取代內(nèi)存中常駐的Servlet,并繼續(xù)上述處理過程。(7)雖然JSP效率很高,但在第一次調(diào)用的時候往往由于需要轉(zhuǎn)換和編譯,所以會產(chǎn)生一些輕微的延遲。此外,由于系統(tǒng)資源不足等原因,JSP容器可能會以某種不確定的方式將Servlet從內(nèi)存中移除,發(fā)生這種情況時首先會調(diào)用jspDestroy()方法,然后Servlet實例會被加入“垃圾收集”處理。6.1JSP概述(5)執(zhí)行jspService()方法來處理客戶端的請求。對(8)當(dāng)請求處理完成后,響應(yīng)對象由JSP容器接收,并將HTML格式的響應(yīng)信息發(fā)送回客戶端。了解了JSP的運行原理后,完全可以利用其中的一些步驟來做一些工作,如:可以在jspInit()中進行一些初始化工作(建立數(shù)據(jù)庫的連接、建立網(wǎng)絡(luò)連接、從配置文件中獲取一些參數(shù)等),可以在jspDestroy()中釋放相應(yīng)的資源等。

為了使讀者更容易理解JSP的運行原理,接下來簡單介紹分析一下JSP所生成的Servlet代碼,請查看教材6.1.3小節(jié)。案例代碼6.1JSP概述(8)當(dāng)請求處理完成后,響應(yīng)對象由JSP容器接收,并將HTMJSP腳本元素是指嵌套在<%和%>之中的一條或多條Java程序代碼。通過JSP腳本元素可以將Java代碼嵌入HTML頁面中,所有可執(zhí)行的Java代碼,都可以通過JSP腳本來執(zhí)行。JSP腳本元素主要包含如下三種類型:JSPScriptletsJSP聲明語句JSP表達式JSP腳本元素6.2JSP基本語法JSP腳本元素是指嵌套在<%和%>之中的一條或多條Java程1、JSPScriptletsJSPScriptlets是一段代碼段。當(dāng)需要使用Java實現(xiàn)一些復(fù)雜操作或控制時,可以使用它。JSPScriptlets的語法格式如下所示:在JSPScriptlets中聲明的變量是JSP頁面的局部變量,調(diào)用JSPScriptlets時,會為局部變量分配內(nèi)存空間,調(diào)用結(jié)束后,釋放局部變量占有的內(nèi)存空間。2、JSP聲明語句JSP的聲明語句用于聲明變量和方法,它以“<%!”開始,以“%>”結(jié)束,其語法格式如下所示:6.2JSP基本語法1、JSPScriptlets6.2JSP基本語法在上述語法格式中,被聲明的Java代碼將被編譯到Servlet的_jspService()方法之外,即在JSP聲明語句中定義的都是成員方法、成員變量、靜態(tài)方法、靜態(tài)變量、靜態(tài)代碼塊等。在JSP聲明語句中聲明的方法在整個JSP頁面內(nèi)有效,但是在方法內(nèi)定義的變量只在該方法內(nèi)有效。當(dāng)聲明的方法被調(diào)用時,會為方法內(nèi)定的變量分配內(nèi)存,而調(diào)用結(jié)束后立刻會釋放所占的內(nèi)存。

接下來,通過一個案例來演示JSPScriptlets和聲明語句的使用,請查看教材文件6-1。案例代碼6.2JSP基本語法接下來,通過一個案例來演示JSPScriptl需要注意的是,<%!和%>里面定義的屬性是成員屬性,相當(dāng)于類的屬性,方法相當(dāng)于是全局的方法,也相當(dāng)于是類里面的方法,但是它是不可以進行輸出的,因為它只是進行方法的定義和屬性的定義。<%和%>可以進行屬性的定義,也可以輸出內(nèi)容,但是它不可以進行方法的定義。因為這對標(biāo)簽里面的內(nèi)容是在此jsp被編譯為servlet的時候,放在_jspService()方法里面的,這個方法就是服務(wù)器向客戶端輸出內(nèi)容的地方,它本身就是一個方法,所以如果在它里面定義方法的話,那么就相當(dāng)于是在類的方法里面嵌套定義了方法,這在java里面是不允許的。但是可以在里面定義自己的私有變量,因為方法里面也可以定義變量,也可以調(diào)用方法,唯獨不可以再定義方法了??傊?,<%!和%>是用來定義成員變量屬性和方法的,<%和%>主要是用來輸出內(nèi)容的,因此如果涉及到了成員變量的操作,那么就應(yīng)該使用<%!和%>,而如果是涉及到了輸出內(nèi)容的時候,就使用<%和%>。6.2JSP基本語法需要注意的是,<%!和%>里面定義的屬性是成員屬性,相當(dāng)于類3、JSP表達式JSP表達式(expression)用于將程序數(shù)據(jù)輸出到客戶端,它將要輸出的變量或者表達式直接封裝在以“<%=”開頭和以“%>”結(jié)尾的標(biāo)記中,其基本的語法格式如下所示:

在上述語法格式中,JSP表達式中的變量或表達式的計算結(jié)果將被轉(zhuǎn)換成一個字符串,然后插入到JSP頁面輸出結(jié)果的相應(yīng)位置處。例如,對example01.jsp文件進行修改,將<body>內(nèi)的腳本元素修改為表達式,具體如下。6.2JSP基本語法3、JSP表達式6.2JSP基本語法同其他各種編程語言一樣,JSP也有自己的注釋方式,其基本語法格式如下:

需要注意的是,Tomcat在將JSP頁面編譯成Servlet程序時,會忽略JSP頁面中被注釋的內(nèi)容,不會將注釋信息發(fā)送到客戶端。JSP注釋

接下來,通過一個案例來演示JSP注釋的使用,請查看教材文件6-2。案例代碼6.2JSP基本語法同其他各種編程語言一樣,JSP也有自己的注釋方式,其基本語法在JSP頁面中,經(jīng)常需要對頁面的某些特性進行描述,例如,頁面的編碼方式,JSP頁面采用的語言等,這時,可以通過page指令來實現(xiàn)。page指令的具體語法格式如下所示:在上面的語法格式中,page用于聲明指令名稱,屬性用來指定JSP頁面的某些特性。page指令提供了一系列與JSP頁面相關(guān)的屬性,如下表所示。page指令6.3JSP指令在JSP頁面中,經(jīng)常需要對頁面的某些特性進行描述,例如,頁面表中列舉了page指令的常見

屬性,其中,除了import屬

性外,其他的屬性都只能出

現(xiàn)一次,否則會編譯失敗。

需要注意的是,page指令的

屬性名稱都是區(qū)分大小寫的。6.3JSP指令6.3JSP指令下面列舉兩個使用page指令的示例:上面代碼中使用了page指令的language、contentType、pageEncoding和import屬性。需要注意的是,page指令對整個頁面都有效,而與其書寫的位置無關(guān),但是習(xí)慣上把page指令寫在JSP頁面的最前面。6.3JSP指令下面列舉兩個使用page指令的示例:6.3JSP指令在實際開發(fā)時,有時需要在JSP頁面靜態(tài)包含一個文件,例如HTML文件,文本文件等,這時,可以通過include指令來實現(xiàn),include指令的具體語法格式如下所示:include指令只有一個file屬性,該屬性用來指定插入到JSP頁面目標(biāo)位置的文件資源。需要注意的是,插入文件的路徑一般不以“/”開頭,而是使用相對路徑。include指令

接下來,通過一個案例來學(xué)習(xí)include指令的具體用法,請查看教材文件6-3~6-4。案例代碼6.3JSP指令在實際開發(fā)時,有時需要在JSP頁面靜態(tài)包含一個文件,例如HT關(guān)于include指令的具體應(yīng)用,有很多問題需要注意,接下來,將這些問題進行列舉,具體如下:

被引入的文件必須遵循JSP語法,其中的內(nèi)容可以包含靜態(tài)HTML、JSP腳本元素和JSP指令等普通JSP頁面所具有的一切內(nèi)容。除了指令元素之外,被引入的文件中的其他元素都被轉(zhuǎn)換成相應(yīng)的Java源代碼,然后插入進當(dāng)前JSP頁面所翻譯成的Servlet源文件中,插入位置與include指令在當(dāng)前JSP頁面中的位置保持一致。file屬性的設(shè)置值必須使用相對路徑,如果以“/”開頭,表示相對于當(dāng)前Web應(yīng)用程序的根目錄(注意不是站點根目錄),否則,表示相對于當(dāng)前文件。需要注意的是,這里的file屬性指定的相對路徑是相對于文件(file),而不是相對于頁面(page)。6.3JSP指令關(guān)于include指令的具體應(yīng)用,有很多問題需要注意,接下來在JSP頁面中,有一些對象需要頻繁使用,如果每次都重新創(chuàng)建這些對象則會非常麻煩。為了簡化Web應(yīng)用程序的開發(fā),JSP2.0規(guī)范中提供了9個隱式(內(nèi)置)對象,它們是JSP默認創(chuàng)建的,可以直接在JSP頁面中使用。這9個隱式對象的名稱、類型和描述如表所示。隱式對象的概述6.4JSP隱式對象在JSP頁面中,有一些對象需要頻繁使用,如果每次都重新創(chuàng)建這在JSP頁面中,經(jīng)常需要向客戶端發(fā)送文本內(nèi)容,這時,可以使用out對象來實現(xiàn)。out對象是javax.servlet.jsp.JspWriter類的實例對象,它的作用與ServletResponse.getWriter()方法返回的PrintWriter對象非常相似,都是用來向客戶端發(fā)送文本形式的實體內(nèi)容。不同的是,out對象的類型為JspWriter,它相當(dāng)于一種帶緩存功能的PrintWriter。接下來,通過一張圖來描述JSP頁面的out對象與Servlet引擎提供的緩沖區(qū)之間的工作關(guān)系,具體如圖所示。從圖可以看出,在JSP頁面中,通過out

隱式對象寫入數(shù)據(jù)相當(dāng)于將數(shù)據(jù)插入到JspWriter對象的緩沖區(qū)中,只有調(diào)用了ServletResponse.getWriter()方法,緩

沖區(qū)中的數(shù)據(jù)才能真正寫入到Servlet引擎所提供的緩沖區(qū)中。out對象6.4JSP隱式對象在JSP頁面中,經(jīng)常需要向客戶端發(fā)送文本內(nèi)容,這時,可以使用

接下來,通過一個具體的案例來演示out對象的使用,請查看教材文件6-5。

使用page指令設(shè)置out對象的緩沖區(qū)大小,請查看教材6.4.2小節(jié)的多學(xué)一招。案例代碼6.4JSP隱式對象接下來,通過一個具體的案例來演示out對象的使用在JSP頁面中,使用pageContext對象可以獲取JSP的其他8個隱式對象。pageContext對象是javax.servlet.jsp.PageContext類的實例對象,它代表當(dāng)前JSP頁面的運行環(huán)境,并提供了一系列用于獲取其他隱式對象的方法。pageContext對象獲取隱式對象的方法如下表所示。pageContext對象6.4JSP隱式對象在JSP頁面中,使用pageContext對象可以獲取JSP上表中列舉了pageContext獲取其他隱式對象的方法,這樣,當(dāng)傳遞一個pageContext對象后,就可以通過這些方法輕松地獲取到其他8個隱式對象了。pageContext對象不僅提供了獲取隱式對象的方法,還提供了存儲數(shù)據(jù)的功能。pageContext對象存儲數(shù)據(jù)是通過操作屬性來實現(xiàn)的,下表列舉了pageContext操作屬性的一系列方法,具體如下:6.4JSP隱式對象上表中列舉了pageContext獲取其他隱式對象的方法,這上表列舉了pageContext對象操作屬性的相關(guān)方法,其中,參數(shù)name指定的是屬性名稱,參數(shù)scope指定的是屬性的作用范圍。pageContext對象的作用范圍有4個值,具體如下:pageContext.PAGE_SCOPE:表示頁面范圍pageContext.REQUEST_SCOPE:表示請求范圍pageContext.SESSION_SCOPE:表示會話范圍pageContext.APPLICATION_SCOPE:表示W(wǎng)eb應(yīng)用程序范圍需要注意的是,當(dāng)使用findAttribute()方法查找名稱為name的屬性時,會按照page、request、session和application的順序依次進行查找,如果找到,則返回屬性的名稱,否則返回null。6.4JSP隱式對象上表列舉了pageContext對象操作屬性的相關(guān)方法,其中

接下來,通過一個案例來演示pageContext對象的使用,請查看教材文件6-7。案例代碼6.4JSP隱式對象接下來,通過一個案例來演示pageContext在JSP頁面中,經(jīng)常需要處理一些異常信息,這時,可以通過exception對象來實現(xiàn)。exception對象是java.lang.Exception類的實例對象,它用于封裝JSP中拋出的異常信息。需要注意的是,exception對象只有在錯誤處理頁面才可以使用,即page指令中指定了屬性<%@pageisErrorPage=”true”%>的頁面。exception對象

接下來,通過一個案例來學(xué)習(xí)exception對象的使用,請查看教材文件6-8~6-9。案例代碼6.4JSP隱式對象在JSP頁面中,經(jīng)常需要處理一些異常信息,這時,可以通過ex在JSP頁面中,為了把其他資源的輸出內(nèi)容插入到當(dāng)前JSP頁面的輸出內(nèi)容中,JSP技術(shù)提供了<jsp:include>動作元素,<jsp:include>動作元素的具體語法格式如下所示:在上述語法格式中,page屬性用于指定被引入資源的相對路徑,flush屬性用于指定是否將當(dāng)前頁面的輸出內(nèi)容刷新到客戶端,默認情況下,flush屬性的值為false。<jsp:include>動作元素6.4JSP隱式對象在JSP頁面中,為了把其他資源的輸出內(nèi)容插入到當(dāng)前JSP頁面<jsp:include>包含的原理是將被包含的頁面編譯處理后將結(jié)果包含在頁面中。當(dāng)瀏覽器第一次請求一個使用<jsp:include>包含其他頁面的頁面時,Web容器首先會編譯被包含的頁面,然后將編譯處理后的返回結(jié)果包含在頁面中,之后編譯包含頁面,最后將兩個頁面組合的結(jié)果回應(yīng)給瀏覽器。為了使讀者更好地理解<jsp:include>動作元素。

接下來,通過一個案例來演示<jsp:include>動作元素的使用,請查看教材文件6-10~6-11。案例代碼6.5JSP動作元素<jsp:include>包含的原理是將被包含的頁面編譯處理需要注意的是,雖然include指令和<jsp:include>標(biāo)簽都能夠包含一個文件,但它們之間有很大的區(qū)別,具體如下:<jsp:include>標(biāo)簽中要引入的資源和當(dāng)前JSP頁面是兩個彼此獨立的執(zhí)行實體,即被動態(tài)引入的資源必須能夠被Web容器獨立執(zhí)行。而include指令只能引入遵循JSP格式的文件,被引入文件與當(dāng)前JSP文件需要共同合并才能翻譯成一個Servlet源文件。<jsp:include>標(biāo)簽中引入的資源是在運行時才包含的,而且只包含運行結(jié)果。而include指令引入的資源是在編譯時期包含的,包含的是源代碼。<jsp:include>標(biāo)簽運行原理與RequestDispatcher.include()方法類似,即被包含的頁面不能改變響應(yīng)狀態(tài)碼或者設(shè)置響應(yīng)頭,而include指令沒有這方面的限制。6.5JSP動作元素需要注意的是,雖然include指令和<jsp:includ<jsp:forward>動作元素將當(dāng)前請求轉(zhuǎn)發(fā)到其他Web資源(HTML頁面、JSP頁面和Servlet等),在執(zhí)行請求轉(zhuǎn)發(fā)之后的當(dāng)前頁面將不再執(zhí)行,而是執(zhí)行該元素指定的目標(biāo)頁面。其具體語法格式如下所示:在上述語法格式中,page屬性用于指定請求轉(zhuǎn)發(fā)到的資源的相對路徑,該路徑是相對于當(dāng)前JSP頁面的URL。<jsp:forward>動作元素

接下來,通過一個案例來學(xué)習(xí)<jsp:forward>動作元素的具體用法,請查看教材文件6-12~6-13。案例代碼6.5JSP動作元素<jsp:forward>動作元素將當(dāng)前請求轉(zhuǎn)發(fā)到其他Web任務(wù)案例案例代碼接下來,通過實現(xiàn)傳智書城首頁來熟悉本階段的知識點,請查看教材【任務(wù)6-1】。6.6階段案例:傳智書城JSP頁面任務(wù)案例案例代碼接下來,通過實現(xiàn)傳智書城首頁來熟悉本任務(wù)案例案例代碼接下來,通過實現(xiàn)傳智書城注冊頁面來熟悉本階段的知識點,請查看教材【任務(wù)6-2】。6.6階段案例:傳智書城JSP頁面任務(wù)案例案例代碼接下來,通過實現(xiàn)傳智書城注冊頁面來熟

本章主要講解了JSP的語法、JSP指令、JSP隱式對象和JSP動作元素。通過本章的學(xué)習(xí),讀者可以了解JSP的由來以及運行原理,掌握JSP的基本語法,能夠熟練JSP常用指令及隱式對象的使用,并掌握常用動作元素的使用。JSP是一種簡化了的Servlet,最終也會編譯成Servlet類。但JSP文件在形式上與HTML文件相似,可以直觀表單頁面的內(nèi)容和布局,因此,在動態(tài)網(wǎng)頁開發(fā)中,學(xué)會JSP開發(fā)相當(dāng)重要,讀者應(yīng)該熟練掌握本章內(nèi)容。6.7本章小結(jié)本章主要講解了JSP的語法、JSP指令、JSPJava-Web程序設(shè)計任務(wù)教程第6章-JSP技課件第六章JSP技術(shù)JSP運行原理page指令JSP隱式對象forward標(biāo)簽JSP聲明include指令include標(biāo)簽第六章JSP技術(shù)JSP運行原理JSP聲明掌握JSP的基本語法和JSP動作元素的使用13了解JSP的特點及其運行原理2熟悉JSP指令和隱式對象的使用掌握了解熟悉學(xué)習(xí)目標(biāo)掌握JSP的基本語法和13了解JSP的特點2熟悉6.1JSP概述6.2JSP基本語法6.3JSP指令6.4JSP隱式對象?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)6.5JSP動作元素6.6階段案例:傳智書城JSP頁面?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)目錄6.1JSP概述6.2JSP基本語法6.3JSP指令6.4J返回目錄.2什么是JSP編寫第一個JSP文件JSP運行原理6.1JSP概述6.1.3知識架構(gòu)返回目錄.2什么是JSP編寫第一個JSP文件返回目錄6.2.1JSP腳本元素JSP注釋6.2JSP基本語法6.2.2知識架構(gòu)返回目錄6.2.1JSP腳本元素JSP注釋6.2JSP基本返回目錄6.3.1page指令include指令6.3JSP指令6.3.2知識架構(gòu)返回目錄6.3.1page指令include指令6.3JS返回目錄.2隱式對象的概述out對象pageContext對象6.4JSP隱式對象.4exception對象知識架構(gòu)返回目錄.2隱式對象的概述out對象page返回目錄6.5.1<jsp:include>動作元素<jsp:forward>動作元素6.5JSP動作元素6.5.2知識架構(gòu)返回目錄6.5.1<jsp:include>動作元素<jsp返回目錄6.6.1【任務(wù)6-1】實現(xiàn)首頁【任務(wù)6-2】實現(xiàn)注冊頁面6.6階段案例:傳智書城JSP頁面6.6.2知識架構(gòu)返回目錄6.6.1【任務(wù)6-1】實現(xiàn)首頁【任務(wù)6-2】實現(xiàn)注在動態(tài)網(wǎng)頁開發(fā)中,經(jīng)常需要動態(tài)生成HTML內(nèi)容,例如,一篇新聞報道的瀏覽次數(shù)需要動態(tài)生成。這時,如果使用Servlet來實現(xiàn)HTML頁面數(shù)據(jù)的統(tǒng)計,需要調(diào)用大量的輸出語句,使靜態(tài)內(nèi)容和動態(tài)內(nèi)容混合在一起,導(dǎo)致程序非常臃腫。為了克服Servlet的這些缺點,Oracle(Sun)公司推出了JSP技術(shù)。接下來,本章將圍繞JSP技術(shù)進行詳細的講解。JSP技術(shù)在動態(tài)網(wǎng)頁開發(fā)中,經(jīng)常需要動態(tài)生成HTML內(nèi)容,例如,一篇新JSP全名是JavaServerPages,它是建立在Servlet規(guī)范之上的動態(tài)網(wǎng)頁開發(fā)技術(shù)。在JSP文件中,HTML代碼與Java代碼共同存在,其中,HTML代碼用來實現(xiàn)網(wǎng)頁中靜態(tài)內(nèi)容的顯示,Java代碼用來實現(xiàn)網(wǎng)頁中動態(tài)內(nèi)容的顯示。為了與傳統(tǒng)HTML有所區(qū)別,JSP文件的擴展名為.jsp。JSP技術(shù)所開發(fā)的Web應(yīng)用程序是基于Java的,它可以用一種簡捷而快速的方法從Java程序生成Web頁面,其使用上具有如下幾點特征:跨平臺:由于JSP是基于Java語言的,它可以使用JavaAPI,所以它也是跨平臺的,可以應(yīng)用于不同的系統(tǒng)中,如Windows、Linux等。當(dāng)從一個平臺移植到另一個平臺時,JSP和JavaBean的代碼并不需要重新編譯,這是因為Java的字節(jié)碼是與平臺無關(guān)的,這也應(yīng)驗了Java語言“一次編譯,到處運行”的特點。JSP概述6.1JSP概述JSP全名是JavaServerPages,它是建立在S業(yè)務(wù)代碼相分離:在使用JSP技術(shù)開發(fā)Web應(yīng)用時,可以將界面的開發(fā)與應(yīng)用程序的開發(fā)分離開。開發(fā)人員使用HTML來設(shè)計界面,使用JSP標(biāo)簽和腳本來動態(tài)生成頁面上的內(nèi)容。在服務(wù)器端,JSP引擎(或容器,本書中指Tomcat)負責(zé)解析JSP標(biāo)簽和腳本程序,生成所請求的內(nèi)容,并將執(zhí)行結(jié)果以HTML頁面的形式返回到瀏覽器。組件重用:JSP中可以使用JavaBean編寫業(yè)務(wù)組件,也就是使用一個JavaBean類封裝業(yè)務(wù)處理代碼或者作為一個數(shù)據(jù)存儲模型,在JSP頁面中,甚至在整個項目中,都可以重復(fù)使用這個JavaBean,同時,JavaBean也可以應(yīng)用到其他Java應(yīng)用程序中。預(yù)編譯:預(yù)編譯就是在用戶第一次通過瀏覽器訪問JSP頁面時,服務(wù)器將對JSP頁面代碼進行編譯,并且僅執(zhí)行一次編譯。編譯好的代碼將被保存,在用戶下一次訪問時,會直接執(zhí)行編譯好的代碼。這樣不僅節(jié)約了服務(wù)器的CPU資源,還大大的提升了客戶端的訪問速度。6.1JSP概述業(yè)務(wù)代碼相分離:在使用JSP技術(shù)開發(fā)Web應(yīng)用時,可以將界面

接下來,通過一個案例來演示第一個JSP文件的創(chuàng)建過程,請查看教材6.1.2小節(jié)。案例代碼6.1JSP概述接下來,通過一個案例來演示第一個JSP文件的創(chuàng)JSP的工作模式是請求/響應(yīng)模式,客戶端首先發(fā)出HTTP請求,JSP程序收到請求后進行處理并返回處理結(jié)果。在一個JSP文件第一次被請求時,JSP引擎(容器)把該JSP文件轉(zhuǎn)換成為一個Servlet,而這個引擎本身也是一個Servlet。JSP的運行過程如圖所示。JSP運行原理6.1JSP概述JSP的工作模式是請求/響應(yīng)模式,客戶端首先發(fā)出HTTP請求JSP的運行過程具體如下:(1)客戶端發(fā)出請求,請求訪問JSP文件。(2)JSP容器先將JSP文件轉(zhuǎn)換成一個Java源文件(JavaServlet源程序),在轉(zhuǎn)換過程中,如果發(fā)現(xiàn)JSP文件中存在任何語法錯誤,則中斷轉(zhuǎn)換過程,并向服務(wù)端和客戶端返回出錯信息。(3)如果轉(zhuǎn)換成功,則JSP容器將生成的Java源文件編譯成相應(yīng)的字節(jié)碼文件*.class。該class文件就是一個Servlet,Servlet容器會像處理其他Servlet一樣來處理它。(4)由Servlet容器加載轉(zhuǎn)換后的Servlet類(.class文件)創(chuàng)建一個該Servlet(JSP頁面的轉(zhuǎn)換結(jié)果)實例,并執(zhí)行Servlet的jspInit()方法。jspInit()方法在Servlet的整個生命周期中只會執(zhí)行一次。6.1JSP概述JSP的運行過程具體如下:6.1JSP概述(5)執(zhí)行jspService()方法來處理客戶端的請求。對于每一個請求,JSP容器都會創(chuàng)建一個新的線程來處理它。如果多個客戶端同時請求該JSP文件,則JSP容器也會創(chuàng)建多個線程,使得每一個客戶端請求都對應(yīng)一個線程。JSP運行過程中采用的這種多線程的執(zhí)行方式可以極大地降低對系統(tǒng)資源的需求,提高系統(tǒng)的并發(fā)量并縮短響應(yīng)時間。需要注意的是,由于第(4)步生成的Servlet是常駐內(nèi)存的,所以響應(yīng)速度非??臁#?)如果JSP文件被修改了,則服務(wù)器將根據(jù)設(shè)置決定是否對該文件重新編譯,如果需要重新編譯,則使用重新編譯后的結(jié)果取代內(nèi)存中常駐的Servlet,并繼續(xù)上述處理過程。(7)雖然JSP效率很高,但在第一次調(diào)用的時候往往由于需要轉(zhuǎn)換和編譯,所以會產(chǎn)生一些輕微的延遲。此外,由于系統(tǒng)資源不足等原因,JSP容器可能會以某種不確定的方式將Servlet從內(nèi)存中移除,發(fā)生這種情況時首先會調(diào)用jspDestroy()方法,然后Servlet實例會被加入“垃圾收集”處理。6.1JSP概述(5)執(zhí)行jspService()方法來處理客戶端的請求。對(8)當(dāng)請求處理完成后,響應(yīng)對象由JSP容器接收,并將HTML格式的響應(yīng)信息發(fā)送回客戶端。了解了JSP的運行原理后,完全可以利用其中的一些步驟來做一些工作,如:可以在jspInit()中進行一些初始化工作(建立數(shù)據(jù)庫的連接、建立網(wǎng)絡(luò)連接、從配置文件中獲取一些參數(shù)等),可以在jspDestroy()中釋放相應(yīng)的資源等。

為了使讀者更容易理解JSP的運行原理,接下來簡單介紹分析一下JSP所生成的Servlet代碼,請查看教材6.1.3小節(jié)。案例代碼6.1JSP概述(8)當(dāng)請求處理完成后,響應(yīng)對象由JSP容器接收,并將HTMJSP腳本元素是指嵌套在<%和%>之中的一條或多條Java程序代碼。通過JSP腳本元素可以將Java代碼嵌入HTML頁面中,所有可執(zhí)行的Java代碼,都可以通過JSP腳本來執(zhí)行。JSP腳本元素主要包含如下三種類型:JSPScriptletsJSP聲明語句JSP表達式JSP腳本元素6.2JSP基本語法JSP腳本元素是指嵌套在<%和%>之中的一條或多條Java程1、JSPScriptletsJSPScriptlets是一段代碼段。當(dāng)需要使用Java實現(xiàn)一些復(fù)雜操作或控制時,可以使用它。JSPScriptlets的語法格式如下所示:在JSPScriptlets中聲明的變量是JSP頁面的局部變量,調(diào)用JSPScriptlets時,會為局部變量分配內(nèi)存空間,調(diào)用結(jié)束后,釋放局部變量占有的內(nèi)存空間。2、JSP聲明語句JSP的聲明語句用于聲明變量和方法,它以“<%!”開始,以“%>”結(jié)束,其語法格式如下所示:6.2JSP基本語法1、JSPScriptlets6.2JSP基本語法在上述語法格式中,被聲明的Java代碼將被編譯到Servlet的_jspService()方法之外,即在JSP聲明語句中定義的都是成員方法、成員變量、靜態(tài)方法、靜態(tài)變量、靜態(tài)代碼塊等。在JSP聲明語句中聲明的方法在整個JSP頁面內(nèi)有效,但是在方法內(nèi)定義的變量只在該方法內(nèi)有效。當(dāng)聲明的方法被調(diào)用時,會為方法內(nèi)定的變量分配內(nèi)存,而調(diào)用結(jié)束后立刻會釋放所占的內(nèi)存。

接下來,通過一個案例來演示JSPScriptlets和聲明語句的使用,請查看教材文件6-1。案例代碼6.2JSP基本語法接下來,通過一個案例來演示JSPScriptl需要注意的是,<%!和%>里面定義的屬性是成員屬性,相當(dāng)于類的屬性,方法相當(dāng)于是全局的方法,也相當(dāng)于是類里面的方法,但是它是不可以進行輸出的,因為它只是進行方法的定義和屬性的定義。<%和%>可以進行屬性的定義,也可以輸出內(nèi)容,但是它不可以進行方法的定義。因為這對標(biāo)簽里面的內(nèi)容是在此jsp被編譯為servlet的時候,放在_jspService()方法里面的,這個方法就是服務(wù)器向客戶端輸出內(nèi)容的地方,它本身就是一個方法,所以如果在它里面定義方法的話,那么就相當(dāng)于是在類的方法里面嵌套定義了方法,這在java里面是不允許的。但是可以在里面定義自己的私有變量,因為方法里面也可以定義變量,也可以調(diào)用方法,唯獨不可以再定義方法了??傊?,<%!和%>是用來定義成員變量屬性和方法的,<%和%>主要是用來輸出內(nèi)容的,因此如果涉及到了成員變量的操作,那么就應(yīng)該使用<%!和%>,而如果是涉及到了輸出內(nèi)容的時候,就使用<%和%>。6.2JSP基本語法需要注意的是,<%!和%>里面定義的屬性是成員屬性,相當(dāng)于類3、JSP表達式JSP表達式(expression)用于將程序數(shù)據(jù)輸出到客戶端,它將要輸出的變量或者表達式直接封裝在以“<%=”開頭和以“%>”結(jié)尾的標(biāo)記中,其基本的語法格式如下所示:

在上述語法格式中,JSP表達式中的變量或表達式的計算結(jié)果將被轉(zhuǎn)換成一個字符串,然后插入到JSP頁面輸出結(jié)果的相應(yīng)位置處。例如,對example01.jsp文件進行修改,將<body>內(nèi)的腳本元素修改為表達式,具體如下。6.2JSP基本語法3、JSP表達式6.2JSP基本語法同其他各種編程語言一樣,JSP也有自己的注釋方式,其基本語法格式如下:

需要注意的是,Tomcat在將JSP頁面編譯成Servlet程序時,會忽略JSP頁面中被注釋的內(nèi)容,不會將注釋信息發(fā)送到客戶端。JSP注釋

接下來,通過一個案例來演示JSP注釋的使用,請查看教材文件6-2。案例代碼6.2JSP基本語法同其他各種編程語言一樣,JSP也有自己的注釋方式,其基本語法在JSP頁面中,經(jīng)常需要對頁面的某些特性進行描述,例如,頁面的編碼方式,JSP頁面采用的語言等,這時,可以通過page指令來實現(xiàn)。page指令的具體語法格式如下所示:在上面的語法格式中,page用于聲明指令名稱,屬性用來指定JSP頁面的某些特性。page指令提供了一系列與JSP頁面相關(guān)的屬性,如下表所示。page指令6.3JSP指令在JSP頁面中,經(jīng)常需要對頁面的某些特性進行描述,例如,頁面表中列舉了page指令的常見

屬性,其中,除了import屬

性外,其他的屬性都只能出

現(xiàn)一次,否則會編譯失敗。

需要注意的是,page指令的

屬性名稱都是區(qū)分大小寫的。6.3JSP指令6.3JSP指令下面列舉兩個使用page指令的示例:上面代碼中使用了page指令的language、contentType、pageEncoding和import屬性。需要注意的是,page指令對整個頁面都有效,而與其書寫的位置無關(guān),但是習(xí)慣上把page指令寫在JSP頁面的最前面。6.3JSP指令下面列舉兩個使用page指令的示例:6.3JSP指令在實際開發(fā)時,有時需要在JSP頁面靜態(tài)包含一個文件,例如HTML文件,文本文件等,這時,可以通過include指令來實現(xiàn),include指令的具體語法格式如下所示:include指令只有一個file屬性,該屬性用來指定插入到JSP頁面目標(biāo)位置的文件資源。需要注意的是,插入文件的路徑一般不以“/”開頭,而是使用相對路徑。include指令

接下來,通過一個案例來學(xué)習(xí)include指令的具體用法,請查看教材文件6-3~6-4。案例代碼6.3JSP指令在實際開發(fā)時,有時需要在JSP頁面靜態(tài)包含一個文件,例如HT關(guān)于include指令的具體應(yīng)用,有很多問題需要注意,接下來,將這些問題進行列舉,具體如下:

被引入的文件必須遵循JSP語法,其中的內(nèi)容可以包含靜態(tài)HTML、JSP腳本元素和JSP指令等普通JSP頁面所具有的一切內(nèi)容。除了指令元素之外,被引入的文件中的其他元素都被轉(zhuǎn)換成相應(yīng)的Java源代碼,然后插入進當(dāng)前JSP頁面所翻譯成的Servlet源文件中,插入位置與include指令在當(dāng)前JSP頁面中的位置保持一致。file屬性的設(shè)置值必須使用相對路徑,如果以“/”開頭,表示相對于當(dāng)前Web應(yīng)用程序的根目錄(注意不是站點根目錄),否則,表示相對于當(dāng)前文件。需要注意的是,這里的file屬性指定的相對路徑是相對于文件(file),而不是相對于頁面(page)。6.3JSP指令關(guān)于include指令的具體應(yīng)用,有很多問題需要注意,接下來在JSP頁面中,有一些對象需要頻繁使用,如果每次都重新創(chuàng)建這些對象則會非常麻煩。為了簡化Web應(yīng)用程序的開發(fā),JSP2.0規(guī)范中提供了9個隱式(內(nèi)置)對象,它們是JSP默認創(chuàng)建的,可以直接在JSP頁面中使用。這9個隱式對象的名稱、類型和描述如表所示。隱式對象的概述6.4JSP隱式對象在JSP頁面中,有一些對象需要頻繁使用,如果每次都重新創(chuàng)建這在JSP頁面中,經(jīng)常需要向客戶端發(fā)送文本內(nèi)容,這時,可以使用out對象來實現(xiàn)。out對象是javax.servlet.jsp.JspWriter類的實例對象,它的作用與ServletResponse.getWriter()方法返回的PrintWriter對象非常相似,都是用來向客戶端發(fā)送文本形式的實體內(nèi)容。不同的是,out對象的類型為JspWriter,它相當(dāng)于一種帶緩存功能的PrintWriter。接下來,通過一張圖來描述JSP頁面的out對象與Servlet引擎提供的緩沖區(qū)之間的工作關(guān)系,具體如圖所示。從圖可以看出,在JSP頁面中,通過out

隱式對象寫入數(shù)據(jù)相當(dāng)于將數(shù)據(jù)插入到JspWriter對象的緩沖區(qū)中,只有調(diào)用了ServletResponse.getWriter()方法,緩

沖區(qū)中的數(shù)據(jù)才能真正寫入到Servlet引擎所提供的緩沖區(qū)中。out對象6.4JSP隱式對象在JSP頁面中,經(jīng)常需要向客戶端發(fā)送文本內(nèi)容,這時,可以使用

接下來,通過一個具體的案例來演示out對象的使用,請查看教材文件6-5。

使用page指令設(shè)置out對象的緩沖區(qū)大小,請查看教材6.4.2小節(jié)的多學(xué)一招。案例代碼6.4JSP隱式對象接下來,通過一個具體的案例來演示out對象的使用在JSP頁面中,使用pageContext對象可以獲取JSP的其他8個隱式對象。pageContext對象是javax.servlet.jsp.PageContext類的實例對象,它代表當(dāng)前JSP頁面的運行環(huán)境,并提供了一系列用于獲取其他隱式對象的方法。pageContext對象獲取隱式對象的方法如下表所示。pageContext對象6.4JSP隱式對象在JSP頁面中,使用pageContext對象可以獲取JSP上表中列舉了pageContext獲取其他隱式對象的方法,這樣,當(dāng)傳遞一個pageContext對象后,就可以通過這些方法輕松地獲取到其他8個隱式對象了。pageContext對象不僅提供了獲取隱式對象的方法,還提供了存儲數(shù)據(jù)的功能。pageContext對象存儲數(shù)據(jù)是通過操作屬性來實現(xiàn)的,下表列舉了pageContext操作屬性的一系列方法,具體如下:6.4JSP隱式對象上表中列舉了pageContext獲取其他隱式對象的方法,這上表列舉了pageContext對象操作屬性的相關(guān)方法,其中,參數(shù)name指定的是屬性名稱,參數(shù)scope指定的是屬性的作用范圍。pageContext對象的作用范圍有4個值,具體如下:pageContext.PAGE_SCOPE:表示頁面范圍pageContext.REQUEST_SCOPE:表示請求范圍pageContext.SESSION_SCOPE:表示會話范圍pageContext.APPLICATION_SCOPE:表示W(wǎng)eb應(yīng)用程序范圍需要注意的是,當(dāng)使用findAttribute()方法查找名稱為name的屬性時,會按照page、request、session和application的順序依次進行查找,如果找到,則返回屬性的名稱,否則返回null。6.4JSP隱式對象上表列舉了pageContext對象操作屬性的相關(guān)方法,其中

接下來,通過一個案例來演示pageContext對象的使用,請查看教材文件6-7。案例代碼6.4JSP隱式對象接下來,通過一個案例來演示pageContex

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論