淺析 Servlet 執行原理


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


一、UML


下圖為Servlet UML關係圖。


淺析 Servlet 執行原理


從圖中,可以看出:


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等。下圖為簡單的 請求響應 模型。


淺析 Servlet 執行原理


分析:


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


<code>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.");
   }/<code>


(二)控制器角色

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


淺析 Servlet 執行原理

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


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


淺析 Servlet 執行原理


分析:


第一步:容器先加載Servlet類


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


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


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


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


最後我自己是一名從事了多年開發的JAVA老程序員,今年年初我花了一個月整理了一份最適合2020年學習的java學習乾貨,想分享給每一位喜歡java的小夥伴,需要獲取的可以關注我並在後臺私信我:01,即可免費領取。


分享到:


相關文章: