Java servlet執行的完整流程(圖解含原始碼分析)
摘要:
主要描述了從瀏覽器到伺服器,再從伺服器到瀏覽器的整個執行過程
瀏覽器請求
瀏覽器向伺服器請求時,伺服器不會直接執行我們的類,而是到web.xml裡尋找路徑名
①:第一步,瀏覽器輸入訪問路徑後,攜帶了請求行,頭,體
②:第二步,根據訪問路徑找到已註冊的servlet名稱,既圖中的demo
③:第三步,根據對映找到對應的servlet名
③:第四步,根據根據servlet名找到我們全限定類名,既我們自己寫的類
伺服器建立物件
①:伺服器找到全限定類名後,通過反射建立物件,同時也建立了servletConfig,裡面存放了一些初始化資訊(注意伺服器只會建立一次servlet物件,所以servletConfig也只有一個)
呼叫init方法
①:物件建立好之後,首先要執行init方法,但是我們發現我們自定義類下沒有init方法,所以程式會到其父類HttpServlet裡找
②:我們發現HttpServlet裡也沒有init方法,所以繼續向上找,既向其父類GenericServlet中繼續尋找,在GenericServlet中我們發現了init方法,則執行init方法(對介面Servlet中的init方法進行了重寫)
注意:
在GenericServlet中執行public void init(ServletConfig config)方法的時候,又呼叫了自己無慘無方法體的init()方法,其目的是為了方便開發者,如果開發者在初始化的過程中需要實現一些功能,可以重寫此方法
呼叫service方法
接著,伺服器會先建立兩個物件:ServletRequest請求物件和ServletResponse響應物件,用來封裝瀏覽器的請求資料和封裝向瀏覽器的響應資料
①:接著伺服器會預設在我們寫的類裡尋找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那麼會到其父類中尋找
②:到父類HttpServlet中發現有此方法,則直接呼叫此方法,並將之前建立好的兩個物件傳入
③:然後將傳入的兩個引數強轉,並呼叫HttpServlet下的另外個service方法
④:接著執行service(HttpServletRequest req, HttpServletResponse resp)方法,在此方法內部進行了判斷請求方式,並執行doGet和doPost,但是doGet和doPost方法已經被我們自己重寫了,所以會執行我們重寫的方法
看到這裡,你或許有疑問:為什麼我們不直接重寫service方法?
因為如果重寫service方法的話,我們需要將強轉,以及一系列的安全保護判斷重新寫一遍,會存在安全隱患
向瀏覽器響應
最後處理完資料後,將資料響應到瀏覽器
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22990797/viewspace-2645273/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行流程原始碼分析原始碼
- Mybatis執行流程原始碼分析MyBatis原始碼
- SpringMVC執行流程及原始碼分析SpringMVC原始碼
- 面試高頻SpringMVC執行流程最優解(原始碼分析)面試SpringMVC原始碼
- spark 原始碼分析之二十一 -- Task的執行流程Spark原始碼
- 詳解Java執行緒池的ctl(執行緒池控制狀態)【原始碼分析】Java執行緒原始碼
- 【原始碼分析】XXL-JOB的執行器的註冊流程原始碼
- DRF之請求執行流程和APIView原始碼分析APIView原始碼
- 原始碼解析MyBatis Sharding-Jdbc SQL語句執行流程詳解(文末有流程圖)原始碼MyBatisJDBCSQL流程圖
- 深入Mybatis原始碼——執行流程MyBatis原始碼
- Java多執行緒之Thread原始碼分析Java執行緒thread原始碼
- Servlet基本概念及執行流程Servlet
- jsp+servlet+mysql實現機票預訂航班系統(含原始碼、MySQL、包執行)JSServletMySql原始碼
- Mybatis原始碼系列 執行流程(一)MyBatis原始碼
- Java排程執行緒池ScheduledThreadPoolExecutor原始碼分析Java執行緒thread原始碼
- Facades 原理 (程式碼執行流程分析)
- SSM完整專案(內含原始碼)SSM原始碼
- Servlet過濾器原始碼分析Servlet過濾器原始碼
- JUC(4)---java執行緒池原理及原始碼分析Java執行緒原始碼
- 執行緒池原始碼分析執行緒原始碼
- 【推理引擎】從原始碼看ONNXRuntime的執行流程原始碼
- 原始碼分析OKHttp的執行過程原始碼HTTP
- [原始碼分析] 帶你梳理 Flink SQL / Table API內部執行流程原始碼SQLAPI
- ThreadPoolExecutor原始碼分析-面試問爛了的Java執行緒池執行流程,如果要問你具體的執行細節,你還會嗎?thread原始碼面試Java執行緒
- Glide 4.9 原始碼分析(一) —— 一次完整載入流程IDE原始碼
- jetty、servlet以及spring的銜接原始碼分析JettyServletSpring原始碼
- Netty原始碼分析之Reactor執行緒模型詳解Netty原始碼React執行緒模型
- 好程式設計師Java教程分享Servlet基本概念以及執行流程程式設計師JavaServlet
- Android/java 多執行緒(一)-Thread的使用以及原始碼分析AndroidJava執行緒thread原始碼
- EOS原始碼分析(2)EOS執行原始碼
- sentinel流量控制和熔斷降級執行流程之原始碼分析原始碼
- Zookeeper原始碼分析(一) ----- 原始碼執行環境搭建原始碼
- java之使用Servlet生成驗證碼的原始碼分享JavaServlet原始碼
- Java ArrayList原始碼分析(含擴容機制等重點問題分析)Java原始碼
- Java 11可以直接執行原始碼Java原始碼
- Java併發之執行緒池ThreadPoolExecutor原始碼分析學習Java執行緒thread原始碼
- JAVA併發程式設計:執行緒池ThreadPoolExecutor原始碼分析Java程式設計執行緒thread原始碼
- Flutter Android 端 FlutterEngine Java 相關流程原始碼分析FlutterAndroidJava原始碼