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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。