servlet生命週期和併發

對於單個servlet來說,其生命週期相當簡單:請求來臨時,servlet容器根據請求路徑匹配對應的servlet定義,調用構造函數實例化servlet。實例化之後,再調用servlet的init()方法進行初始化;如果初始化成功,就調用servlet的service()方法處理請求。請求處理完後,servlet的destroy()方法被調用。

根據API的說明,只有當servelt的init方法滿足以下條件時,servlet纔可以接受請求:

  •  不能拋出ServletException;
  •  必須在Web服務器定義的時間內返回;

由此可以看出,一個servlet是否準備就緒關鍵是看init方法是否執行成功。

調用init方法時會傳遞一個ServletConfig對象,把web.xml中配置的<init-param>等參數傳給servelt。同時,ServletConfig也給出了servlet運行時的環境ServletContext。

在實例化的過程中,可能會出現UnavailableException(UnavailableException自帶一些信息表示這個servlet是臨時不能實例化還是永久不能實例化;如果是臨時的,又需要等多久)。如果是臨時不能實例化,則servlet容器必須要等待一段時間才能實例化這個servlet。在此期間被拒絕的任何請求都必須返回503錯誤。如果是永久不能實例化,則被拒絕的請求都必須返回404錯誤。

在實例化的過程中,如果出現的是ServletException,servelt容器可能會重新實例化一個新的servlet。

併發處理

當請求來臨時,servlet容器會初始化對應的servlet。如果多個請求同時訪問的是同一個servlet,Servlet容器會創建多個線程同時調用servlet的service()方法來處理這些請求,而不是多個servlet實例。

如果給service方法設置了synchronized關鍵字,servlet容器則是序列化請求依次通過service方法。

但如果servlet實現了SingleThreadModel接口(此時,這個servlet只能一次處理一個請求),那麼servlet容器會根據請求的數量創建多個servlet的實例(每個servlet實例相當於一個線程),並調用servlet的service方法來處理請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章