隱式對象java |
說明shell |
out瀏覽器 |
轉譯後對應JspWriter對象,其內部關聯一個PringWriter對象tomcat |
request服務器 |
轉譯後對應HttpServletRequest/ServletRequest對象session |
responseapp |
轉譯後對應HttpServletRespons/ServletResponse對象jsp |
config網站 |
轉譯後對應ServletConfig對象this |
application |
轉譯後對應ServletContext對象 |
session |
轉譯後對應HttpSession對象 |
pageContext |
轉譯後對應PageContext對象,它提供了JSP頁面資源的封裝,並可設置頁面範圍屬性 |
exception |
轉譯後對應Throwable對象,表明由其餘JSP頁面拋出的異常對象,只會出現於JSP錯誤頁面(isErrorPage設置爲true的JSP頁面) |
page |
轉譯後對應this |
JSP九種內置對象:
該對象封裝了用戶提交的信息,經過調用該對象相應的方法能夠獲取封裝的信息, 即便用該對象能夠獲取用戶提交信息。
1.什麼是session:session對象是一個JSP內置對象,它在第一個JSP頁面被裝載時自動建立,完成會話期管理。
從一個客戶打開瀏覽器並鏈接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱爲一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間反覆鏈接,反覆刷新一個頁面,服務器應當經過某種辦法知道這是同一個客戶,這就須要session對象。
2.session對象的ID:當一個客戶首次訪問服務器上的一個JSP頁面時,JSP引擎產生一個session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發送到客戶端,存放在Cookie中,這樣session對象和客戶之間就創建了一一對應的關係。當客戶再訪問鏈接該服務器的其餘頁面時,再也不分配給客戶新的session對象,直到客戶關閉瀏覽器後,服務器端該客戶的session對象才取消,而且和客戶的會話對應關係消失。當客戶從新打開瀏覽器再鏈接到該服務器時,服務器爲該客戶再建立一個新的session對象。
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對象中含有關鍵字的對象。
對應this關鍵字。JSP網頁自己
page對象是當前頁面轉換後的Servlet類的實例。從轉換後的Servlet類的代碼中,能夠看到這種關係:
Object page = this;
在JSP頁面中,不多使用page對象。
javax.servlet. ServletConfig 的實例,該實例表明該JSP 的配置信息。經常使用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事實上, JSP 頁面一般無須配置,也就不存在配置信息。所以,該對象更多地在Servlet 中有效。
該實例表明其餘頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page 的isErrorPage 屬性爲true 時,該對象纔可使用。經常使用的方法有getMessageO和printStackTraceO等。
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