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

九大對象:

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

1-out:

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

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

請求的細節(參數,屬性,頭標和數據)。作用域為request(用戶請求期)。

方法可查看API

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

作者提供設置響應頭標和狀態碼的方式。經常用來設置HTTP標題,添加cookie,設置響應內容的類型和狀態,發送HTTP重定向和編碼URL。作用域為page(頁面執行期)。

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

提供所有四個作用域層次的屬性查詢和修改能力,它也提供了轉發請求到其它資源和包含其他資源的方法:

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

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

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

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

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

application:javax.servlet.ServletContext類型,servlet的環境通過調用getServletConfig().getContext()方法獲得。作用域是application(整個程序運行期)。它提供了關于服務器版本,應用級初始化參數和應用內資源絕對路徑,注冊信息的方式:

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

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

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

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

page:java.lang.Object類型,指向頁面自身的方式。作用域為page(頁面執行期

JSP中九大內置對象為:

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

response????????? 響應對象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.SrvletResponse?????? 作用域? Page

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

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

application?????? 應用程序對象 ? ? ? ? ? 類型 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 通過調用這幾個方法來獲取請求對象中所包含的參數的值。

response 對象代表的是對客戶端的響應,也就是說可以通過response 對象來組織發送到客戶端的數據。但是由于組織方式比較底層,所以不建議普通讀者使用,需要向客戶端發送文字時直接使用

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

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

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

session??? 對象代表服務器與客戶端所建立的會話,當需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物、客戶軌跡跟蹤等。“session” 對象建立在cookie的基礎上,所以使用時應注意判斷一下客戶端是否打開了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。

概要

HTTP是無狀態(stateless)協議;

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

Session用來保存客戶端狀態信息;

由Web Server 寫入;

存于客戶端;

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

Web Server讀取客戶端提交的session來獲取客戶端的狀態信息

application 對象負責提供應用程序在服務器中運行時的一些全局信息,常用的方法有getMimeType和getRealPath等。

out 對象代表了向客戶端發送數據的對象,與“response” 對象不同,通過“out” 對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out” 對象直接向客戶端寫一個由程序動態生成HTML文件。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、 flush、getBufferSize和getRemaining,這是因為“out” 對象內部包含了一個緩沖區,所以需要一些對緩沖區進行操作的方法

“config” 對象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數。

“page” 對象代表了正在運行的由JSP文件產生的類對象,不建議一般讀者使用。

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

四個作用域:

何為作用域

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

application四個作用域中的變量進行累加。(當然先判斷這個變量是不是存在,如果變量不存在,則要

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

累加,然后顯示出這四個整數來。

從顯示的結果來看,我們可以直觀的得出結論:

page里的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉了,它們就不見了。

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

session和application里的變量一直在累加,開始還看不出區別,只要關閉瀏覽器,再次重啟瀏覽器訪問這頁,session里的變量就重新計算了。

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

而作用域規定的是變量的有效期限。

如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當前jsp頁面里。

從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。

如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當前請求周期。

所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使

用forward的方式跳轉了多個jsp頁面,在這些頁面里你都可以使用這個變量。

如果把變量放到session里,就說明它的作用域是session,它的有效范圍是當前會話。

所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個

請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被

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

如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個應用。

整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”,是因為一個服務

器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。

application作用域里的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。

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

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

session都是完全隔離的,無論如何修改都不會影響其他人的數據。

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

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

// page

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

if (countPage == null) {

pageContext.setAttribute("countPage", 1);

} else {

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

}

這里先從pageContext中取出名為countPage的整數,因為返回的都是java.lang.Object類型,所以需要強

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

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

的變量值放入pageContext。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容