jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第04章 JSP技術(shù)模型_第1頁
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第04章 JSP技術(shù)模型_第2頁
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第04章 JSP技術(shù)模型_第3頁
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第04章 JSP技術(shù)模型_第4頁
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第04章 JSP技術(shù)模型_第5頁
已閱讀5頁,還剩187頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 第4章 JSP技術(shù)模型 此文檔下載自官網(wǎng),除本頁,其余未修改,可直接刪除本頁本章內(nèi)容 4.1JSP語法概述 4.2 JSP頁面生命周期 4.3 理解page指令屬性 4.4 JSP腳本元素 4.5 JSP隱含變量 4.6 作用域?qū)ο?4.7 JSP組件包含4.1 JSP語法概述 在JSP頁面中可以包含的元素如表4-1所示。 表4-1 JSP頁面元素 下面是一個(gè)簡單的JSP頁面,它輸出頁面被訪問的次數(shù)。 程序4.1 counter.jsp % page contentType=text/html;charset = UTF-8 % % % 該頁面已被訪問該頁面已被訪問 次。次。 4.1 JSP

2、語法概述4.1 JSP語法概述 4.1.1 JSP腳本元素 4.1.2 JSP指令 4.1.3 JSP動(dòng)作 4.1.4 表達(dá)式語言 4.1.5 JSP注釋 4.1.1 JSP腳本元素 在JSP頁面中有三種腳本元素: JSP聲明 JSP小腳本 JSP表達(dá)式。 1. JSP聲明 JSP聲明(declaration)用來在JSP頁面中聲明變量和定義方法。聲明是以“”結(jié)束的標(biāo)簽,其中可以包含任意數(shù)量的合法的Java聲明語句。下面是JSP聲明的一個(gè)例子: 注意,由于聲明包含的是聲明語句,所以每個(gè)變量的聲明語句必須以分號(hào)結(jié)束。 下面的代碼在一個(gè)標(biāo)簽中聲明了一個(gè)變量和一個(gè)方法。 1. JSP聲明 也可以將上

3、面的兩個(gè)Java聲明語句寫在兩個(gè)JSP聲明標(biāo)簽中。 1. JSP聲明 小腳本(scriptlets)是嵌入在JSP頁面中的Java代碼段。小腳本是以“”結(jié)束的標(biāo)簽。例如,程序4.1中的下面一行就是JSP小腳本。 小腳本在每次訪問頁面時(shí)都被執(zhí)行,因此count變量在每次請(qǐng)求時(shí)都增1。2. JSP小腳本 由于小腳本可以包含任何Java代碼,所以它通常用來在JSP頁面嵌入計(jì)算邏輯。同時(shí)還可以使用小腳本打印HTML模板文本。如下面代碼與程序4.1的代碼等價(jià): % out.print(); count+; out.print(該頁面已被訪問 + count +次。 ); out.print(); %2.

4、 JSP小腳本 這里變量out是一個(gè)隱含對(duì)象,將在4.5節(jié)中討論out對(duì)象。與其他元素不同,小腳本的起始標(biāo)簽“%”后面沒有任何特殊字符,在小腳本中的代碼必須是合法的Java語言代碼。 例如,下面的代碼是錯(cuò)誤的,因?yàn)樗鼪]有使用分號(hào)結(jié)束。 2. JSP小腳本 JSP表達(dá)式是以“”結(jié)束的標(biāo)簽,它作為Java語言表達(dá)式的占位符。 下面是JSP表達(dá)式的例子。 在頁面每次被訪問時(shí)都要計(jì)算表達(dá)式,然后將其值嵌入到HTML的輸出中。3. JSP表達(dá)式 與變量聲明不同,表達(dá)式不能以分號(hào)結(jié)束,因此下面的代碼是非法的。 使用表達(dá)式可以向輸出流輸出任何對(duì)象或任何基本數(shù)據(jù)類型(int、boolean、char等)的值,

5、也可以打印任何算術(shù)表達(dá)式、布爾表達(dá)式或方法調(diào)用返回的值。 提示:在JSP表達(dá)式的百分號(hào)和等號(hào)之間不能有空格3. JSP表達(dá)式 下面代碼聲明了一些變量并通過表達(dá)式輸出。 程序程序4.2 expression.jsp4.2 expression.jsp3. JSP表達(dá)式4.1.2 JSP指令 JSP指令向容器提供關(guān)于JSP頁面的總體信息。在JSP頁面中,指令是以“”結(jié)束的標(biāo)簽。 指令有三種類型:page指令、include指令和taglib指令。 4.1.2 JSP指令 三種指令的語法格式如下: 在上面的指令標(biāo)簽中,attribute-list表示一個(gè)或多個(gè)針對(duì)指令的屬性/值對(duì),多個(gè)屬性之間用空格

6、分隔。 page指令通知容器關(guān)于JSP頁面的總體特性。 例如,下面的page指令通知容器頁面輸出的內(nèi)容類型和使用的字符集。 1. page指令 include指令指令實(shí)現(xiàn)把另一個(gè)文件(HTML、JSP等)的內(nèi)容包含到當(dāng)前頁面中。下面是include指令的一個(gè)例子 2. include指令 taglib指令用來指定在JSP頁面中使用標(biāo)準(zhǔn)標(biāo)簽或自定義標(biāo)簽的前綴與標(biāo)簽庫的URI,下面是taglib指令的例子。 3. taglib指令 關(guān)于指令的使用需注意下面幾個(gè)問題:標(biāo)簽名、屬性名及屬性值都是大小寫敏感的。屬性值必須使用一對(duì)單引號(hào)或雙引號(hào)括起來。在等號(hào)(=)與值之間不能有空格。 3. taglib指

7、令4.1.3 JSP動(dòng)作 JSP動(dòng)作(actions)是頁面發(fā)給容器的命令,它指示容器在頁面執(zhí)行期間完成某種任務(wù)。動(dòng)作的一般語法為: 動(dòng)作是一種標(biāo)簽,在動(dòng)作標(biāo)簽中,prefix為前綴名,actionName為動(dòng)作名,attribute-list表示針對(duì)該動(dòng)作的一個(gè)或多個(gè)屬性/值對(duì)。4.1.3 JSP動(dòng)作 在JSP頁面中可以使用三種動(dòng)作: JSP標(biāo)準(zhǔn)動(dòng)作 標(biāo)準(zhǔn)標(biāo)簽庫(JSTL)中的動(dòng)作 用戶自定義動(dòng)作 例如,下面一行指示容器把另一個(gè)JSP頁面copyright.jsp的輸出包含在當(dāng)前JSP頁面的輸出中: 下面是常用的JSP標(biāo)準(zhǔn)動(dòng)作: jsp:include,在當(dāng)前頁面中包含另一個(gè)頁面的輸出。 j

8、sp:forward,將請(qǐng)求轉(zhuǎn)發(fā)到指定的頁面。 jsp:useBean,查找或創(chuàng)建一個(gè)JavaBeans對(duì)象。 jsp:setProperty,設(shè)置JavaBeans對(duì)象的屬性值。 jsp:getProperty,返回JavaBeans對(duì)象的屬性值。 jsp:plugin,在JSP頁面中嵌入一個(gè)插件(如Applet)。 4.1.3 JSP動(dòng)作4.1.4 表達(dá)式語言 表達(dá)式語言(Expression Language,EL)是JSP 2.0新增加的特性,它是一種可以在JSP頁面中使用的簡潔的數(shù)據(jù)訪問語言。它的格式為: $expression 表達(dá)式語言是以$開頭,后面是一對(duì)大括號(hào),括號(hào)里面是合法

9、的EL表達(dá)式。該結(jié)構(gòu)可以出現(xiàn)在JSP頁面的模板文本中,也可以出現(xiàn)在JSP標(biāo)簽的屬性中。 $param.userName 該EL顯示請(qǐng)求參數(shù)userName的值。4.1.5 JSP注釋 JSP注釋的格式為: JSP注釋是以“”結(jié)束的標(biāo)簽。注釋不影響JSP頁面的輸出,但它對(duì)用戶理解代碼很有幫助。 Web容器在輸出JSP頁面時(shí)去掉JSP注釋內(nèi)容,所以在調(diào)試JSP頁面時(shí)可以將JSP頁面中一大塊內(nèi)容注釋掉,包括嵌套的HTML和其他JSP標(biāo)簽。4.1.5 JSP注釋 還可以在小腳本或聲明中使用一般的Java風(fēng)格的注釋,也可以在頁面的HTML部分使用HTML風(fēng)格的注釋,如下所示: 4.2 JSP頁面生命周期

10、 4.2.1 JSP頁面也是Servlet 4.2.2 JSP生命周期階段 4.2.3 JSP生命周期方法示例 4.2.4 理解頁面轉(zhuǎn)換過程 4.2.5 理解轉(zhuǎn)換單元 JSP頁面盡管從結(jié)構(gòu)上看與HTML頁面類似,但它實(shí)際上是作為Servlet運(yùn)行的。 當(dāng)JSP頁面第一次被訪問時(shí),Web容器解析JSP文件并將其轉(zhuǎn)換成相應(yīng)的Java文件,該文件聲明了一個(gè)Servlet類,我們將該類稱為頁面實(shí)現(xiàn)類。 接下來,Web容器編譯該類并將其裝入內(nèi)存,然后與其他Servlet一樣執(zhí)行并將其輸出結(jié)果發(fā)送到客戶端。4.2.1 JSP頁面也是Servlet4.2.2 JSP生命周期階段 下面的JSP頁面todayD

11、ate.jsp用于顯示當(dāng)前日期。下面以該頁面為例說明JSP頁面的生命周期的7個(gè)階段。 程序4.3 todayDate.jsp 當(dāng)客戶通過http:/localhost:8080/helloweb/todayDate.jsp 首次訪問該頁面時(shí),Web容器執(zhí)行該JSP頁面要經(jīng)過7個(gè)生命周期階段,如圖4-1所示。4.2.2 JSP生命周期階段4.2.2 JSP生命周期階段 JSP生命周期的前四個(gè)階段將JSP頁面轉(zhuǎn)換成一個(gè)Servlet類并裝載和創(chuàng)建該類實(shí)例,后三個(gè)階段初始化、提供服務(wù)和銷毀階段。表4-2按生命周期的順序列出了每個(gè)階段及說明。 表4-2 JSP頁面生命周期階段1. 轉(zhuǎn)換階段 Web容器

12、讀取JSP頁面對(duì)其解析,并將其轉(zhuǎn)換成Java源代碼。JSP文件中的元素都轉(zhuǎn)換成頁面實(shí)現(xiàn)類的成員。在這個(gè)階段,容器將檢查JSP頁面中標(biāo)簽的語法,如果發(fā)現(xiàn)錯(cuò)誤將不能轉(zhuǎn)換。例如,下面的指令就是非法的,因?yàn)樵赑age中使用了大寫字母P,這在轉(zhuǎn)換階段被捕獲。 除了檢查語法外,容器還將執(zhí)行其他有效性檢查,其中一些涉及驗(yàn)證: 一旦驗(yàn)證完成,Web容器將JSP頁面轉(zhuǎn)換成Java源文件,它實(shí)際是一個(gè)Servlet,該文件存放在workCatalinalocalhosthelloweborgapachejsp目錄中。1. 轉(zhuǎn)換階段 JspPage接口只聲明了兩個(gè)方法:jspInit()和jspDestroy()。

13、所有的JSP頁面都應(yīng)該實(shí)現(xiàn)這兩個(gè)方法。HttpJspPage接口中聲明了一個(gè)方法:_jspService()。下面是這三個(gè)JSP方法的格式: public void jspInit(); public void _jspService(HttpServletRequest request, HttpServletResponse response) public void jspDestroy();1. 轉(zhuǎn)換階段 每個(gè)容器銷售商都提供一個(gè)特定的類作為頁面實(shí)現(xiàn)類的基類。在Tomcat中,JSP頁面轉(zhuǎn)換的類就繼承了org.apache.jasper.runtime.HttpJspBase類,該類提

14、供了Servlet接口的所有方法的默認(rèn)實(shí)現(xiàn)和JspPage接口的兩個(gè)方法jspInit()和jspDestroy()的默認(rèn)實(shí)現(xiàn)。在轉(zhuǎn)換階段,容器把_jspService()添加到JSP頁面的實(shí)現(xiàn)類中,這樣使該類成為三個(gè)接口的一個(gè)具體子類。1. 轉(zhuǎn)換階段 在將JSP頁面轉(zhuǎn)換成Java文件后,Web容器調(diào)用Java編譯器javac編譯該文件。在編譯階段,編譯器將檢查在聲明中、小腳本中以及表達(dá)式中所寫的全部Java代碼。 例如,下面的聲明標(biāo)簽盡管能夠通過轉(zhuǎn)換階段,但由于聲明語句沒以分號(hào)結(jié)束,所以不是合法的Java聲明語句,因此在編譯階段會(huì)被查出。 2. 編譯階段 可能注意到,當(dāng)JSP頁面被首次訪問時(shí)

15、,服務(wù)器響應(yīng)要比以后的訪問慢一些。這是因?yàn)樵贘SP頁面向客戶提供服務(wù)之前必須要轉(zhuǎn)換成Servlet類的實(shí)例。對(duì)每個(gè)請(qǐng)求,容器要檢查JSP頁面源文件的時(shí)間戳以及相應(yīng)的Servlet類文件以確定頁面是否是新的或是否已經(jīng)轉(zhuǎn)換成類文件。 因此,如果修改了JSP頁面,將JSP頁面轉(zhuǎn)換成Servlet的整個(gè)過程要重新執(zhí)行一遍。2. 編譯階段 Web容器將頁面實(shí)現(xiàn)類編譯成類文件,然后加載到內(nèi)存中。3. 加載類 Web容器調(diào)用頁面實(shí)現(xiàn)類的構(gòu)造方法創(chuàng)建一個(gè)Servlet類的實(shí)例。4. 實(shí)例化 Web容器調(diào)用jspInit()初始化Servlet實(shí)例。該方法是在任何其他方法調(diào)用之前調(diào)用的,并在頁面生命期內(nèi)只調(diào)用一

16、次。通常在該方法中完成初始化或只需一次的設(shè)置工作,如獲得資源及初始化JSP頁面中使用聲明的實(shí)例變量。5. 調(diào)用jspInit() 對(duì)該頁面的每次請(qǐng)求容器都調(diào)用一次_jspService(),并給它傳遞請(qǐng)求和響應(yīng)對(duì)象。JSP頁面中所有的HTML元素,JSP小腳本以及JSP表達(dá)式在轉(zhuǎn)換階段都成為該方法的一部分。6.調(diào)用_jspService() 當(dāng)容器決定停止該實(shí)例提供服務(wù)時(shí),它將調(diào)用jspDestroy(),這是在Servlet實(shí)例上調(diào)用的最后一個(gè)方法,它主要用來清理jspInit()獲得的資源。 一般不需要實(shí)現(xiàn)jspInit()和jspDestroy(),因?yàn)樗鼈円呀?jīng)由基類實(shí)現(xiàn)了。但可以根據(jù)需

17、要使用JSP的聲明標(biāo)簽覆蓋這兩個(gè)方法。然而,不能覆蓋_jspService(),因?yàn)樵摲椒ㄓ蒞eb容器自動(dòng)產(chǎn)生。4.調(diào)用jspDestroy()4.2.3 JSP生命周期方法示例 下面的lifeCycle.jsp頁面覆蓋了jspInit()和jspDestroy(),當(dāng)該頁面第一次被訪問時(shí)將在控制臺(tái)中看到“jspInit”,當(dāng)應(yīng)用程序關(guān)閉時(shí),將會(huì)看到“jspDestroy”。 程序4.4 lifeCycle.jsp4.2.3 JSP生命周期方法示例 當(dāng)Web容器首次裝入頁面時(shí),它將調(diào)用jspInit()。在JSP頁面的生命周期中,count變量可能被多次訪問,每次都將執(zhí)行_jspService

18、()。由于小腳本變成_jspService()的一部分,count+每次都會(huì)被執(zhí)行使計(jì)數(shù)器增1。最后,當(dāng)頁面被銷毀時(shí),容器調(diào)用jspDestroy()。 注意,_jspService()不能被覆蓋。4.2.4 理解頁面轉(zhuǎn)換過程 JSP頁面生命周期的第一階段是轉(zhuǎn)換階段,在該階段JSP頁面被轉(zhuǎn)換成包含相應(yīng)Servlet的Java文件。容器根據(jù)下面規(guī)則將JSP頁面中的元素轉(zhuǎn)換成Servlet代碼。所有JSP聲明都轉(zhuǎn)換成頁面實(shí)現(xiàn)類的成員,它們被原樣拷貝。例如,聲明的變量轉(zhuǎn)換成實(shí)例變量,聲明的方法轉(zhuǎn)換成實(shí)例方法。所有JSP小腳本都轉(zhuǎn)換成頁面實(shí)現(xiàn)類的_jspService()的一部分,它們也被原樣拷貝。小

19、腳本中聲明的變量轉(zhuǎn)換成_jspService()的局部變量,小腳本中的語句轉(zhuǎn)換成_jspService()中的語句。所有的JSP表達(dá)式都轉(zhuǎn)換成為_jspService()的一部分,表達(dá)式的值使用out.print()語句輸出。有些指令在轉(zhuǎn)換階段產(chǎn)生Java代碼,例如,page指令的import屬性轉(zhuǎn)換成頁面實(shí)現(xiàn)類的import語句。所有的JSP動(dòng)作都通過調(diào)用針對(duì)廠商的類來替換。所有表達(dá)式語言EL通過計(jì)算后使用out.write()語句輸出。所有模板文本都成為_jspService()的一部分,模板內(nèi)容使用out.write()語句輸出。所有的JSP注釋都被忽略。4.2.4 理解頁面轉(zhuǎn)換過程4.

20、2.5 理解轉(zhuǎn)換單元 在JSP頁面中可以使用指令把另一個(gè)文件(如JSP頁面、HTML頁面等)的內(nèi)容包含到當(dāng)前頁面中。容器在為當(dāng)前JSP頁面產(chǎn)生Java代碼時(shí),它也把被包含的文件的內(nèi)容插入到產(chǎn)生的頁面實(shí)現(xiàn)類中。 這些被轉(zhuǎn)換成單個(gè)頁面實(shí)現(xiàn)類的頁面集合稱為轉(zhuǎn)換單元。有些JSP標(biāo)簽影響整個(gè)轉(zhuǎn)換單元而不只是它們所在的頁面。4.2.5 理解轉(zhuǎn)換單元 關(guān)于轉(zhuǎn)換單元,請(qǐng)記住下面要點(diǎn):page指令影響整個(gè)轉(zhuǎn)換單元。有些指令通知容器關(guān)于頁面的總體性質(zhì),例如,page指令的contentType屬性指定響應(yīng)的內(nèi)容類型,session屬性指定頁面是否參加HTTP會(huì)話。在一個(gè)轉(zhuǎn)換單元中一個(gè)變量不能多次聲明。例如,如果一

21、個(gè)變量已經(jīng)在主頁面中聲明,它就不能在被包含的頁面中聲明。在一個(gè)轉(zhuǎn)換單元中不能使用動(dòng)作對(duì)一個(gè)bean聲明兩次。4.3 理解page指令屬性 page指令用于告訴容器關(guān)于JSP頁面的總體特性,該指令適用于整個(gè)轉(zhuǎn)換單元而不僅僅是它所聲明的頁面。表4-3描述了page指令的常用的屬性。 表4-3 page指令的常用屬性4.3.1 import屬性 import屬性的功能類似于Java程序的import語句,它是將import屬性值指定的類導(dǎo)入到頁面中。在轉(zhuǎn)換階段,容器對(duì)使用import屬性聲明的每個(gè)包都轉(zhuǎn)換成頁面實(shí)現(xiàn)類的一個(gè)import語句。可以在一個(gè)import屬性中導(dǎo)入多個(gè)包,包名用逗號(hào)分開即可:

22、 4.3.1 import屬性 為了增強(qiáng)代碼可讀性也可以使用多個(gè)page指令,如上面的page指令也可以寫成: 由于在Java程序中import語句的順序是沒有關(guān)系的,因此這里import屬性的順序也沒有關(guān)系。 容器總是導(dǎo)入java.lang.*、javax.servlet.*、javax.servlet.http.*和javax.servlet.jsp.* 包,所以不必明確地導(dǎo)入它們。4.3.1 import屬性4.3.2 contentType和pageEncoding屬性 contentType屬性用來指定JSP頁面輸出的MIME類型和字符集,MIME類型的默認(rèn)值是text/html,字

23、符集的默認(rèn)值是ISO-8859-1。MIME類型和字符集之間用分號(hào)分隔,如下所示。 如果頁面需要顯示中文,字符集應(yīng)該指定為UTF-8,如下所示。 pageEncoding屬性指定JSP頁面的字符編碼,它的默認(rèn)值為ISO-8859-1。如果設(shè)置了該屬性,則JSP頁面使用該屬性設(shè)置的字符集編碼;如果沒有設(shè)置這個(gè)屬性,則JSP頁面使用contentType屬性指定的字符集。如果頁面中含有中文,應(yīng)該將該屬性值指定為UTF-8,如下: 4.3.2 contentType和pageEncoding屬性4.3.3 session屬性 session屬性指示JSP頁面是否參加HTTP會(huì)話,其默認(rèn)值為true,

24、在這種情況下容器將聲明一個(gè)隱含變量session(將在4.5節(jié)學(xué)習(xí)更多的隱含變量)。如果不希望頁面參加會(huì)話,可以明確地加入下面一行: 4.3.4 errorPage與isErrorPage屬性 在頁面執(zhí)行過程中,嵌入在頁面中的Java代碼可能拋出異常。與一般的Java程序一樣,在JSP頁面中也可以使用try-catch塊處理異常。然而,JSP規(guī)范定義了一種更好的方法,它可以使錯(cuò)誤處理代碼與主頁面代碼分離,從而提高異常處理機(jī)制的可重用性。 在該方法中,JSP頁面使用page指令的errorPage屬性將異常代理給另一個(gè)包含錯(cuò)誤處理代碼的JSP頁面。4.3.4 errorPage與isErrorP

25、age屬性 程序4.5的helloUser.jsp頁面中,errorHandler.jsp被指定為錯(cuò)誤處理頁面。 程序4.5 helloUser.jsp 對(duì)該JSP頁面的請(qǐng)求如果指定了name請(qǐng)求參數(shù)值,該頁面將正常輸出,如果沒有指定name請(qǐng)求參數(shù)值,將拋出一個(gè)異常,但它本身并沒有捕獲異常,而是通過errorPage屬性指示容器將錯(cuò)誤處理代理給頁面errorHandler.jsp。 errorPage的屬性值不必是JSP頁面,它也可以是靜態(tài)的HTML頁面,例如: 顯然,在errorHandler.html文件中不能編寫小腳本或表達(dá)式產(chǎn)生動(dòng)態(tài)信息。4.3.4 errorPage與isError

26、Page屬性 isErrorPage屬性指定當(dāng)前頁面是否作為其他JSP頁面的錯(cuò)誤處理頁面。isErrorPage屬性的默認(rèn)值為false。如上例使用的errorHandler.jsp頁面中該屬性必須明確設(shè)置為true,如下所示。 程序4.6 errorHandler.jsp4.3.4 errorPage與isErrorPage屬性 在這種情況下,容器在頁面實(shí)現(xiàn)類中聲明一個(gè)名為exception的隱含變量。 注意,該頁面僅從異常對(duì)象中檢索信息并產(chǎn)生適當(dāng)?shù)腻e(cuò)誤消息。因?yàn)樵擁撁鏇]有實(shí)現(xiàn)任何業(yè)務(wù)邏輯,所以可以被不同的JSP頁面重用。 一般來說,為所有的JSP頁面中指定一個(gè)錯(cuò)誤頁面是一個(gè)良好的編程習(xí)慣,

27、這可以防止在客戶端顯示不希望的錯(cuò)誤消息。4.3.4 errorPage與isErrorPage屬性 注意:如果不帶參數(shù)請(qǐng)求helloUser.jsp頁面,瀏覽器可能顯示“無法顯示網(wǎng)頁”的頁面。 此時(shí),可以打開“工具”菜單的“Internet選項(xiàng)”對(duì)話框,在“高級(jí)”選項(xiàng)卡中,將“瀏覽”組中的“顯示友好HTTP錯(cuò)誤信息”的復(fù)選框取消,再重新訪問頁面,則顯示JSP頁面中指定的錯(cuò)誤頁面。4.3.4 errorPage與isErrorPage屬性4.3.5 在DD中配置錯(cuò)誤頁面 可以在web.xml文件中為整個(gè)Web應(yīng)用配置錯(cuò)誤處理頁面。使用這種方法還可以根據(jù)異常類型的不同或HTTP錯(cuò)誤碼的不同配置錯(cuò)誤

28、處理頁面。 在DD中配置錯(cuò)誤頁面需要使用元素,它的子元素有,和,它們分別指定處理錯(cuò)誤的異常類型、HTTP錯(cuò)誤碼和錯(cuò)誤處理頁面。前兩個(gè)元素不能同時(shí)出現(xiàn)。 下面代碼聲明了一個(gè)處理算術(shù)異常的錯(cuò)誤頁面。 java.lang.ArithmeticException /error/arithmeticError.jsp 4.3.5 在DD中配置錯(cuò)誤頁面 還可以像下面這樣聲明一個(gè)更通用的處理頁面。 java.lang.Throwable /error/errorPage.jsp Throwable類是所有異常類的根類,因此對(duì)沒有明確指定錯(cuò)誤處理頁面的異常,都將由該頁面處理。4.3.5 在DD中配置錯(cuò)誤頁面

29、以下代碼為HTTP的狀態(tài)碼404配置了一個(gè)錯(cuò)誤處理頁面,如下所示。 404 /error/notFoundError.jsp 注意,元素的值必須以“/”開頭,它是相對(duì)于Web應(yīng)用的上下文根目錄。另外,如果在JSP頁面中使用page指令的errorPage屬性指定了錯(cuò)誤處理頁面,則errorPage屬性指定的頁面優(yōu)先。4.3.5 在DD中配置錯(cuò)誤頁面4.3.6 language與extends屬性 language屬性指定在頁面的聲明、小腳本及表達(dá)式中使用的語言,默認(rèn)值是java。 extends屬性指定頁面產(chǎn)生的Servlet的基類,該屬性僅在希望定制所產(chǎn)生的Servlet類的時(shí)候有用。默認(rèn)的

30、基類是廠商提供的。因此,該屬性很少被使用,下面一行給出了其語法格式: 4.3.7 buffer與autoFlush屬性buffer屬性指定輸出緩沖區(qū)的大小。下面指令將緩沖區(qū)的大小設(shè)置為32kb。 緩沖區(qū)的值是以K字節(jié)為單位且kb是必須的autoFlush屬性指定是否在緩沖區(qū)滿時(shí)自動(dòng)將緩沖區(qū)中的數(shù)據(jù)發(fā)送給客戶,該屬性的默認(rèn)值為true。如果將其設(shè)置為false,而緩沖區(qū)又滿了,那么當(dāng)再向緩沖區(qū)添加數(shù)據(jù)時(shí)會(huì)產(chǎn)生異常。下面將該屬性值設(shè)置為false。 4.3.8 info屬性 info屬性指定一個(gè)字符串值,它可由Servlet調(diào)用getServletInfo()返回。下面代碼給出了一種可能的用法。

31、在頁面中使用腳本檢索該值,該屬性的默認(rèn)值依賴于實(shí)現(xiàn)。4.4 JSP腳本元素 由于聲明、小腳本和表達(dá)式允許在頁面中編寫腳本語言代碼,所以這些元素統(tǒng)稱為腳本元素。 JSP頁面使用Java語言作為腳本語言,因此腳本元素中代碼的編譯和運(yùn)行行為受到Java編程語言的控制。4.4.1 變量的聲明及順序1.聲明的順序 因?yàn)樵贘SP頁面的聲明中定義的變量和方法都變成產(chǎn)生的Servlet類的成員,因此它們?cè)陧撁嬷谐霈F(xiàn)的順序無關(guān)緊要。程序4.7說明了這一點(diǎn)。 程序4.7 area.jsp 在該例中,盡管半徑r、求面積的方法area()是在使用之后定義的,但頁面仍然能夠轉(zhuǎn)換、編譯和運(yùn)行,最后輸出正確結(jié)果,如圖4-2

32、所示。2. 小腳本的順序 由于小腳本被轉(zhuǎn)換成頁面實(shí)現(xiàn)類的_jspService()的一部分,因此小腳本中聲明的變量成為該方法的局部變量,故它們出現(xiàn)的順序很重要,下面代碼說明了這一點(diǎn)。 該例中,s1是在聲明中定義的,它成為頁面實(shí)現(xiàn)類的成員變量,s與s2是在小腳本中聲明的,它們成為_jspService()的局部變量。s2在聲明之前使用,因此該代碼將不能被編譯。3. 變量的初始化 在Java語言中,實(shí)例變量被自動(dòng)初始化為默認(rèn)值,而局部變量使用之前必須明確賦值。因此在JSP聲明中聲明的變量被初始化為默認(rèn)值,而在JSP小腳本中聲明的變量使用之前必須明確初始化,請(qǐng)看下面的代碼。 The value of

33、 i is The value of j is 變量i是使用聲明()聲明的,它成為產(chǎn)生的Servlet類的實(shí)例變量并被初始化為0。變量j是使用小腳本()聲明的,它變成產(chǎn)生的_jspService()的局部變量并沒有被初始化。 由于Java要求局部變量在使用之前明確初始化,因此上述代碼是非法的且不能編譯。 需要注意的是,實(shí)例變量是在容器實(shí)例化Servlet時(shí)被創(chuàng)建的并只被初始化一次,因此在JSP聲明中聲明的變量在多個(gè)請(qǐng)求中一直保持它們的值。而局部變量對(duì)每個(gè)請(qǐng)求都創(chuàng)建和銷毀一次,因此在小腳本中聲明的變量在多個(gè)請(qǐng)求中不保持其值,而是在JSP容器每次調(diào)用_jspService()時(shí)被重新初始化。 要使

34、上面的代碼能夠編譯,可以像下面這樣初始化變量j。 如果多次訪問上面頁面,i的值將每次增1,輸出一個(gè)新值,而j的值總是輸出1。3. 變量的初始化4.4.2 使用條件和循環(huán)語句 小腳本用來在JSP頁面中嵌入計(jì)算邏輯,通常這種邏輯包含條件和循環(huán)語句。例如,下面的腳本代碼使用了條件語句檢查用戶的登錄狀態(tài),并基于該狀態(tài)顯示適當(dāng)?shù)南ⅰ?% String username = request.getParameter(username); String password = request.getParameter(password); boolean isLoggedIn = false;if(user

35、name.equals(admin)&password.equals(admin) isLoggedIn = true; else isLoggedIn = false; if(isLoggedIn) out.print(歡迎你,+username+訪問該頁面!); else out.println(你還沒有登錄!); out.println(登錄); % 4.4.2 使用條件和循環(huán)語句 如果在條件語句中包含大量HTML代碼,可以使條件語句跨越JSP頁面多個(gè)小腳本,從而避免書寫多個(gè)out.println()語句。 歡迎你, 訪問該頁面! 這里可包含其他HTML代碼! 4.4.2 使用條

36、件和循環(huán)語句 你還沒有登錄! 登錄 這里可包含其他HTML代碼! 上面的代碼段中,if-else語句跨越三段小腳本。運(yùn)行時(shí),如果變量的值為true,則將第一和第二段小腳本之間的HTML代碼包含在輸出中,如果該值為false,則將第二和第三段小腳本之間的HTML代碼包含在輸出中。4.4.2 使用條件和循環(huán)語句 注意,大括號(hào)的用途是標(biāo)記Java編程語言的代碼塊的開始和結(jié)束。忽略大括號(hào)可能在編譯時(shí)產(chǎn)生錯(cuò)誤,在運(yùn)行時(shí)引起未知行為,例如代碼: 歡迎你, 訪問該頁面! 將被轉(zhuǎn)換成: if (isLoggedIn) out.write(歡迎你,); out.print(username); out.writ

37、e(訪問該頁面!);4.4.2 使用條件和循環(huán)語句 與條件語句一樣,循環(huán)語句也可以跨越多段小腳本,使常規(guī)的HTML代碼段處于小腳本之間。下面例子使用循環(huán)計(jì)算并輸出100以內(nèi)的素?cái)?shù)。 程序4.8 prime.jsp 該頁面運(yùn)行結(jié)果如圖4-3所示。 上述代碼使用兩段小腳本把HTML代碼包含在循環(huán)中,然后使用JSP表達(dá)式輸出素?cái)?shù)n,之后輸出兩個(gè)空格。4.4.2 使用條件和循環(huán)語句4.4.3 請(qǐng)求時(shí)屬性表達(dá)式的使用 JSP表達(dá)式并不總是寫到頁面的輸出流中,它們也可以用來向JSP動(dòng)作傳遞屬性值,例如: jsp:include page= / 在該例中,JSP表達(dá)式的值并不發(fā)送到輸出流,而是在請(qǐng)求時(shí)計(jì)算出

38、該值,然后將它賦給動(dòng)作的page屬性。以這種方式向動(dòng)作傳遞一個(gè)屬性值使用的表達(dá)式稱為請(qǐng)求時(shí)屬性表達(dá)式。4.4.3 請(qǐng)求時(shí)屬性表達(dá)式的使用 注意,請(qǐng)求時(shí)屬性表達(dá)式不能用在指令的屬性中,因?yàn)橹噶罹哂修D(zhuǎn)換時(shí)的語義,即容器僅在頁面轉(zhuǎn)換期間使用指令。因此,下例中的指令是非法的: % include file= %4.5 JSP隱含變量 在JSP頁面的轉(zhuǎn)換階段,Web容器在_jspService()中聲明并初始化一些變量,可以在JSP頁面小腳本中或表達(dá)式中直接使用這些變量,例如: % out.print(Hello World! ); % 該段小腳本中使用out對(duì)象的print()輸出一個(gè)字符串。out對(duì)

39、象是由容器隱含聲明的,所以一般被稱為隱含對(duì)象隱含對(duì)象(implicit objects),這些對(duì)象是由容器創(chuàng)建,可象變量一樣使用,因此也被叫做隱隱含變量含變量(implicit variables)。表4-4 JSP頁面中可使用的隱含變量 以todayDate.jsp頁面為例,在轉(zhuǎn)換階段,Web容器自動(dòng)將該頁面轉(zhuǎn)換成一個(gè)名為todayDate_jsp.java的類文件,該文件位于workCatalinalocalhosthelloweborgapachejsp目錄中,該文件就是JSP頁面實(shí)現(xiàn)類。 程序4.9 todayDate_jsp.java 可以看到在_jspService中聲明了8個(gè)變量

40、(加粗字體表示的)。4.5 JSP隱含變量 如果一個(gè)頁面是錯(cuò)誤處理頁面,即頁面中包含下面的page指令。 則頁面實(shí)現(xiàn)類中將自動(dòng)聲明一個(gè)exception隱含變量,如下所示。 Throwable exception = (Throwable) request.getAttribute (javax.servlet.jsp.jspException); 下面詳細(xì)討論這9個(gè)隱含變量的使用。 注意,這些隱含變量只能在JSP的小腳本和表達(dá)式中使用。4.5 JSP隱含變量4.5.1 request與response變量 request是HttpServletRequest類型的隱含變量,response是

41、HttpServletResponse類型的隱含變量,當(dāng)頁面的Servlet向客戶提供服務(wù)時(shí),它們作為參數(shù)傳遞給_jspService()。 在JSP頁面中使用它們與在Servlet中使用完全一樣,即用來分析請(qǐng)求和發(fā)送響應(yīng),如下代碼所示。 4.5.1 request與response變量 你的IP地址為: 你的主機(jī)名為:4.5.2 out變量 out是javax.servlet.jsp.JspWriter類型的隱含變量,打印輸出所有的基本數(shù)據(jù)類型、字符串以及用戶定義的對(duì)象。可以在小腳本中直接使用它,也可在表達(dá)式中間接使用它產(chǎn)生HTML代碼,例如: 對(duì)上面兩行代碼,在頁面實(shí)現(xiàn)類中都使用out.p

42、rint()語句輸出。 下面的腳本使用out變量的print()打印輸出不同類型的數(shù)據(jù)。 0); out.print(anInt*3.5/100-500); out.print(aFloatObj); out.print(aFloatObj.floatValue(); out.print(aFloatObj.toString(); %4.5.2 out變量4.5.3 application變量 application是javax.servlet.ServletContext類型的隱含變量,它是JSP頁面所在的Web應(yīng)用程序的上下文的引用(ServletContext接口),下面兩段小腳本是等價(jià)

43、的。4.5.3 application變量 4.5.4 session變量 session是javax.servlet.http.HttpSession類型的隱含變量,它在JSP頁面中表示會(huì)話對(duì)象。要使用會(huì)話對(duì)象,必須要求JSP頁面參加HTTP會(huì)話,即要求將JSP頁面的page指令的session屬性值設(shè)置為true。 默認(rèn)情況下,session屬性的值為true。如果明確將session屬性設(shè)置為false,容器將不會(huì)聲明該變量,對(duì)該變量的使用將產(chǎn)生錯(cuò)誤,如下所示。 會(huì)話ID = 4.5.5 pageContext變量 pageContext是javax.servlet.jsp.PageCo

44、ntext類型的隱含變量,它是一個(gè)頁面上下文對(duì)象。PageContext類是一個(gè)抽象類,容器廠商提供了一個(gè)具體子類(如JspContext),它有下面三個(gè)作用。 4.5.5 pageContext變量 (1)存儲(chǔ)隱含對(duì)象的引用。pageContext對(duì)象是作為管理所有在JSP頁面中使用的其他對(duì)象的一個(gè)地方,包括用戶定義的和隱含的對(duì)象,并且它提供了一個(gè)訪問方法來檢索它們。 (2)提供了在不同作用域內(nèi)返回或設(shè)置屬性的方便的方法。 (3)提供了forward()和include()實(shí)現(xiàn)將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)資源和將一個(gè)資源的輸出包含到當(dāng)前頁面中的功能,它們的格式如下。 public void inclu

45、de(String relativeURL):將另一個(gè)資源的輸出包含在當(dāng)前頁面的輸出中,與RequestDispatcher()接口的include()功能相同。 public void forward(String relativeURL):將請(qǐng)求轉(zhuǎn)發(fā)到參數(shù)指定的資源,與RequestDispatcher接口的forward()功能相同。4.5.5 pageContext變量 例如,從Servlet中將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)資源,需要寫下面兩行代碼。 RequestDispatcher rd = request.getRequestDispatcher(other.jsp); rd.forward

46、(request, response); 在JSP頁面中,通過使用pageContext變量僅需一行就可以完成上述功能。 pageContext.forward(other.jsp);4.5.5 pageContext變量 4.5.6 page變量 page變量是java.lang.Object類型的對(duì)象,聲明如下 Object page = this; 它指的是生成的Servlet實(shí)例,該變量很少被使用。4.5.7 config變量 config是javax.servlet.ServletConfig類型的隱含變量。可通過DD文件為Servlet傳遞一組初始化參數(shù),然后在Servlet中使用

47、ServletConfig對(duì)象檢索這些參數(shù)。 類似地,也可以為JSP頁面?zhèn)鬟f一組初始化參數(shù),這些參數(shù)在JSP頁面中可以使用config隱含變量來檢索。4.5.7 config變量 要實(shí)現(xiàn)這一點(diǎn),應(yīng)首先在DD文件web.xml中使用聲明一個(gè)Servlet,然后,使用元素使其與JSP文件關(guān)聯(lián)。對(duì)該命名的Servlet的所有的初始化參數(shù)就可以在JSP頁面中通過config隱含變量使用。 initTestServlet /initTest.jsp/initTest.jsp company Beijing New Techonology CO.,LTD email initTestServlet /in

48、itTest.jsp 4.5.7 config變量 代碼聲明了一個(gè)名為initTestServlet的Servlet并將它映射到/initTest.jsp文件,同時(shí)為該Servlet指定了company和email初始化參數(shù),該參數(shù)在initTest.jsp文件中使用隱含變量config檢索到,如下所示。 公司名稱: 郵箱地址:4.5.7 config變量4.5.8 exception變量 exception是java.lang.Throwable類型的隱含變量,它被用來作為其他頁面的錯(cuò)誤處理器。為使頁面能夠使用exception變量,必須在page指令中將isErrorPage的屬性值設(shè)置為

49、true,如下所示。 程序4.10 errorPage.jsp 該頁面中,將page指令的isErrorPage屬性設(shè)置為true,容器明確定義了exception變量。該變量指向使用該頁面作為錯(cuò)誤處理器的頁面拋出的未捕獲的java.lang.Throwable對(duì)象。4.6 作用域?qū)ο?在JSP頁面中有四個(gè)作用域?qū)ο螅鼈兊念愋头謩e是ServletContext、HttpSession、HttpServletRequest和PageContext,這四個(gè)作用域分別稱為: 應(yīng)用(application)作用域 會(huì)話(session)作用域 請(qǐng)求(request)作用域 頁面(page)作用域,

50、如表4-5所示。 4.6 作用域?qū)ο?在JSP頁面中,所有的隱含對(duì)象以及用戶定義的對(duì)象都處于這四種作用域之一,這些作用域定義了對(duì)象存在性和從JSP頁面和Servlet中的可訪問性。 應(yīng)用作用域?qū)ο缶哂凶畲蟮脑L問作用域,頁面作用域?qū)ο缶哂凶钚〉脑L問作用域。 表4-5 JSP作用域?qū)ο?.6 作用域?qū)ο?.6.1 應(yīng)用作用域 存儲(chǔ)在應(yīng)用作用域的對(duì)象可被Web應(yīng)用程序的所有組件共享并在應(yīng)用程序生命期內(nèi)都可以訪問。這些對(duì)象是通過ServletContext實(shí)例作為“屬性/值”對(duì)維護(hù)的。 在JSP頁面中,該實(shí)例可以通過隱含對(duì)象application訪問。因此,要在應(yīng)用程序級(jí)共享對(duì)象,可以使用Servle

51、tContext接口的setAttribute()和getAttribute()。4.6.1 應(yīng)用作用域 例如,在Servlet使用下面代碼將對(duì)象存儲(chǔ)在應(yīng)用作用域中: Float one = new Float(42.5) ; ServletContext context = getServletContext(); context.setAttribute(foo, one); 在JSP頁面中就可使用下面代碼訪問context中數(shù)據(jù): 4.6.2 會(huì)話作用域 存儲(chǔ)在會(huì)話作用域的對(duì)象可以被屬于一個(gè)用戶會(huì)話的所有請(qǐng)求共享并只能在會(huì)話有效時(shí)才可被訪問。 這些對(duì)象是通過HttpSession類的一個(gè)

52、實(shí)例作為“屬性/值”對(duì)維護(hù)的。在JSP頁面中該實(shí)例可以通過隱含對(duì)象session訪問。 因此,要在會(huì)話級(jí)共享對(duì)象,可以使用HttpSession接口的setAttribute()和getAttribute()。 4.6.2 會(huì)話作用域 在購物車應(yīng)用中,用戶的購物車對(duì)象就應(yīng)該存放在會(huì)話作用域中,它在整個(gè)的用戶會(huì)話中共享。 HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart)sessionsession.getAttribute(cart); if (cart = null) cart

53、= new ShoppingCart(); / 將購物車存儲(chǔ)到會(huì)話對(duì)象中 sessionsession.setAttribute(cart, cart); 4.6.3 請(qǐng)求作用域 存儲(chǔ)在請(qǐng)求作用域的對(duì)象可以被處理同一個(gè)請(qǐng)求的所有組件共享并僅在該請(qǐng)求被服務(wù)期間可被訪問。這些對(duì)象是由HttpServletRequest對(duì)象作為“屬性/值”對(duì)維護(hù)的。 在JSP頁面中,該實(shí)例是通過隱含對(duì)象request的形式被使用的。通常,在Servlet中使用請(qǐng)求對(duì)象的setAttribute()將一個(gè)對(duì)象存儲(chǔ)到請(qǐng)求作用域中,然后將請(qǐng)求轉(zhuǎn)發(fā)到JSP頁面,在JSP頁面中通過腳本或EL取出作用域中的對(duì)象。4.6.3 請(qǐng)

54、求作用域 例如,下面代碼在Servlet中創(chuàng)建一個(gè)User對(duì)象并存儲(chǔ)在請(qǐng)求作用域中,然后將請(qǐng)求轉(zhuǎn)發(fā)到valid.jsp頁面。User user = new User();user.setName(request.getParameter(name);user.setPassword(request.getParameter(password)request.setAttribute(user, user);RequestDispatcher rd = request.getRequestDispatcher(/valid.jsp);rd.forward(request,response); 下

55、面是valid.jsp文件:4.6.3 請(qǐng)求作用域 這里,valid.jsp頁面根據(jù)數(shù)據(jù)庫驗(yàn)證用戶信息,最后根據(jù)驗(yàn)證處理的結(jié)果,或者將對(duì)象傳輸給會(huì)話作用域并將請(qǐng)求轉(zhuǎn)發(fā)給account.jsp,或者將請(qǐng)求轉(zhuǎn)發(fā)給loginError.jsp,它可以使用User對(duì)象產(chǎn)生一個(gè)適當(dāng)?shù)捻憫?yīng)。4.6.3 請(qǐng)求作用域4.6.4 頁面作用域 存儲(chǔ)在頁面作用域的對(duì)象只能在它們所定義的轉(zhuǎn)換單元中被訪問。這些對(duì)象是由PageContext抽象類的一個(gè)具體子類的一個(gè)實(shí)例通過屬性/值對(duì)維護(hù)的。 在JSP頁面中,該實(shí)例可以通過隱含對(duì)象pageContext訪問。 為在頁面作用域中共享對(duì)象,可以使用javax.servlet

56、.jsp.PageContext定義的兩個(gè)方法,其格式如下: public void setAttribute(String name , Object value) public Object getAttribute(String name ) 下面代碼設(shè)置一個(gè)頁面作用域的屬性: 下面代碼獲得一個(gè)頁面作用域的屬性: 4.6.4 頁面作用域 PageContext類中還定義了幾個(gè)常量和其他屬性處理方法,使用它們可以方便地處理不同作用域的屬性。該類定義的常量有: public static final int APPLICATION_SCOPE,表示application作用域。 public

57、 static final int SESSION_SCOPE,表示session作用域。4.6.4 頁面作用域 public static final int REQUEST_SCOPE,表示request作用域。 public static final int PAGE_SCOPE,表示page作用域。4.6.4 頁面作用域 該類定義的方法有: public void setAttribute(String name, Object object, int scope):在指定的作用域中設(shè)置屬性。 public Object getAttribute(String name, int sc

58、ope):返回在指定作用域中名為name的對(duì)象,沒有找到則返回null。4.6.4 頁面作用域 public Object findAttribute(String name):查找指定名稱的屬性值。查找順序?yàn)轫撁孀饔糜颉⒄?qǐng)求作用域、會(huì)話作用域(若有效)、應(yīng)用作用域。 public int getAttributesScope(String name):返回給定屬性的作用域。4.6.4 頁面作用域 下面是使用pageContext設(shè)置和返回屬性的示例。 使用pageContext設(shè)置一個(gè)會(huì)話作用域的屬性: 4.6.4 頁面作用域 使用pageContext獲得一個(gè)會(huì)話作用域的屬性: 上面一行等

59、價(jià)于: 4.6.4 頁面作用域 使用pageContext獲得一個(gè)應(yīng)用作用域的屬性: Email is: 上述代碼等價(jià)于: Email is: 使用pageContext,即使不知道作用域也可以查找一個(gè)屬性,例如:4.6.4 頁面作用域4.7 JSP組件包含 代碼的可重用性是軟件開發(fā)的一個(gè)重要原則。使用可重用的組件可提高應(yīng)用程序的生產(chǎn)率和可維護(hù)性。JSP規(guī)范定義了一些允許重用Web組件的機(jī)制,其中包括在JSP頁面中包含另一個(gè)Web組件的內(nèi)容或輸出。這可通過兩種方式之一實(shí)現(xiàn):靜態(tài)包含或動(dòng)態(tài)包含。4.7.1 靜態(tài)包含:include指令 靜態(tài)包含是在JSP頁面轉(zhuǎn)換階段將另一個(gè)文件的內(nèi)容包含到當(dāng)前J

60、SP頁面中。使用JSP的include指令完成這一功能,它的語法為: file屬性是include指令唯一的屬性,它是指被包含的文件。文件使用相對(duì)路徑指定,相對(duì)路徑或者以斜杠(/)開頭,是相對(duì)于Web應(yīng)用程序文檔根目錄的路徑,或者不以斜杠開頭,它是相對(duì)于當(dāng)前JSP文件的路徑。被包含的文件可以是任何基于文本的文件,如HTML、JSP、XML文件,甚至是簡單的TXT文件。 圖4-4 使用include指令的靜態(tài)包含圖4-4說明了include指令的工作方式 由于被包含JSP頁面的代碼成為主頁面代碼的一部分,因此,每個(gè)頁面都可以訪問在另一個(gè)頁面中定義的變量。它們也共享所有的隱含變量,如程序4.11所示。

溫馨提示

  • 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)論