轉(zhuǎn)載自:http://www.233.com/Java/jichu/20100329/091644792-3.html
九大對(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ū)哟蔚膶傩圆樵兒托薷哪芰Χ鞲ぃ蔡峁┝宿D(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è)作用域中的變量晚伙。