jsp中9個內置對象與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

轉譯后對應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就可以操作其他三個作用域中的變量。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM