JAVA 四大作用域名

JavaWeb有ServletContext、ServletRequest、HttpSession、PageContext四大域對象,下面主要從域對象的生命週期、作用、作用範圍進行介紹。
Servlet中只有前三個域對象,JSP中多了一個pageContext對象。

一、ServletContext

1.生命週期

當web應用被加進容器時,創建代表整個web應用的ServletContext對象,當服務器關閉,或web應用被移除時,ServletContext對象跟着被銷燬。

2.作用範圍

整個web應用。

3.作用

由於一個web應用中的所有Servlet共享同一個ServletContext對象:因此Servlet對象之間可以通過ServletContext來是實現通訊。ServletContext對象通常也被稱爲context域對象。

應用

  • 多個Servlet通過ServletContext對象實現數據共享。
  • 獲取web應用的初始化參數(getInitParameter)。
  • 用ServletContext實現請求轉發(this.getServletContext().getRequestDispatcher().forward())。
  • 利用ServletContext對象讀取資源文件。
    servletContext.getRealPath("/xx.properties"),servletContext.getResourceAsStream()。
    另外,順便說一下,如果要在非servlet中獲取資源文件,無法取得servletContext對象,這時候就得通過類加載器ClassLoader來getResourceAsStream(),此方法通過類加載器將資源文件直接加載到內存中,有更新延遲的問題,適合小文件的讀取,對於大資源文件,將會佔用較大的內存。還有,通過classLoader也可以獲取資源文件路徑,具體通過ClassLoader.getResource("/xx.properties").getPath(),沒有更新延遲問題。

二、ServletRequest

1.生命週期

在service方法調用前由服務器創建,傳入service()方法,整個請求結束,ServletRequest生命週期結束。

2.作用範圍

整個請求鏈。(請求轉發也存在,請求轉發屬於一次請求。)

3.作用

  • 在整個請求鏈中共享數據,主要可通過getAttribute、setAttribute將數據帶到jsp頁面中進行顯示。
  • 獲得客戶端信息,可通過getRequestURL()、getRequestURI()、getQueryString()、getPathInfo()、getRemoteAddr()、getRemoteHost()、getRemotePort()、getLocalAddr()、getLocalName()。
  • 獲得客戶機請求頭,getHeader(String s)、getHeaders(String s)、getHeaderNames()。
  • 獲得客戶機請求參數(客戶端提交的數據):getParameter()等。

三、Session

1.生命週期

服務器在運行時可以爲每一個用戶的瀏覽器創建一個其獨享的session對象,由於session爲用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。
在第一次調用request.getSession()方法時,服務器會檢查是否已經有對應的session,如果沒有就在內存中創建一個並返回。
當一段時間內,session沒有被使用(默認是30分鐘),服務器會銷燬該session。如果服務器非正常關閉(強行關閉),還未到期的session也會被銷燬。
另外,調用session的invalidate()方法可以立即銷燬session。

2.作用範圍

一次回話。

四、PageContext

PageContext對象是JSP頁面中才有的對象。

1.生命週期

當對JSP的請求開始時創建,當響應結束時銷燬。

2.作用範圍

整個JSP頁面,是四大域中最小的一個。

3.作用

pageContext對象封裝了8大隱式對象,通過它可以獲得其它的8個對象。

  • getException()返回Exception。
  • getPage()返回Page。
  • getRequest()返回request。
  • getResponse()返回response。
  • getServletConfig()返回config。
  • getServletContext()返回application。
  • getSession()返回session。
  • getOut()返回out。

另外,通過pageContext還能獲取其所有域中的數據。

4.getAttribute()和findAttribute()的區別

getAttribute()只能獲取自己域中保存的屬性,而findAttribute()則會按照pageContext->request->session->servletContext的順序查找有無對應的屬性。

四大域中,HttpRequest和HttpResponse,session和cookie有很多聯繫,後面會補上response和cookie的總結。



作者:Zhuang_ET
鏈接:https://www.jianshu.com/p/6c02951267d8
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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