一、Servlet上下文的基本概念
Servlet上下文又叫做:ServletContext。
當WEB服務器啟動時,會為每一個WEB應用程序(webapps下的每個目錄就是一個應用程序)創建一塊共享的存儲區域。
ServletContext也叫做“公共區域”,也就是同一個WEB應用程序中,所有的Servlet和JSP都可以共享同一個區域。
ServletContext在WEB服務器啟動時創建,服務器關閉時銷毀。
//通過當前Servlet類的對象,得到與它關聯的ServletContext對象,也就是上下文 ServletContext application = this.getServletContext(); //HttpSession(私有區域) 與 ServletContext(公共區域) 的區別是什么? 1、作用范圍不同:HttpSession是針對每一個客戶端瀏覽器單獨有一個。 ServletContext是針對每一個WEB應用程序有一個 2、存活時間不同:HttpSession第一次訪問服務器,服務器端調用request.getSession()時創建,訪問間隔時間超過30分鍾就銷毀。 ServletContext服務器啟動時創建,服務器停止時銷毀。
二、Servlet會話
1、理解會話的作用
會話——瀏覽器請求一次服務器,服務器接收請求,處理之后,給出響應,這就是一次會話。
因為HTTP協議是一種“無狀態”協議(斷開連接式協議),也就是服務器給客戶端瀏覽器響應之后,就會斷開網絡連接。下次客戶端瀏覽器請求服務器時會再建立網絡連接。實際上HTTP協議是為了保證服務器的性能。而這種情況下,默認服務器是不會記錄客戶端瀏覽器的信息的。
會話跟蹤——在多次瀏覽器跟服務器的會話過程中,服務器必須要記錄客戶端瀏覽器的一些信息,這個叫會話跟蹤。
2、會話跟蹤原理
試想一下儲戶和銀行的交互過程:
瀏覽器跟服務器交互的過程與其類似
三、HttpSession的使用
對於HttpSession來說,每個獨立的瀏覽器窗口就是一個不同的客戶端,會為它們分配不同的會話ID。
/* 得到會話對象 request.getSession() 方法有兩重含義 1、如果瀏覽器是第一次請求服務器,則請求中沒有會話ID,此時會分配ID,創建空間 2、如果瀏覽器不是第一次請求服務器,則請求中存在會話ID,此時會返回原來的HttpSession對象 */ HttpSession session = request.getSession();
HttpSession何時被創建,何時被銷毀呢?
創建:第一次請求服務器,服務器端的Servlet調用了 request.getSession()方法時被創建。
銷毀:如果瀏覽器間隔時間超過30分鍾沒有訪問服務器,則服務器會銷毀對應的HttpSession對象。(默認30分鍾是可以配置的。)
<session-config> <session-timeout>30</session-timeout> </session-config>
void setAttribute(String key, Object value); 存入鍵值對 Object getAttribute(String key); 根據鍵取出對應的值 HttpSession又被稱為“私有作用域”,或者也叫做“私有區域“
使用HttpSession實現保存用戶信息及登錄驗證!
URL重寫
我們前面如果要給Servlet傳遞數據,都是通過表單提交。
除了這種方式之外,還有一種常見的形式,就是:URL重寫
URL重寫的辦法就是在URL地址之后傳遞請求參數:
格式:URL?參數名1=值1&參數名2=值2……
四、總結
1、 HttpServlet是所有我們自己編寫的Servlet的父類。我們要通常要重寫它的 doGet() 或 doPostt()方法。
Servlet的生命周期是怎樣的?
首次訪問:實例化——>初始化 init() ——> 服務 service() 根據請求是GET還是POST——> 調用 doGet() 或 doPost()
后續訪問:服務 service() 根據請求是GET還是POST ——> 調用 doGet() 或doPost()
在服務器上,Servlet始終只有一個對象!
服務器關閉時:銷毀 destroy()
2、 HttpServletRequest是請求對象,服務器會在有客戶端請求的時候創建這個對象來保存請求的數據。
常用方法:
void setCharacterEncoding(編碼方式) 設置請求內容的編碼方式
String getParameter(參數名稱) 得到請求參數(表單提交,URL重寫)的值
HttpSession getSession() 得到一個私有區域。
首次調用:請求中沒有SessionID,會創建一個新對象
后續調用:請求中有SessionID, 會得到原來的對象
3、 HttpServletResponse是響應對象,Servlet處理之后的結果會放到里面,由服務器發送給客戶端瀏覽器。
常用方法:
void setCharacterEncoding(編碼方式) 設置響應內容的編碼方式
PrintWriter getWritter() 得到一個用來向客戶端瀏覽器發送HTML內容的輸出流對象
void sendRedirect(URL地址) 發送重定向(外部跳轉)
4、 HttpSession 私有區域。
何時創建?
客戶端瀏覽器第一次請求服務器,服務器端的Servlet調用了request.getSession()時創建。
何時銷毀?
訪問間隔時間超過30分鍾(可以配置)就銷毀。
SessionID是存儲在客戶端瀏覽器的內存中,而HttpSession對象存儲在服務器端。每次客戶端瀏覽器請求服務器時,會自動將SessionID發送給服務器。
常用方法:
void setAttribute(鍵,值)
Object getAttribute(鍵)
boolean isNew()
5、 ServletContext 公共區域
何時創建?
服務器啟動時會為每一個WEB應用程序創建一個ServletContext。
何時銷毀?
服務器停止時銷毀。
常用方法:
void setAttribute(鍵,值)
Object getAttribute(鍵)