淺析Servlet執行原理

在JavaWeb學習研究中,Servlet扮演重要的做用,學好它,是後續JavaWeb學習的良好基礎。不管是SSH,仍是SSM,微服務JavaWeb技術,都應先學好Servlet,從而達到事半功倍的效果,本篇將主要分析Servlet的運行原理。html

一 UMLsql

下圖爲Servlet UML關係圖。瀏覽器

從圖中,能夠看出:安全

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

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

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

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

二 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角色

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); out.println("Hello!Servlet."); } (二)控制器角色

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

四 Servlet在容器中的生命週期

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

分析:

第一步:容器先加載Servlet類

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

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

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

第五步:執行destroy(),銷燬線程 歡迎工做一到五年的Java工程師朋友們加入Java羣: 741514154 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索