Java Web開發(fā)實戰(zhàn)—JSP詳解—JSP概述、JSP腳本元素、JSP指令元素、JSP動作元素、
時間:2023-08-29 19:48:01 | 來源:網(wǎng)站運營
時間:2023-08-29 19:48:01 來源:網(wǎng)站運營
Java Web開發(fā)實戰(zhàn)—JSP詳解—JSP概述、JSP腳本元素、JSP指令元素、JSP動作元素、JSP內(nèi)置對象:本文主要講解了JSP的相關知識,包括JSP的概念、工作原理,JSP腳本元素、JSP指令元素、JSP動作元素、JSP內(nèi)置對象等。通過學習,大家要能夠理解JSP在Web開發(fā)中的角色,理解JSP的工作原理,掌握JSP的語法,熟練應用指令元素、動作元素、內(nèi)置對象等完成JSP開發(fā)。
JSP概述2
JSP簡介JSP的全稱是Java Server Pages,是為了簡化Servlet的工作而出現(xiàn)的動態(tài)網(wǎng)頁開發(fā)技術。它在HTML代碼中嵌入Java代碼片段和JSP標簽,構成JSP頁面。其中,HTML代碼用于顯示靜態(tài)內(nèi)容,Java代碼片段用于顯示動態(tài)內(nèi)容,這就避免了直接使用Servlet逐句響應HTML頁面的煩瑣,同時降低了代碼冗余。
例如,現(xiàn)在編寫一個登錄程序,要求該程序能夠根據(jù)用戶名生成相應的歡迎信息。當?shù)卿浻脩魹閤iaoqian時,頁面顯示“Hello,xiaoqian”,當?shù)卿浻脩魹閤iaofeng時,頁面顯示“Hello,xiaofeng”,下面將通過Servlet和JSP分別實現(xiàn)這個功能,步驟如下。
(1)打開Eclipse,新建Web工程chapter09,在工程chapter09的WebContent目錄下創(chuàng)建login.html,具體代碼如書中例9.1所示。
2)在工程chapter09的src目錄下創(chuàng)建com.qfedu.example包,在該包下新建一個Servlet類TestJSP01,具體代碼如書中例9.2所示。
(3)在工程chapter09的WebContent目錄下新建jsp目錄,右擊jsp目錄,在彈出的菜單中選擇NEW→JSP File選項,彈出New JSP File窗口,如圖所示。
(4)在File name文本框中輸入hello.jsp,單擊Finish按鈕完成創(chuàng)建。hello.jsp創(chuàng)建完成后的界面如圖所示。
(5)在hello.jsp文件中的<body>元素中輸入如書中例9.3所示。
代碼中,“<%@ page %>”是JSP文件的一個指令,用于設置JSP文件的頁面屬性,其中,language屬性指定所使用的語言,contentType屬性指定服務器響應的內(nèi)容類型,charset屬性指定JSP頁面的編碼。JSP文件中大部分是HTML代碼,在HTML代碼的<body>元素中,使用<% %>聲明一段Java腳本,腳本使用request對象獲取表單提交的用戶信息。
(6)將工程chapter09添加到Tomcat服務器中,啟動Tomcat服務器,打開瀏覽器,訪問http://localhost:8080/chapter09/login.html,瀏覽器顯示的頁面如圖1所示。
(7)在“用戶名”文本框中輸入xiaoqian,在“密碼”文本框中輸入12345,單擊“提交”按鈕,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,TestJSP01以HTML頁面的形式將用戶信息返回。通過分析發(fā)現(xiàn),TestJSP01在獲取表單提交的信息后,必須調(diào)用PrintWriter類的println()方法,才能把結果響應為客戶端能夠解析的HTML頁面。
(8)打開login.html文件,將<form>元素的action屬性修改為:action=“/chapter09/jsp/hello.jsp”,重啟瀏覽器,重新訪問login.html,瀏覽器出現(xiàn)如圖1所示的頁面,在對應的文本框中分別輸入xiaoqian和12345,單擊提交按鈕。
瀏覽器顯示的頁面如圖所示。
從圖中可以看出,hello.jsp實現(xiàn)了和TestJSP01類同樣的功能,它不僅直接兼容HTML代碼,還能獲取Java代碼片段中傳輸?shù)膬?nèi)容。
(9)點擊瀏覽器菜單欄中的“查看”→“源文件”命令,這時可看到JSP頁面執(zhí)行結果的源代碼,如圖所示。
從圖中可以看到,hello.jsp頁面中的<% %>腳本被解釋成了HTML內(nèi)容。
2
JSP工作原理JSP的引入避免了Servlet編寫頁面的煩瑣,并且降低了開發(fā)人員的編碼量。為了更好地使用JSP進行Web開發(fā),大家必須深入理解JSP的工作原理。
作為一種服務器端的頁面開發(fā)技術,JSP運行在服務器中,它本質(zhì)上是一種Servlet類,因此要被轉(zhuǎn)換成Servlet類后才能編譯運行。當客戶端訪問JSP頁面時,服務器的處理過程如圖所示。
圖 JSP頁面的執(zhí)行過程
從圖中可以看出JSP的執(zhí)行過程,具體來講,可以細分為以下幾個步驟。
(1)客戶端向服務器發(fā)送請求,訪問JSP頁面。
(2)服務器接到請求后檢索對應的JSP頁面,如果該JSP頁面是第一次被請求,那么服務器會將此頁面中的靜態(tài)數(shù)據(jù)(HTML文本)和動態(tài)數(shù)據(jù)(Java元素)全部轉(zhuǎn)化為Java代碼,使JSP文件轉(zhuǎn)換成一個Servlet類文件。在轉(zhuǎn)換過程中,服務器若發(fā)現(xiàn)JSP文件中存在語法錯誤,則會中斷轉(zhuǎn)換過程,并向客戶端返回出錯信息。
(3)服務器將轉(zhuǎn)換后的Servlet源代碼編譯成字節(jié)碼文件(.class),對于Tomcat服務器而言,生成的字節(jié)碼文件默認存放在Tomcat安裝目錄的work目錄下。
(4)編譯后的字節(jié)碼文件被加載到內(nèi)存中執(zhí)行,并根據(jù)用戶的請求生成HTML格式的響應內(nèi)容。
(5)服務器將響應內(nèi)容發(fā)送回客戶端。
這里要注意的是,Tomcat服務器能夠自動檢測JSP頁面的改動。當同一個JSP頁面再次被請求時,只要該JSP頁面沒有被修改,服務器就會直接調(diào)用已裝載的字節(jié)碼文件,不會執(zhí)行轉(zhuǎn)換和編譯的過程,如果該JSP頁面被修改,那么服務器會重新執(zhí)行轉(zhuǎn)換、編譯、執(zhí)行的整個過程。
2
JSP基本結構JSP頁面就是帶有JSP元素的常規(guī)Web頁面,它由模板文本和JSP元素組成。
模板文本主要是指HTML代碼,它的內(nèi)容是固定的,既不會控制程序的流程,也不影響程序運行的結果。JSP元素是指JSP中的Java部分,它能夠影響程序的流程,包括JSP腳本元素、JSP指令以及JSP動作元素等。
在處理一個JSP頁面請求時,模板文本和JSP元素生成的內(nèi)容會合并,合并后的結果作為響應內(nèi)容發(fā)送給瀏覽器。
JSP腳本元素腳本元素是JSP中使用最頻繁的元素,它允許開發(fā)者將Java代碼片段添加到JSP頁面中。所有的可執(zhí)行的Java代碼,都可以通過JSP腳本來執(zhí)行。JSP腳本元素包括表達式、腳本片段、聲明和注釋等。
2
JSP表達式JSP表達式可以直接把Java的表達式結果輸出到JSP頁面中。因為網(wǎng)頁中顯示的文字都是字符串,所以表達式的最終運算結果將被轉(zhuǎn)化為字符串類型。JSP表達式的語法格式如下。
<%= 表達式 %>
其中,表達式必須能夠直接求值,“<%=”是一個完整的符號,“<%” 和“=”之間不能有空格,表達式結尾處不加分號。
接下來通過一個實例來演示JSP表達式的使用,具體步驟如下。
(1)打開Eclipse,選擇工程chapter09,在WebContent目錄的jsp目錄下新建test01.jsp。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test01.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,test01.jsp成功地返回表達式的值。
2
JSP腳本片段JSP腳本片段是指用“<%”和“%>”括起來的一段Java代碼。開發(fā)者需要在JSP中使用一段Java代碼實現(xiàn)復雜操作時,就要用到JSP腳本片段。JSP腳本片段的語法格式如下。
<% Java 代碼 %>
其中,Java代碼可以包含變量、方法、表達式等。如果去掉“<%”和“%>”,Java代碼的內(nèi)容將被視為模板文本,直接返回到客戶端。
接下來通過一個實例來演示JSP腳本片段的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test02.jsp。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test02.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,test02.jsp成功地返回Java代碼片段的執(zhí)行結果。
2
JSP聲明JSP聲明用于聲明變量和方法,在JSP的聲明語句中定義的變量和方法將在JSP頁面初始化時進行初始化。在JSP中聲明語句的語法格式如下。
<%! 變量或方法的定義語句 %>
其中,“<%!”和“%>”標記之間用于放置Java變量或方法的定義語句。變量的類型可以是Java語言提供的任意類型,使用JSP聲明語句定義的變量
將來會被轉(zhuǎn)換成Servlet類中的成員變量,這些變量在整個JSP頁面內(nèi)都有效。使用JSP聲明語言定義的方法將來會被轉(zhuǎn)換成Servlet類中的成員方法,當方法被調(diào)用時,方法內(nèi)定義的變量被分配內(nèi)存,調(diào)用完畢后即釋放所占的內(nèi)存。
接下來通過一個實例來演示JSP聲明的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test03.jsp。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test03.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,test03.jsp成功返回變量a的值和方法getString()的執(zhí)行結果。
(3)刷新瀏覽器,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,變量a的值增加了1,這說明變量a被服務器轉(zhuǎn)換為Servlet的成員變量,它只在創(chuàng)建Servlet實例時被初始化一次,此后,該變量的值一直被保存,直到該Servlet實例被銷毀掉。
2
JSP注釋在JSP頁面中可以使用“<%-- --%>”的方式來注釋, JSP注釋的語法格式如下。
<%-- JSP注釋 --%>
使用JSP注釋之后,服務器把JSP文件轉(zhuǎn)換成Servlet類時會忽略“<%-- ”和“--%>”之間的內(nèi)容,不會把這些內(nèi)容響應到客戶端。
接下來通過一個實例來演示JSP注釋的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test04.jsp,代碼如書中例9.8所示。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test04.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,test04.jsp沒有返回JSP注釋的內(nèi)容。
(3)在瀏覽器的菜單欄選擇“查看”→“源文件”命令,這時可看到JSP頁面執(zhí)行結果的源代碼,如圖所示。
從圖中可以看出,JSP注釋的內(nèi)容沒有在源文件中顯示。
在JSP頁面中,除了JSP注釋之外,有時會出現(xiàn)HTML注釋,HTML注釋以“<!--”開始,以“-->”結束,中間包含的內(nèi)容即為注釋部分,其語法格式如下。
在JSP轉(zhuǎn)換為Servlet類的過程中,服務器不會忽略HTML注釋的內(nèi)容,而是最終將這些內(nèi)容響應給客戶端。由于客戶端能夠“理解”HTML注釋,因此HTML的內(nèi)容不會被顯示到瀏覽器頁面。
接下來通過一個實例來演示HTML注釋的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test05.jsp,代碼如書中例9.9所示。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test05.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,由于瀏覽器能夠“理解”HTML注釋,因此test05.jsp沒有返回HTML注釋的內(nèi)容。
(3)在瀏覽器的菜單欄中選擇“查看”→“源文件”命令,這時可看到JSP頁面執(zhí)行結果的源代碼,如圖所示。
從圖中可以看出,HTML注釋的內(nèi)容顯示在JSP頁面執(zhí)行結果的源代碼中。
JSP指令元素JSP指令元素用于向服務器提供編譯信息,例如編碼方式、文檔信息等。一般情況下,JSP指令元素在當前的整個頁面范圍內(nèi)有效,且不向客戶端產(chǎn)生任何輸出。JSP指令元素包括page指令、include指令和taglib指令。
2
page指令page指令又被稱為頁面指令,用于設置和JSP頁面相關的信息,如導入所需類包、指明輸出內(nèi)容類型等。page指令一般位于JSP頁面的開頭部分,其語法格式如下。
<%@ page 屬性名1=”屬性值1” 屬性名2=”屬性值2” ……%>
在page指令的屬性中,除了import屬性外,每種屬性只能出現(xiàn)一次。page指令提供了一系列與JSP頁面相關的屬性,如表9.1所示。
表9.1 page指令的常用屬性
屬性名 | 說明 |
language | 指定JSP頁面使用的腳本語言,默認為Java |
import | 指定導入的Java軟件包或類名列表,若有多個類,中間用逗號隔開 |
extends | 指定JSP頁面轉(zhuǎn)換產(chǎn)生的servlet類繼承的父類 |
session | 指定JSP頁面中是否可以使用Session對象,默認為TRUE |
buffer | 指定輸出緩沖區(qū)的大小,默認值為8K |
autoFlush | 指定輸出緩沖區(qū)即將溢出時,是否強制輸出緩沖區(qū)的內(nèi)容 |
isThreadSafe | 指定JSP頁面是否支持多線程 |
errorPage | 指定JSP頁面發(fā)生異常時重新指向的頁面URL |
isErrorPage | 指定JSP頁面是否為處理異常的頁面,默認值為FALSE |
isELIgnored | 指定JSP頁面是否忽略El表達式,默認值為FALSE |
contentType | 指定JSP頁面的編碼格式和JSP頁面響應的MIME類型 |
pageEncoding | 指定JSP頁面編碼格式 |
接下來通過一個實例演示page指令的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test06.jsp,為該頁面指定發(fā)生異常時重新跳轉(zhuǎn)的頁面,具體代碼如書中例9.10所示。
在代碼中,page指令的errorPage屬性為該頁面指定了一個處理異常的頁面,這個處理異常的頁面為error.jsp。
(2)在WebContent目錄的jsp目錄下新建error.jsp,具體代碼如書中例9.11所示。
(3)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test06.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,當test06.jsp發(fā)生異常時,它會自動跳轉(zhuǎn)到error.jsp頁面。
2
include指令include指令又被稱為文件加載指令,用于在JSP文件中插入一個包含文本或代碼的文件。它把插入文本或代碼的文件后與原來的JSP文件合并成一個新的JSP文件。
include指令的語法格式如下。
<%@ include file=”被包含文件的地址” %>
include指令只有一個file屬性,該屬性用來指定插入到JSP頁面的文件,這個文件必須遵循JSP語法,file屬性的值一般是該文件的相對路徑。
接下來通過一個實例來演示include指令的使用方法,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test07.jsp。
(2)在WebContent目錄的jsp目錄下新建test08.jsp。
在代碼中,include指令為test08.jsp引入了test07.jsp文件,在執(zhí)行過程中,這兩個JSP文件會合成一個新的JSP文件。
(3)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test08.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,當訪問test08.jsp時,它所引入的test07.jsp的內(nèi)容同樣也被顯示。
2
taglib指令taglib指令用于指定JSP頁面使用的標簽庫,通過該指令可以在JSP頁面中使用標簽庫中的標簽。
taglib指令的語法格式如下。
<%@ taglib uri=”標簽庫URI” prefix=”標簽前綴” %>
其中,uri指定描述這個標準庫位置的URI,可以是相對路徑或絕對路徑;prefix指定使用標簽庫中標簽的前綴。
JSP動作元素JSP動作元素用于控制JSP的行為,執(zhí)行一些常用的JSP頁面動作,利用JSP頁面動作可以實現(xiàn)很多功能,例如動態(tài)插入文件、重用JavaBean組件、重定向頁面等。
JSP中的動作元素主要包含以下幾種。
l <jsp:include>;
l <jsp:forward>;
l <jsp:param>;
l <jsp:useBean>;
l <jsp:setProperty>;
l <jsp:getProperty>。
接下來將對JSP的常用動作元素作詳細講解。
2
<jsp:include>動作元素<jsp:include>動作元素提供了一種在JSP中包含頁面的方式,既可以包含靜態(tài)文件,也可以包含動態(tài)文件。
JSP包含頁面,是指當JSP頁面運行時才會載入該文件,并不是簡單地將被包含文件與JSP頁面合并成一個新的JSP頁面。如果包含的文件是文本文件,運行時只需將該文件內(nèi)容發(fā)送到客戶端,由客戶端負責顯示;如果包含的文件是JSP文件,服務器就執(zhí)行這個文件,然后將執(zhí)行結果發(fā)送到客戶端并顯示出來。
<jsp:include>動作元素的語法格式為如下。
<jsp:include page=”relative URL” flush=”true”/>
其中,page屬性指定被包含文件的URL地址,是一個相對路徑;flush屬性指定當緩沖區(qū)滿時,是否將其清空,其默認值為false。
include指令和<jsp:include>動作元素都能包含一個文件,但它們之間有很大的區(qū)別,具體如下。
l include指令在轉(zhuǎn)換階段就引入所包含的文件,被包含的文件在邏輯和語法上依賴于當前的JSP頁面。
l <jsp:include>動作元素是在JSP頁面運行時才引入被包含文件產(chǎn)生的響應文本,被包含的文件在邏輯和語法上獨立于當前JSP頁面。
接下來通過一個實例來演示<jsp:include>動作元素的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test09.jsp。
在代碼中,<jsp:include>動作元素為test09.jsp引入了test07.jsp文件。
(2)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test09.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,當訪問test09.jsp時,它所引入的test07.jsp的內(nèi)容同樣也被顯示。
從前面的講解中,大家可以看到,include指令和<jsp:include>動作元素都能包含一個文件,但它們之間有很大的區(qū)別,具體如下。
include指令在轉(zhuǎn)換階段就引入所包含的文件,被包含的文件在邏輯和語法上依賴于當前的JSP頁面。
<jsp:include>動作元素是在JSP頁面運行時才引入被包含的文件產(chǎn)生的響應文本,被包含的文件在邏輯和語法上獨立于當前的JSP頁面。
2
<jsp:forward>動作元素<jsp:forward>動作元素用于請求轉(zhuǎn)發(fā),它的功能類似于RequestDispatcher接口的forward()方法,是將客戶端的請求轉(zhuǎn)發(fā)給其他Web資源,例如,另一個JSP頁面、Servlet等。
<jsp:forward>動作元素的語法格式如下。
<jsp:forward page=”relative URL”/>
其中,page屬性指定請求轉(zhuǎn)發(fā)到的Web資源的路徑。
接下來通過一個實例來演示<jsp:forward>動作元素的使用,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test10.jsp。
在代碼中,通過<jsp:forward>動作元素,訪問test10.jsp的請求被轉(zhuǎn)發(fā)到test11.jsp。
(2)在WebContent目錄的jsp目錄下新建test11.jsp,具體代碼如書中例9.16所示。
(3)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test10.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,當訪問test10.jsp時,請求被轉(zhuǎn)發(fā)到test11.jsp。
2
<jsp:param>動作元素<jsp:param>是一種提供參數(shù)的動作元素,它以name/value的形式為其他元素提供附加信息,一般與<jsp:include>、<jsp:forward>動作元素聯(lián)合使用。
<jsp:param>的語法格式如下。
<jsp:param name=”參數(shù)名” value=”參數(shù)值”/>
1. 與<jsp:include>動作元素一起使用當<jsp:param>與<jsp:include>動作元素一起使用時,可以將<jsp:param>中提供的參數(shù)值傳遞到被包含的頁面中去,在被包含的頁面中,通過調(diào)用request對象的getParameter()方法獲取<jsp:param>指定的參數(shù)值。
2. 與<jsp:forward>動作元素一起使用當<jsp:param>與<jsp:forward>動作元素一起使用時,可以在請求轉(zhuǎn)發(fā)的同時向跳轉(zhuǎn)的頁面?zhèn)鬟f參數(shù)。在跳轉(zhuǎn)的頁面中,通過調(diào)用request對象的getParameter()方法獲取<jsp:param>指定的參數(shù)值。
2
與JavaBean相關的動作元素<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>三個動作元素都是與JavaBean相關的,因此下面統(tǒng)一對它們進行講解。
1. <jsp:useBean>動作元素<jsp:useBean>動作元素用于裝載一個將在JSP頁面中使用的JavaBean,JSP通過使用JavaBean組件來擴充自身的功能。
<jsp:useBean>動作元素的語法格式如下。
<jsp:useBean id=”id” class=”className”
scope=”page|request|session|application”/>
其中,id指定該JavaBean實例的變量名,通過id可以訪問這個實例,class指定JavaBean的類名,服務器根據(jù)class指定的類調(diào)用其構造方法來創(chuàng)建這個類的實例,scope指定JavaBean的作用范圍,可以使用page、request、session、application,默認值為page。
2. <jsp:setProperty>動作元素<jsp:setProperty>動作元素用于設置或修改JavaBean的屬性值。
<jsp:setProperty>動作元素的語法格式如下:
<jsp:setProperty name=”beanName” property=”propertyName”
value=”propertyValue” param=”parameterName”/>
其中,name指定JavaBean的對象名,與<jsp:useBean>動作元素的id屬性對應,property指定JavaBean中需要獲取的賦值的屬性名,value指定要為屬性設置的值,其值可以是一個字符串,也可以是一個JSP表達式。param指定請求中的參數(shù)名。
3. <jsp:getProperty>動作元素<jsp:getProperty>動作元素用于獲取JavaBean的屬性值,并將其轉(zhuǎn)換成字符串,然后輸出。
<jsp:getProperty>動作元素的語法格式如下。
<jsp:getProperty name=”beanName” property=”propertyName”/>
其中,name指定JavaBean的對象名,與<jsp:useBean>動作元素的id屬性對應,property指定JavaBean中需要獲取的屬性名。這里需要注意的是,在使用<jsp:getProperty>動作元素時,它的name屬性和property屬性都必須設置,不能省略。
接下來通過一個實例來演示以上三個動作元素的使用,具體步驟如下。
(1)在工程chapter09的com.qfedu.example包下新建一個JavaBean類User。
(2)在WebContent目錄的jsp目錄下新建test16.jsp。
(3)打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test16.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,在test16.jsp頁面中,<jsp:useBean>動作元素創(chuàng)建一個User類的對象,<jsp:setProperty>動作元素為該對象設置屬性,<jsp:getProperty>動作元素獲取該對象的屬性值并輸出。
JSP內(nèi)置對象2
概述為了簡化開發(fā),JSP內(nèi)置了一些可以直接在腳本和表達式中使用的對象,這些對象由JSP自動創(chuàng)建,開發(fā)者可直接調(diào)用,而無須對它們進行實例化。所有JSP的內(nèi)置對象,具體如表所示。
表 JSP內(nèi)置對象
內(nèi)置對象名稱 | 類型 | 說明 |
request | javax.servlet.HttpServletRequest | 用于獲取客戶端請求信息 |
response | javax.servlet.HttpServletResponse | 用于向客戶端響應信息 |
config | javax.servlet.ServletConfig | 頁面配置對象 |
session | javax.servlet.http.HttpSession | 用于保存會話信息 |
application | javax.servlet.ServletContext | 用于保存整個Web應用的信息 |
pageContext | javax.servlet.jsp.PageContext | 用于存儲當前JSP頁面的信息 |
out | javax.servlet.jsp.JspWriter | 用于頁面輸出 |
page | java.lang.Object | 當前JSP頁面對象 |
exception | java.lang.Throwable | 用于處理JSP頁面中的異常 |
表中列舉了JSP的9個內(nèi)置對象及其對應的類型。其中,request、response、config、session和application對象對應的類是Servlet的相關API,這些在前面的章節(jié)已有詳細介紹,此處不再贅述。接下來,本書將對out、pageContext、exception對象做重點講解。
2
out對象out對象是一個緩沖輸出流對象,它與HttpServletResponse類的getWriter()方法返回的PrintWriter對象非常相似,不同的是,當向out對象的輸出流中寫入數(shù)據(jù)時,數(shù)據(jù)會先被存儲在緩沖區(qū)中,在JSP默認配置下,緩沖區(qū)滿時數(shù)據(jù)才會被自動刷新輸出。
out對象提供了一系列的輸出數(shù)據(jù)和處理緩沖區(qū)的方法,具體如表9.3所示。
表9.3 out對象的常用方法
屬性名 | 說明 |
void clear() | 清除緩沖區(qū)中的內(nèi)容,不把數(shù)據(jù)輸出到客戶端 |
void clearBuffer() | 清除緩沖區(qū)中的內(nèi)容,同時將數(shù)據(jù)輸出到客戶端 |
void close() | 關閉輸出流 |
void flush() | 輸出緩沖區(qū)里的數(shù)據(jù) |
int getBufferSize() | 獲取緩沖區(qū)的大小 |
int getRemainning() | 獲取緩沖區(qū)剩余空間的大小 |
isAutoFlush() | 返回TRUE表示緩沖區(qū)滿時會自動刷新輸出,返回FALSE表示緩沖區(qū)滿時不會自動清除并產(chǎn)生異常處理 |
void newLine() | 輸出一個換行符 |
void print() | 向客戶端輸出數(shù)據(jù) |
void println() | 向客戶端輸出數(shù)據(jù)并換行 |
2
pageContext對象pageContext對象即頁面上下文對象,它代表當前JSP頁面的運行環(huán)境,用于獲取當前JSP頁面的其他內(nèi)置對象。另外,pageContext對象提供了容器功能,作用范圍是當前JSP頁面。
pageContext對象提供了一系列獲取其他內(nèi)置對象的方法,具體如表9.4所示。
表9.4 pageContext對象獲取其他內(nèi)置對象的方法
屬性名 | 說明 |
ServletRequest getRequest() | 獲取當前JSP頁面的request對象 |
ServletResponse getResponse() | 獲取當前JSP頁面的response對象 |
HttpSession getSession() | 獲取當前JSP頁面關聯(lián)的session對象 |
ServletConfig getServletConfig() | 獲取當前JSP頁面的config對象 |
ServletContext getServletContext() | 獲取當前JSP頁面的application對象 |
JspWriter getOut() | 獲取當前JSP頁面的out對象 |
Object getPage() | 獲取當前JSP頁面的page對象 |
Exception getException | 獲取當前JSP頁面的exception對象 |
為實現(xiàn)容器功能,pageContext對象提供了一系列存取域?qū)傩缘姆椒?,具體如表9.5所示。
表9.5 pageContext對象存取域?qū)傩缘姆椒?br>
屬性名 | 說明 |
void setAttribute(String name,Object value,int scope) | 設置指定范圍內(nèi)的name屬性 |
void setAttribute(String name,Object value) | 設置name屬性 |
Object getAttribute(String name ,int scope) | 獲取指定范圍內(nèi)的名稱為name的屬性 |
Object getAttribute(String name) | 獲取名稱為name的屬性 |
void removeAttribute(String name, int scope) | 刪除指定范圍內(nèi)名稱為name的屬性 |
void removeAttribute(String name) | 刪除名稱為name的屬性 |
Object findAttribute(String name) | 從4個域?qū)ο笾胁檎颐Q為name的屬性 |
Enumeration getAttributeNamesInScope(int scope) | 獲取指定范圍內(nèi)的所有屬性名 |
在以上方法中,參數(shù)scope指定的是屬性的作用范圍,一般通過PageContext類提供的靜態(tài)變量進行定義。域?qū)傩缘淖饔梅秶灿兴姆N,其中,pageContext.PAGE_SCOPE表示頁面范圍,pageContext.REQUEST_SCOPE表示請求范圍,pageContext.SESSION_SCOPE表示會話范圍,pageContext.APPLICATION_SCOPE表示W(wǎng)eb應用程序范圍。
2
exception對象exception對象即異常對象,用于封裝JSP頁面拋出的異常信息。需要注意的是,如果一個JSP頁面要使用exception對象,必須將此頁面中page指令的isErrorPage屬性設置為true。
exception對象提供了幾種獲取異常信息的方法,具體如表9.6所示。
表9.6 exception對象的常用方法
屬性名 | 說明 |
String getMessage() | 獲取異常信息 |
void printStackTrace() | 以標準形式輸出一個錯誤和錯誤的堆棧 |
String toString() | 以字符串的形式返回一個對異常的描述 |
接下來通過一個實例來演示exception對象的使用方法,具體步驟如下。
(1)在WebContent目錄的jsp目錄下新建test19.jsp,具體代碼如例9.25所示。
在代碼中,page指令的errorPage屬性為該頁面指定了一個處理異常的頁面,這個處理異常的頁面為test20.jsp。
2)在WebContent目錄的jsp目錄下新建test20.jsp,具體代碼如書中例9.26所示。
在代碼中,page指令的isErrorPage屬性被設置為TRUE,只有滿足該條件,才可以直接在test20.jsp頁面中使用exception對象。
(3)打開瀏覽器,點擊右上角的
圖標,在彈出的菜單中選擇“Internet選項”命令,在”Internet選項“對話框中選擇“高級”選項卡,取消勾選”顯示友好的HTTP錯誤信息”復選框,如圖所示。
IE瀏覽器自帶有默認的錯誤提示頁面,為保證本實例的運行結果不受影響,這里暫時取消該功能。
(4)重新打開瀏覽器,訪問http://localhost:8080/chapter09/jsp/test19.jsp,瀏覽器顯示的頁面如圖所示。
從圖中可以看出,瀏覽器顯示出test19.jsp頁面的異常信息。