jsp 九大隱性對象講解

四大域對象詳解    
JSP中隱式對象的名稱    範圍名稱     具體的類型   
pageContext       page         javax.servlet.jsp.PageContext   
request         request     javax.servlet.ServletRequest  (顯示完數據就沒有用了)   
session         session       javax.servlet.http.HttpSession   (顯示完數據了,過一會自己 還要用)  

application       application      javax.servlet.ServletContext   (顯示完數據了,大家都要用。不建議使用,如果使用,必須同步處理)


JSP九大內置對象  
JSP的內置對象引用名稱     對應的類型     
request       HttpServletRequest  
response      HttpServletResponse   
session          HttpSession(有開關的:page指令的session屬性的取值)  
application     ServletContext  
config      ServletConfig  
page        this(當前Servlet對象)   
exception       java.lang.Throwable(有開關的:page指令的isErrorPage屬性改爲true)     
out        JspWriter   pageContext      javax.servlet.jsp.PageContext非常重要     
pageContext有三大作用:   
1、本身是一個域對象。同時還能操作其他三個域對象(PageContext ServletRequest    HttpSession   ServletContext)  本身表示的域範圍 是本頁面。          
void setAttribute(String name,Object value) 

 void removeAttribute(String name)              
       Object getAttribute(String name)   操作其他的三個域對象      
       void setAttribute(Stringname,Objectvalue,intscope)       
       void removeAttribute(String name,inscope)       
       Object getAttribute(String name,int scope)                參數int scope是由PageContext類提供的靜態變量規定的。       
       PageContext.PAGE_SCOPE:頁面範圍(是PageContext本身中的那個Map,代號page):僅在本頁 中可用     
        PageContext.REQUEST_SCOPE:請求範圍(是ServletRequest中的那個Map,代號request):當有 request請求時      
        PageContext.SESSION_SCOPE:請求範圍(是HttpSession中的那個Map,代號session):用的很多, 會話期間    

PageContext.APPLICATION_SCOPE:請求範圍(是ServletContext中的那個Map,代號application): 用的不多,全局可用,也就是該應用都可用,注意:使用時,應該加上同步處理,而且同步應該包括少部分的代碼,效率低。   (非常有用)Object findAttribute(String name):

        依次按照page request session application範圍搜索指定名稱的 對象,找到爲止  。     
        2、獲取其他8個隱式對象  getxxx  3、提供了轉發和包含的方便方法   RequestDispatcher rd = request.getRequestDispatcher("/url");       
        rd.forward(request,response);       pageContext.forward("url");        pageContext.include("url"); 



內置對象(又叫隱含對象,有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(頁面執行期



概要
HTTP是無狀態(stateless)協議;
Web Server 對每一個客戶端請求都沒有歷史記憶;
Session用來保存客戶端狀態信息;
由Web Server 寫入;
存於服務器端,其本質遠離通過回送一個cookie對象(含用戶基本數據)給瀏覽器;
客戶端的每次訪問都把上次的session記錄就會調用相應的cookie對象傳遞給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就可以操作其他三個作用域中的變量。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章