域對象
可以在不同Servlet之間傳遞數據的對象,就是域對象
只要是域對象都有如下方法
- setAttribute(name,value);存儲數據的方法
- getAttribute(name);根據name獲取對應數據值
- removeAttribute(name);刪除數據
JavaWeb有 ServletContext、ServletRequest、HttpSession、PageContext 四大域對象,下面主要從域對象的生命週期、作用、作用範圍進行介紹。
Servlet中只有前三個域對象,JSP中多了一個pageContext對象。
.
.
圖解作用域
一、ServletContext(jsp中對象名:application)
1.生命週期
當web應用被加進容器時,創建代表整個web應用的ServletContext對象,當服務器關閉,或web應用被移除時,ServletContext對象跟着被銷燬。
2.作用範圍
整個web應用內部共享。
3.作用
由於一個web應用中的所有Servlet共享同一個ServletContext對象:因此Servlet對象之間可以通過ServletContext來是實現通訊。ServletContext對象通常也被稱爲context域對象。
應用
- 多個Servlet通過ServletContext對象實現數據共享。
- 獲取web應用的初始化參數 getInitParameter。
- 利用ServletContext對象讀取資源文件。
servletContext.getRealPath("/xx.properties"),servletContext.getResourceAsStream()。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
//將數據存儲到ServletContext中
getServletContext().setAttribute("emplist", list);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取數據
Object object = getServletContext().getAttribute("emplist");
if(object!=null){
List<String> list = (List<String>) object;
for (String string : list) {
response.getWriter().write(string);
}
}
}
二、Session
1.生命週期
- 服務器在運行時可以爲每一個用戶的瀏覽器創建一個對應JSESSIONID獨享的session對象,由於session爲用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。
- 在第一次調用request.getSession()方法時,服務器會檢查是否已經有對應的session,如果沒有就在內存中創建一個並返回。
- 當一段時間內,session沒有被使用(默認是30分鐘),服務器會銷燬該session。如果服務器非正常關閉(強行關閉),還未到期的session也會被銷燬。
另外,調用session的invalidate()方法可以立即銷燬session。
2.作用範圍
一次回話(客戶端與服務器任意一端關閉就結束)。
三、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()。
- 獲得客戶機請求參數(客戶端提交的數據 POST / GET):getParameter()等。
四、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有很多聯繫。