還沒關注?

快動動手指!

聊技術、論職場!

爲IT人打造一個“有溫度”的 狸貓技術窩

在JavaWeb學習研究中,Servlet扮演重要的作用,學好它,是後續JavaWeb學習的良好基礎。

無論是SSH,還是SSM,微服務JavaWeb技術,都應先學好Servlet,從而達到事半功倍的效果,本篇將主要分析Servlet的運行原理。

一、UML

下圖爲Servlet UML關係圖。

從圖中可以看出:

  1. 抽象類HttpServlet繼承抽象類GenericServlet,其有兩個比較關鍵的方法,doGet()和doPost()

  2. GenericServlet實現接口Servlet,ServletConfig,Serializable

  3. MyServlet(用戶自定義Servlet類)繼承HttpServlet,重寫抽象類HttpServlet的doGet()和doPost()方法

注: 任何一個用戶自定義Servlet,只需重寫抽象類HttpServlet的doPost()和doGet()即可,如上圖的MyServlet

二、Servlet在容器中的執行過程

Servlet只有放在容器中,方可執行,且Servlet容器種類較多,如Tomcat,WebLogic等。

下圖爲簡單的請求響應模型。

分析:

  1. 瀏覽器向服務器發出GET請求(請求服務器ServletA)

  2. 服務器上的容器邏輯接收到該url,根據該url判斷爲Servlet請求,此時容器邏輯將產生兩個對象:請求對象(HttpServletRequest)和響應對象(HttpServletResponce)

  3. 容器邏輯根據url找到目標Servlet(本示例目標Servlet爲ServletA),且創建一個線程A

  4. 容器邏輯將剛纔創建的請求對象和響應對象傳遞給線程A

  5. 容器邏輯調用Servlet的service()方法

  6. service()方法根據請求類型(本示例爲GET請求)調用doGet()(本示例調用doGet())或doPost()方法

  7. doGet()執行完後,將結果返回給容器邏輯

  8. 線程A被銷燬或被放在線程池中

注意:

  1. 在容器中的每個Servlet原則上只有一個實例

  2. 每個請求對應一個線程

  3. 多個線程可作用於同一個Servlet(這是造成Servlet線程不安全的根本原因)

  4. 每個線程一旦執行完任務,就被銷燬或放在線程池中等待回收

三、Servlet在JavaWeb中扮演的角色

Servlet在JavaWeb中,扮演兩個角色:頁面角色和控制器角色。

有了jsp等動態頁面技術後,Servlet更側重於控制器角色,jsp+servlert+model 形成基本的三層架構

(一)頁面Page角色

(二)控制器角色

jsp充當頁面角色,Servlet扮演控制器角色,兩者組合構建基本的MVC三層架構模式

四、Servlet在容器中的生命週期

下圖爲Servlet生命週期簡要概圖

分析:

第一步 :容器先加載Servlet類

第二步 :容器實例化Servlet(Servlet無參構造函數執行)

第三步 :執行init()方法(在Servlet生命週期中,只執行一次,且在service()方法執行前執行)

第四步 :執行service()方法,處理客戶請求,doPost()或doGet()

第五步 :執行destroy(),銷燬線程

END

作者: Alan

來源:

https://www.cnblogs.com/wangjiming/p/10360327.html

本文版權歸作者所有

爲您推薦:

  1. 扎心一問!你憑什麼成爲top1%的Java工程師?

  2. 【乾貨走一波】千萬級用戶的大型網站,應該如何設計其高併發架構?

  3. PK光明頂?江湖上流傳的幾大消息隊列門派,到底有什麼本質區別?

  4. 扒一扒 JVM 的垃圾回收機制,拿大廠offer少不了它!

  5. 面試阿里?如果對別人開源的Rocket MQ瞭如指掌,豈不是很加分?

  6. 百度、騰訊熱門面試題:聊聊Unix與Java的IO模型?(含詳細解析)

  7. 35歲的大齡碼農們,如何才能不被社會淘汰掉?

  8. 一步一圖,帶你走進Netty的世界!

  9. 想要去阿里面試?你必須得跨過JVM這道坎!

  10. 你連Nginx怎麼轉發給你請求都說不清楚,還好意思說自己不是CRUD工程師?

長按下圖二維碼,即刻關注【 狸貓技術窩

阿里、京東、美團、字節跳動

頂尖技術專家 坐鎮

爲IT人打造一個 “有溫度” 的技術窩!

相關文章