web對象page、request、session、application的生命週期
1、 影響範圍與生命週期劃分
WEB是基於HTTP協議的,HTTP協議是無狀態的。無狀態是指沒法直接經過HTTP鏈接的相關屬性來鑑別用戶狀態。但實際上的WEB應用一般是須要以用戶會話的形式來支撐業務運行的,好比:購物車,BBS,在線交易等。所以常見的WEB服務端技術(如ASP,JSP),把WEB對象影響範圍劃分爲4個生命週期
page
、
request
、
session
、
application
,而且經過一些擴展來實現對會話的支持。
page
是指生命週期在當前頁面範圍內。
request
是指生命週期在一次請求範圍內,如GET和POST。
session
是指生命週期在一個會話範圍內。
application
是指生命週期在整個WEB應用程序從啓動到關閉的範圍內。
2、 實現原理及技術
1.
page
範圍,一般是在頁面中定義的變量,這個變量的生命週期在頁面運行完成後就會結束。
2.
request
範圍,一般是請求過程當中附帶的參數,在這個請求被響應後這些參數的生命週期結束。request參數有表單值或URL中的查詢串等,這兩種值使用request.getParameter()能夠獲得。request範圍的變量還包括在請求處理過程當中設置的屬性,就是request.setAtrribute()設定的值,經過request.getAtrribute()來獲得。請求是能夠進行一次或屢次傳遞的,它分爲兩種,請求轉發和跳轉。請求轉發是使用request.getRequestDispatcher(「path」).forward(request,response)的形式和Include的形式(path必須在同一個webApp內),此時這個請求中全部的Paramter和Atrribute都會向下傳遞。跳轉方式是response.sendRedirect(「url」)的形式(url無限制),跳轉方式實際是向客戶端發送了一個301響應,在HTTP頭中包含了新的URL,由客戶端從新向新的URL進行GET請求。
3.
session
範圍。session就是會話,由於HTTP的無狀態特性因此想實現會話的功能,必須在每個請求和響應上附加一個ID來標識一次會話。服務端通常經過兩種技術來標識會話。第一種是使用cookie技術,cookie是一種客戶端技術,它是用戶瀏覽器提供的功能,一般是以一個受訪問域和大小限制的文本文件在客戶端進行儲存的,在每次請求時都附帶在HTTP頭中。在JSP中是JSESSIONID=XXXX的形式,經過TcpMoniter能夠看到。可是cookie受限於瀏覽器,若是瀏覽器沒有cookie功能或者用戶關閉了cookie功能的話這時候就沒法標識會話(在早期的BBS登錄時一般會看到使用本論壇必須開啓cookie支持)。另外一種技術是使用URL重寫,就是說在每個URL的後面附加一個參數JSESSIONID=XXXX進行標識。在JSP中提供了response.encodeRedirectURL()方法來自動在URL中添加這個參數。WEB服務器根據這個ID在內容中存儲與這個會話相關的數據。因爲不能及時檢測到用戶的退出行爲同時爲了控制內存使用,WEB服務器通常採用超時時間的方式來清理session,默認是30分種,對最後訪問時間大於超時時間的session進行清除。這兩種技術各有優劣,URL重寫的方式解決了cookie技術受限於瀏覽器的缺陷(目前瀏覽器默認支持cookie),但採用cookie技術能夠在用戶關閉瀏覽器後再次打開瀏覽器進行訪問時保持會話, URL重寫的方式則不行。所以有些比較重要的網站如電子商務等會同時採用兩種技術。
4.
application
範圍。就是在內存中開闢一塊全局共享的區域同一個webApp中的程序均可以進行讀寫,通常用於全局變量和常量等。
3、 使用方法
JSP中一共內置了9個隱含對象page(JSP自己,或者講是編譯後的Servlet)、config(存放着一些Servlet 初始的參數)、request(包含HTTP頭和請求相關的參數值等)、response(將JSP 處理數據後的結果傳回到客戶端,能夠設定HTTP頭,響應狀態碼,URL重寫等)、out(把結果輸出到網頁上)、session(表示目前用戶的會話情況)、application(用在存取環境的信息)、pageContext(存取其餘隱含對象,及對象屬性)、exception(若要使用exception 對象時,必須在page 指令中設定。<%@ page isErrorPage=」true」 %>才能使用)。包含了前面的4個表示範圍的對象。
在Servlet中提供了doPOST和doGET方法,request和response是方法的參數。能夠經過request.getSession()取得session對象,經過super.getServletContext()取得application對象。
歡迎關注本站公眾號,獲取更多信息