1. 程式人生 > >jsp中九個內建物件與servlet對應關係及四個作用域

jsp中九個內建物件與servlet對應關係及四個作用域

參考:
《jsp&servlet學習筆記.第2版.林信良》
《JSR-245 JavaServer Pages 2.2 Maintenance Release Specification》

隱式物件 說明
out 轉譯後對應JspWriter物件,其內部關聯一個PringWriter物件
request 轉譯後對應HttpServletRequest/ServletRequest物件
response 轉譯後對應HttpServletRespons/ServletResponse物件
config 轉譯後對應ServletConfig物件
application 轉譯後對應ServletContext物件
session 轉譯後對應HttpSession物件
pageContext 轉譯後對應Throwable物件,代表由其他JSP頁面丟擲的異常物件,只會出現於JSP錯誤頁面(isErrorPage設定為true的JSP頁面)
exception 轉譯後對應Throwable物件,代表由其他JSP頁面丟擲的異常物件,只會出現於JSP錯誤頁面(isErrorPage設定為true的JSP頁面)
page 轉譯後對應this

JSP九種內建物件:

一 request物件:
該物件封裝了使用者提交的資訊,通過呼叫該物件相應的方法可以獲取封裝的資訊, 即使用該物件可以獲取使用者提交資訊。

二 response物件:
對客戶的請求做出動態的響應,向客戶端傳送資料。
三 session物件
1.什麼是session:session物件是一個JSP內建物件,它在第一個JSP頁面被裝載時自動建立,完成會話期管理。
從一個客戶開啟瀏覽器並連線到伺服器開始,到客戶關閉瀏覽器離開這個伺服器結束,被稱為一個會話。當一個客戶訪問一個伺服器時,可能會在這個伺服器的幾個頁面之間反覆連線,反覆重新整理一個頁面,伺服器應當通過某種辦法知道這是同一個客戶,這就需要session物件。
2.session物件的ID:當一個客戶首次訪問伺服器上的一個JSP頁面時,JSP引擎產生一個session物件,同時分配一個String型別的ID號,JSP引擎同時將這個ID號傳送到客戶端,存放在Cookie中,這樣session物件和客戶之間就建立了一一對應的關係。當客戶再訪問連線該伺服器的其他頁面時,不再分配給客戶新的session物件,直到客戶關閉瀏覽器後,伺服器端該客戶的session物件才取消,並且和客戶的會話對應關係消失。當客戶重新開啟瀏覽器再連線到該伺服器時,伺服器為該客戶再建立一個新的session物件。

四 aplication物件
1.什麼是application:
伺服器啟動後就產生了這個application物件,當客戶在所訪問的網站的各個頁面之間瀏覽時,這個application物件都是同一個,直到伺服器關閉。但是與session不同的是,所有客戶的application物件都是同一個,即所有客戶共享這個內建的application物件。
2.application物件常用方法:
(1)public void setAttribute(String key,Object obj): 將引數Object指定的物件obj新增到application物件中,併為新增的物件指定一個索引關鍵字。
(2)public Object getAttribute(String key): 獲取application物件中含有關鍵字的物件。

五 out物件
out物件是一個輸出流,用來向客戶端輸出資料。out物件用於各種資料的輸出。
六 page java.lang.Object
對應this關鍵字。JSP網頁本身
page物件是當前頁面轉換後的Servlet類的例項。從轉換後的Servlet類的程式碼中,可以看到這種關係:
Object page = this;
在JSP頁面中,很少使用page物件。

七 config
javax.servlet. ServletConfig 的例項,該例項代表該JSP 的配置資訊。常用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事實上, JSP 頁面通常無須配置,也就不存在配置資訊。因此,該物件更多地在Servlet 中有效。

八 exception java.lang.Throwable 的例項
該例項代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page 的isErrorPage 屬性為true 時,該物件才可以使用。常用的方法有getMessageO和printStackTraceO等。

九 pageContext
javax.servlet.jsp.PageContext 的例項,物件直譯時可以稱作“頁面上下文”物件,代表的是當前頁面執行的一些屬性,通過此物件可以拿到其他8大物件,使用該物件可以訪問頁面中的共享資料。常用的方法有getServletContextO和getServletConfigO等。

//使用pageContext 設定屬性,該屬性預設在page 範圍內
pageContext. setAttribute (“page” , “hello”) ;

//使用request 設定屬性,該屬性預設在request 範圍內
request. setAttribute (“request” , “hello”);

//使用pageContext將屬性設定在request 範圍中
pageContext.setAttribute(“request2” , “hello” , pageContext.REQUEST_SCOPE);

// 使用session將屬性設定在session 範圍中
session.setAttribute(“session” , "hello"l;

//使用pageContext將屬性設定在session範圍中
pageContext.setAttribute(“session2” , “hello” , pageContext.SESSION_SCOPE);

//使用application將屬性設定在application範圍中
application. setAttribute (“app” , “hello”) ;

//使用pageContext 將屬性設定在application 範圍中
pageContext.setAttribute(“app2” , “hello” , pageContext.APPL 工CATION_SCOPE) ;

參考:

http://my.oschina.net/artshell/blog/197344

http://my.oschina.net/u/1269548/blog/169597

四個作用域:request域 session域 application域 page域

何為作用域

先讓我們看看效果:

大概流程是這樣的,我們訪問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就可以操作其他三個作用域中的變數。

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

參考:http://www.233.com/Java/jichu/20100329/091644792.html