JSP九大隱含對(duì)象及四大作用域

九大對(duì)象:

內(nèi)置對(duì)象(又叫隱含對(duì)象,有9個(gè)內(nèi)置對(duì)象):不需要預(yù)先聲明就可以在腳本代碼和表達(dá)式中隨意使用

1-out:

javax.servlet.jsp.JspWriter類型,代表輸出流的對(duì)象。作用域?yàn)閜age(頁(yè)面執(zhí)行期)

request:javax.servlet.ServletRequest的子類型,此對(duì)象封裝了由WEB瀏覽器或其它客戶端生成地HTTP

請(qǐng)求的細(xì)節(jié)(參數(shù),屬性,頭標(biāo)和數(shù)據(jù))。作用域?yàn)閞equest(用戶請(qǐng)求期)。

方法可查看API

response:javax.servlet.ServletResponse的子類型,此對(duì)象封裝了返回到HTTP客戶端的輸出,向頁(yè)面

作者提供設(shè)置響應(yīng)頭標(biāo)和狀態(tài)碼的方式。經(jīng)常用來(lái)設(shè)置HTTP標(biāo)題,添加cookie,設(shè)置響應(yīng)內(nèi)容的類型和狀態(tài),發(fā)送HTTP重定向和編碼URL。作用域?yàn)閜age(頁(yè)面執(zhí)行期)。

pageContext:javax.servlet.jsp.PageContext(抽象類)類型,作用域?yàn)閜age(頁(yè)面執(zhí)行期)。此對(duì)象

提供所有四個(gè)作用域?qū)哟蔚膶傩圆樵兒托薷哪芰?,它也提供了轉(zhuǎn)發(fā)請(qǐng)求到其它資源和包含其他資源的方法:

該對(duì)象的方法都是抽象方法

session:javax.servlet.http.HttpSession類型,主要用于跟蹤對(duì)話。作用域session(會(huì)話期—)。

HttpSession是一個(gè)類似哈希表的與單一WEB瀏覽器會(huì)話相關(guān)的對(duì)象,它存在于HTTP請(qǐng)求之間,可以存儲(chǔ)任何類型的命名對(duì)象。

如果不需要在請(qǐng)求之間跟蹤會(huì)話對(duì)象,可以通過(guò)在page指令中指定session="false"

需要記住的是pageContext對(duì)象也可以與session.getAttribute(),session.setAttribute()一樣的方式取得并設(shè)置會(huì)話屬性。

application:javax.servlet.ServletContext類型,servlet的環(huán)境通過(guò)調(diào)用getServletConfig().getContext()方法獲得。作用域是application(整個(gè)程序運(yùn)行期)。它提供了關(guān)于服務(wù)器版本,應(yīng)用級(jí)初始化參數(shù)和應(yīng)用內(nèi)資源絕對(duì)路徑,注冊(cè)信息的方式:

config:javax.servlet.ServletConfig,作用域?yàn)閜age(頁(yè)面執(zhí)行期)

exception:java.lang.Throwable,通過(guò)JSP錯(cuò)誤頁(yè)面中一個(gè)catch塊已經(jīng)益出但沒(méi)有捕獲的

java.lang.Throwable的任意實(shí)例,傳向了errorPage的URI。作用域?yàn)閜age(頁(yè)面執(zhí)行期)。

? ? 注意:exception只有在page指令中具有屬性isErrorPage="true"時(shí)才有效。

page:java.lang.Object類型,指向頁(yè)面自身的方式。作用域?yàn)閜age(頁(yè)面執(zhí)行期

JSP中九大內(nèi)置對(duì)象為:

request ? ? ? ? ? ? 請(qǐng)求對(duì)象 ??????????????? 類型 javax.servlet.ServletRequest??????? 作用域 Request

response????????? 響應(yīng)對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.SrvletResponse?????? 作用域? Page

pageContext ? 頁(yè)面上下文對(duì)象 ? ? ? ?類型 javax.servlet.jsp.PageContext????? 作用域??? Page

session??????????? 會(huì)話對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.http.HttpSession?????? 作用域??? Session

application?????? 應(yīng)用程序?qū)ο?? ? ? ? ? 類型 javax.servlet.ServletContext????????? 作用域??? Application

out ? ? ? ? ? ? ? ? ? ?輸出對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.jsp.JspWriter???????????? 作用域??? Page

config ? ? ? ? ? ? ? 配置對(duì)象 ? ? ? ? ? ? ? ? ? 類型 javax.servlet.ServletConfig??????????? 作用域??? Page

page ? ? ? ? ? ? ? ?頁(yè)面對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.lang.Object??????????????????????????? 作用域??? Page

exception??????? 例外對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.lang.Throwable???????????????????? 作用域??? page

request 對(duì)象代表的是來(lái)自客戶端的請(qǐng)求,例如我們?cè)贔ORM表單中填寫(xiě)的信息等,是最常用的對(duì)象

常用的方法有:getParameter、getParameterNames 和getParameterValues 通過(guò)調(diào)用這幾個(gè)方法來(lái)獲取請(qǐng)求對(duì)象中所包含的參數(shù)的值。

response 對(duì)象代表的是對(duì)客戶端的響應(yīng),也就是說(shuō)可以通過(guò)response 對(duì)象來(lái)組織發(fā)送到客戶端的數(shù)據(jù)。但是由于組織方式比較底層,所以不建議普通讀者使用,需要向客戶端發(fā)送文字時(shí)直接使用

pageContext 對(duì)象直譯時(shí)可以稱作“頁(yè)面上下文”對(duì)象,代表的是當(dāng)前頁(yè)面運(yùn)行的一些屬性

常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope

一般情況下pageContext對(duì)象用到得也不是很多,只有在項(xiàng)目所面臨的情況比較復(fù)雜的情況下,才會(huì)利用到頁(yè)面屬性來(lái)輔助處理。

session??? 對(duì)象代表服務(wù)器與客戶端所建立的會(huì)話,當(dāng)需要在不同的JSP頁(yè)面中保留客戶信息的情況下使用,比如在線購(gòu)物、客戶軌跡跟蹤等。“session” 對(duì)象建立在cookie的基礎(chǔ)上,所以使用時(shí)應(yīng)注意判斷一下客戶端是否打開(kāi)了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。

概要

HTTP是無(wú)狀態(tài)(stateless)協(xié)議;

Web Server 對(duì)每一個(gè)客戶端請(qǐng)求都沒(méi)有歷史記憶;

Session用來(lái)保存客戶端狀態(tài)信息;

由Web Server 寫(xiě)入;

存于客戶端;

客戶端的每次訪問(wèn)都把上次的session記錄傳遞給Web Server;

Web Server讀取客戶端提交的session來(lái)獲取客戶端的狀態(tài)信息

application 對(duì)象負(fù)責(zé)提供應(yīng)用程序在服務(wù)器中運(yùn)行時(shí)的一些全局信息,常用的方法有g(shù)etMimeType和getRealPath等。

out 對(duì)象代表了向客戶端發(fā)送數(shù)據(jù)的對(duì)象,與“response” 對(duì)象不同,通過(guò)“out” 對(duì)象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容,是文本一級(jí)的,可以通過(guò)“out” 對(duì)象直接向客戶端寫(xiě)一個(gè)由程序動(dòng)態(tài)生成HTML文件。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、 flush、getBufferSize和getRemaining,這是因?yàn)椤皁ut” 對(duì)象內(nèi)部包含了一個(gè)緩沖區(qū),所以需要一些對(duì)緩沖區(qū)進(jìn)行操作的方法

“config” 對(duì)象提供一些配置信息,常用的方法有g(shù)etInitParameter和getInitParameterNames,以獲得Servlet初始化時(shí)的參數(shù)。

“page” 對(duì)象代表了正在運(yùn)行的由JSP文件產(chǎn)生的類對(duì)象,不建議一般讀者使用。

“exception” 對(duì)象則代表了JSP文件運(yùn)行時(shí)所產(chǎn)生的例外對(duì)象,此對(duì)象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用

四個(gè)作用域:

何為作用域

? ? 大概流程是這樣的,我們?cè)L問(wèn)04-01/index.jsp的時(shí)候,分別對(duì)pageContext, request, session,

application四個(gè)作用域中的變量進(jìn)行累加。(當(dāng)然先判斷這個(gè)變量是不是存在,如果變量不存在,則要

把變量初始化成1。)計(jì)算完成后就從index.jsp執(zhí)行forward跳轉(zhuǎn)到test.jsp。在test.jsp里再進(jìn)行一次

累加,然后顯示出這四個(gè)整數(shù)來(lái)。

從顯示的結(jié)果來(lái)看,我們可以直觀的得出結(jié)論:

page里的變量沒(méi)法從index.jsp傳遞到test.jsp。只要頁(yè)面跳轉(zhuǎn)了,它們就不見(jiàn)了。

request里的變量可以跨越forward前后的兩頁(yè)。但是只要刷新頁(yè)面,它們就重新計(jì)算了。

session和application里的變量一直在累加,開(kāi)始還看不出區(qū)別,只要關(guān)閉瀏覽器,再次重啟瀏覽器訪問(wèn)這頁(yè),session里的變量就重新計(jì)算了。

application里的變量一直在累加,除非你重啟tomcat,否則它會(huì)一直變大。

而作用域規(guī)定的是變量的有效期限。

如果把變量放到pageContext里,就說(shuō)明它的作用域是page,它的有效范圍只在當(dāng)前jsp頁(yè)面里。

從把變量放到pageContext開(kāi)始,到j(luò)sp頁(yè)面結(jié)束,你都可以使用這個(gè)變量。

如果把變量放到request里,就說(shuō)明它的作用域是request,它的有效范圍是當(dāng)前請(qǐng)求周期。

所謂請(qǐng)求周期,就是指從http請(qǐng)求發(fā)起,到服務(wù)器處理結(jié)束,返回響應(yīng)的整個(gè)過(guò)程。在這個(gè)過(guò)程中可能使

用forward的方式跳轉(zhuǎn)了多個(gè)jsp頁(yè)面,在這些頁(yè)面里你都可以使用這個(gè)變量。

如果把變量放到session里,就說(shuō)明它的作用域是session,它的有效范圍是當(dāng)前會(huì)話。

所謂當(dāng)前會(huì)話,就是指從用戶打開(kāi)瀏覽器開(kāi)始,到用戶關(guān)閉瀏覽器這中間的過(guò)程。這個(gè)過(guò)程可能包含多個(gè)

請(qǐng)求響應(yīng)。也就是說(shuō),只要用戶不關(guān)瀏覽器,服務(wù)器就有辦法知道這些請(qǐng)求是一個(gè)人發(fā)起的,整個(gè)過(guò)程被

稱為一個(gè)會(huì)話(session),而放到會(huì)話中的變量,就可以在當(dāng)前會(huì)話的所有請(qǐng)求里使用。

如果把變量放到application里,就說(shuō)明它的作用域是application,它的有效范圍是整個(gè)應(yīng)用。

整個(gè)應(yīng)用是指從應(yīng)用啟動(dòng),到應(yīng)用結(jié)束。我們沒(méi)有說(shuō)“從服務(wù)器啟動(dòng),到服務(wù)器關(guān)閉”,是因?yàn)橐粋€(gè)服務(wù)

器可能部署多個(gè)應(yīng)用,當(dāng)然你關(guān)閉了服務(wù)器,就會(huì)把上面所有的應(yīng)用都關(guān)閉了。

application作用域里的變量,它們的存活時(shí)間是最長(zhǎng)的,如果不進(jìn)行手工刪除,它們就一直可以使用。

與上述三個(gè)不同的是,application里的變量可以被所有用戶共用。如果用戶甲的操作修改了application

中的變量,用戶乙訪問(wèn)時(shí)得到的是修改后的值。這在其他scope中都是不會(huì)發(fā)生的,page, request,

session都是完全隔離的,無(wú)論如何修改都不會(huì)影響其他人的數(shù)據(jù)。

我們使用public Object getAttribute(String name)獲得變量值,使用public void setAttribute

(String name, Object value)將變量值保存到對(duì)應(yīng)作用域中。舉個(gè)pageContext的例子就是:

// page

Integer countPage = (Integer) pageContext.getAttribute("countPage");

if (countPage == null) {

pageContext.setAttribute("countPage", 1);

} else {

pageContext.setAttribute("countPage", countPage + 1);

}

這里先從pageContext中取出名為countPage的整數(shù),因?yàn)榉祷氐亩际莏ava.lang.Object類型,所以需要強(qiáng)

制轉(zhuǎn)換成我們需要的整形。這里取得的變量如果不存在就會(huì)返回null,通過(guò)判斷countPage == null來(lái)辨

別變量是否存在,如果不存在就設(shè)置為1,如果存在就進(jìn)行累加,最后使用setAttribute()方法將修改后

的變量值放入pageContext。

將其中的pageContext換成request, session, application就可以操作其他三個(gè)作用域中的變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容