中間件-Tomcat-Servlet

中間件-Tomcat-Servlet

Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作爲來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。

生命週期

Servlet 生命週期可被定義爲從創建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

  • Servlet 通過調用 init () 方法進行初始化。
  • Servlet 調用 service() 方法來處理客戶端的請求。
  • Servlet 通過調用 destroy() 方法終止(結束)。
  • 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

servlet創建
默認是用戶第一次調用對應該Servlet的URL時初始化當前Servlet,該Servlet便一直存在,直到長時間不調用、服務器關閉才銷燬或者類文件更新後重新載入。但可通過配置指定Servlet在服務器第一次啓動的被加載。

<servlet>
	<servlet-name>Xxx</servlet-name>
     <servlet-class>com.lingz.Xxx</servlet-class>
     <load-on-startup>1</load-on-startup>
</servlet>

初始化init()
init在第一次創建Servlet的時候被調用,是單線程的不用擔心多線程安全問題。init簡單的創建或加載一些數據,這些數據將被應用於Servlet的整個生命週期。

service()服務過程

  • 每收到一個請求,服務器會產生一個新的線程並調用service()服務,根據HTTP的請求類型調用doGet,doPost等方法。
  • service()與多線程
    servlet是單例的,當多個請求請求同一個servlet時,要注意線程安全。
    如果service只使用了當前線程自己的資源,就不需要進行同步控制
    如果訪問了全局靜態變量有讀寫操作,通常需要加上同步控制語句
    如果service訪問了全局資源,文件數據庫連接等,通常需要加上同步控制語句

destory()銷燬
當web服務器認爲此servlet沒有存在的必要、類重新加載、服務器關閉、長時間未被訪問,則可以從內存中銷燬。而回收該Servlet內存前必須調用destroy(),web服務器保證該方法被調用時已經結束了請求調用的service()或等待剩餘的請求執行完,並且不會再接收請求。當全部請求處理完並響應後,即可destroy() 並進行內存回收。與init一樣只執行一次

執行流程

  • 根據時機,web容器加載對應的servlet類,並進行init()初始化。
    • 默認第一次請求servlet時初始化
    • 可設置容器啓動時初始化
    • Servlet類文件更新後重新轉載
  • 接收請求,將URL封裝成HttPServletRequest和HttpServletResponse對象,根據配置(web.xml)轉交給對應的servlet。
  • service根據HTTPServletRequest請求的請求類型等信息調用對應的doGet、doPost等方法,進行業務處理。
  • 將處理後的HttpServletResponse返回給web容器
  • web容器在返回給客戶端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章