Web 技術成為當今主流的互聯網 Web 應用技術之一,而 Servlet 是 Java Web 技術的核心基礎。這篇博客主要幫助大家了解一個 Web 工程在 Servlet 容器中是如何啟動的? S用戶的請求是如何被分配給指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命周期?cookie和session是如何應用的?
?什么是Servlet?
1)Servlet是Java類
2)Servlet是一個繼承httpServlet類的類
3)這個在服務器端進行,用來處理客戶端的請求
?Servlet容器
要介紹Servlet要先從Servlet容器說起,Servlet與Servlet容器的關系就像槍和子彈的關系,槍為子彈而生,子彈讓槍有了很大的殺傷力。它們彼此依存、又相互獨立發展。而從技術層面來講,它們為了解耦,通過標準化接口來相互協作。
在Tomcat的容器等級中Context容器直接影響Servlet的工作方式。

從圖中可以看出,真正管理Servlet的容器是Context容器,一個Context容器對應一個web工程。
? 初始化Servlet
初始化 Servlet 在 StandardWrapper 的 initServlet 方法中,這個方法很簡單就是調用 Servlet 的 init 的方法,同時把包裝了 StandardWrapper 對象的 StandardWrapperFacade 作為 ServletConfig 傳給 Servlet。Tomcat 容器為何StandardWrapperFacade 給 Servlet 對象將在后面做詳細解析。
如果該 Servlet 關聯的是一個 jsp 文件,那么前面初始化的就是 JspServlet,接下去會模擬一次簡單請求,請求調用這個 jsp 文件,以便編譯這個 jsp 文件為 class,并初始化這個 class。
這樣 Servlet 對象就初始化完成了,事實上 Servlet 從被 web.xml 中解析到完成初始化,這個過程非常復雜,中間有很多過程,包括各種容器狀態的轉化引起的監聽事件的觸發、各種訪問權限的控制和一些不可預料的錯誤發生的判斷行為等等。但是我們只需要先抓住框架,對Servlet有一個基本的了解。
下面是一幅關于初始化Servlet的時序圖(選自[Servlet 工作原理解析](http://www.ibm.com/developerworks/cn/java/j-lo-servlet/))

? Servlet的生命周期
Servlet生命周期就是指創建Servlet實例后,存在的時間以及何時銷毀的整個過程.
--Servlet生命周期有三個方法
init()方法:
service()方法:Dispatches client requests to the protected?service?method
destroy()方法:Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
--Servlet生命周期的各個階段
----實例化:Servlet容器創建Servlet實例
----初始化:調用init()方法
----服務:如果有請求,調用service()方法
----銷毀:銷毀實例前調用destroy()方法
----垃圾收集:銷毀實例
? 關于Servlet的實例
~~~
<span style="font-family:FangSong_GB2312;font-size:18px;">package cn.dragon.servlet;
//導入相應的Jar包
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletExample extends HttpServlet {
//用于獲取請求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GB2312"); //這條語句指明了向客戶端發送的內容格式和采用的字符編碼,當程序出現漢字的亂碼,可以通過修改此處的字符編碼來解決問題。
PrintWriter out = response.getWriter();
out.println(" 您好!"); //利用PrintWriter對象的方法將數據發送給客戶端
out.close();
}
//用于處理客戶端發送的POST請求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); //這條語句的作用是,當客戶端發送POST請求時,調用doGet()方法進行處理
}
}</span>
~~~
? Cookie和Session
Session 與 Cookie 的作用都是為了保持訪問用戶與后端服務器的交互狀態。它們有各自的優點也有各自的缺陷。然而具有諷刺意味的是它們優點和它們的使用場景又是矛盾的,例如使用 Cookie 來傳遞信息時,隨著 Cookie 個數的增多和訪問量的增加,它占用的網絡帶寬也很大,試想假如 Cookie 占用 200 個字節,如果一天的 PV 有幾億的時候,它要占用多少帶寬。所以大訪問量的時候希望用 Session,但是 Session 的致命弱點是不容易在多臺服務器之間共享,所以這也限制了 Session 的使用。
cookie建立在客戶端,默認在指定路徑下生成txt文件,cookie分為兩種,一種是屬于窗口(或子窗口)放在內存中;另一種屬于文本(有生命周期)。當cookie被設置生命周期后,在生命周期的范圍內,該cookie文件會被保留,一旦超出便會自動刪除,釋放空間資源。瀏覽器可以阻止服務器寫入信息,也就是“選項”中“禁用cookies”.
session : 是一個會話,下面是一張圖:

圖中是張三和李四訪問服務器的情況,首次訪問該服務器時系統會自動為張三和李四分配一個session區域,且該區域具有一個唯一的sessionId。當瀏覽器關閉后,會斷開與服務器的連接,當用戶第二次訪問該瀏覽器,會通過自身攜帶的sessionId來搜索對應的session區域。進而實現相應信息的判斷,讀寫等操作。和cookie一樣,都有一個生命周期,session超時后,該session資源會自動釋放。
但是一旦cookie被瀏覽器禁用后,session將無法使用。這就需要使用“重寫URL”的方法:

以上就是這段時間我對Servlet的理解了,如有問題或者好的建議歡迎大家不吝賜教!