JSP九大隱含對象及四大作用域

九大對象:

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

1-out:

javax.servlet.jsp.JspWriter類型生年,代表輸出流的對象。作用域為page(頁面執(zhí)行期)

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

請求的細(xì)節(jié)(參數(shù)桨螺,屬性恰梢,頭標(biāo)和數(shù)據(jù))佛南。作用域為request(用戶請求期)。

方法可查看API

response:javax.servlet.ServletResponse的子類型嵌言,此對象封裝了返回到HTTP客戶端的輸出嗅回,向頁面

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

pageContext:javax.servlet.jsp.PageContext(抽象類)類型,作用域為page(頁面執(zhí)行期)丸氛。此對象

提供所有四個作用域?qū)哟蔚膶傩圆樵兒托薷哪芰ε喑睿蔡峁┝宿D(zhuǎn)發(fā)請求到其它資源和包含其他資源的方法:

該對象的方法都是抽象方法

session:javax.servlet.http.HttpSession類型,主要用于跟蹤對話缓窜。作用域session(會話期—)定续。

HttpSession是一個類似哈希表的與單一WEB瀏覽器會話相關(guān)的對象,它存在于HTTP請求之間禾锤,可以存儲任何類型的命名對象私股。

如果不需要在請求之間跟蹤會話對象,可以通過在page指令中指定session="false"

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

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

config:javax.servlet.ServletConfig,作用域為page(頁面執(zhí)行期)

exception:java.lang.Throwable,通過JSP錯誤頁面中一個catch塊已經(jīng)益出但沒有捕獲的

java.lang.Throwable的任意實例,傳向了errorPage的URI优床。作用域為page(頁面執(zhí)行期)劝赔。

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

page:java.lang.Object類型胆敞,指向頁面自身的方式着帽。作用域為page(頁面執(zhí)行期

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

request ? ? ? ? ? ? 請求對象 ??????????????? 類型 javax.servlet.ServletRequest??????? 作用域 Request

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

pageContext ? 頁面上下文對象 ? ? ? ?類型 javax.servlet.jsp.PageContext????? 作用域??? Page

session??????????? 會話對象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.http.HttpSession?????? 作用域??? Session

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

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

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

page ? ? ? ? ? ? ? ?頁面對象 ? ? ? ? ? ? ? ? ? ?類型 javax.lang.Object??????????????????????????? 作用域??? Page

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

request 對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等移层,是最常用的對象

常用的方法有:getParameter仍翰、getParameterNames 和getParameterValues 通過調(diào)用這幾個方法來獲取請求對象中所包含的參數(shù)的值。

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

pageContext 對象直譯時可以稱作“頁面上下文”對象蕾羊,代表的是當(dāng)前頁面運行的一些屬性

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

一般情況下pageContext對象用到得也不是很多龟再,只有在項目所面臨的情況比較復(fù)雜的情況下,才會利用到頁面屬性來輔助處理尼变。

session??? 對象代表服務(wù)器與客戶端所建立的會話利凑,當(dāng)需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物嫌术、客戶軌跡跟蹤等哀澈。“session” 對象建立在cookie的基礎(chǔ)上度气,所以使用時應(yīng)注意判斷一下客戶端是否打開了cookie割按。常用的方法包括getId、 getValue磷籍、 getValueNames和putValue等适荣。

概要

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

Web Server 對每一個客戶端請求都沒有歷史記憶院领;

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

由Web Server 寫入;

存于客戶端比然;

客戶端的每次訪問都把上次的session記錄傳遞給Web Server丈氓;

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

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

out 對象代表了向客戶端發(fā)送數(shù)據(jù)的對象万俗,與“response” 對象不同鱼鼓,通過“out” 對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容,是文本一級的该编,可以通過“out” 對象直接向客戶端寫一個由程序動態(tài)生成HTML文件。常用的方法除了pirnt和println之外硕淑,還包括clear课竣、clearBuffer、 flush置媳、getBufferSize和getRemaining于樟,這是因為“out” 對象內(nèi)部包含了一個緩沖區(qū),所以需要一些對緩沖區(qū)進(jìn)行操作的方法

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

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

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

四個作用域:

何為作用域

? ? 大概流程是這樣的杰扫,我們訪問04-01/index.jsp的時候,分別對pageContext, request, session,

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

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

累加,然后顯示出這四個整數(shù)來窒舟。

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

page里的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉(zhuǎn)了辜纲,它們就不見了笨觅。

request里的變量可以跨越forward前后的兩頁。但是只要刷新頁面耕腾,它們就重新計算了见剩。

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

application里的變量一直在累加羹呵,除非你重啟tomcat骂际,否則它會一直變大。

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

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

從把變量放到pageContext開始太示,到j(luò)sp頁面結(jié)束,你都可以使用這個變量香浩。

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

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

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

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

所謂當(dāng)前會話剧董,就是指從用戶打開瀏覽器開始,到用戶關(guān)閉瀏覽器這中間的過程破停。這個過程可能包含多個

請求響應(yīng)翅楼。也就是說,只要用戶不關(guān)瀏覽器真慢,服務(wù)器就有辦法知道這些請求是一個人發(fā)起的毅臊,整個過程被

稱為一個會話(session),而放到會話中的變量黑界,就可以在當(dāng)前會話的所有請求里使用管嬉。

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

整個應(yīng)用是指從應(yīng)用啟動,到應(yīng)用結(jié)束烛占。我們沒有說“從服務(wù)器啟動胎挎,到服務(wù)器關(guān)閉”沟启,是因為一個服務(wù)

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

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

與上述三個不同的是称杨,application里的變量可以被所有用戶共用流酬。如果用戶甲的操作修改了application

中的變量,用戶乙訪問時得到的是修改后的值列另。這在其他scope中都是不會發(fā)生的,page, request,

session都是完全隔離的旦装,無論如何修改都不會影響其他人的數(shù)據(jù)页衙。

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

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

// page

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

if (countPage == null) {

pageContext.setAttribute("countPage", 1);

} else {

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

}

這里先從pageContext中取出名為countPage的整數(shù)店乐,因為返回的都是java.lang.Object類型,所以需要強(qiáng)

制轉(zhuǎn)換成我們需要的整形呻袭。這里取得的變量如果不存在就會返回null眨八,通過判斷countPage == null來辨

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

的變量值放入pageContext。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末段誊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栈拖,更是在濱河造成了極大的恐慌连舍,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涩哟,死亡現(xiàn)場離奇詭異索赏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贴彼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門潜腻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锻弓,你說我怎么就攤上這事砾赔。” “怎么了?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵暴心,是天一觀的道長妓盲。 經(jīng)常有香客問我,道長专普,這世上最難降的妖魔是什么悯衬? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮檀夹,結(jié)果婚禮上筋粗,老公的妹妹穿的比我還像新娘。我一直安慰自己炸渡,他們只是感情好娜亿,可當(dāng)我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚌堵,像睡著了一般买决。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吼畏,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天督赤,我揣著相機(jī)與錄音,去河邊找鬼泻蚊。 笑死躲舌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的性雄。 我是一名探鬼主播没卸,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秒旋!你這毒婦竟也來了办悟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤滩褥,失蹤者是張志新(化名)和其女友劉穎病蛉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑰煎,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铺然,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酒甸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄健。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖插勤,靈堂內(nèi)的尸體忽然破棺而出沽瘦,到底是詐尸還是另有隱情革骨,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布析恋,位于F島的核電站良哲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏助隧。R本人自食惡果不足惜筑凫,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望并村。 院中可真熱鬧巍实,春花似錦、人聲如沸哩牍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝昆。三九已至瓦盛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間外潜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工挠唆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留处窥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓玄组,卻偏偏與公主長得像滔驾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俄讹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容