參考:
《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 |
轉譯后對應PageContext對象,它提供了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就可以操作其他三個作用域中的變量。