1. 程式人生 > >Java servlet執行的完整流程(圖解含原始碼分析)

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方法的話,我們需要將強轉,以及一系列的安全保護判斷重新寫一遍,會存在安全隱患

向瀏覽器響應

這裡寫圖片描述
最後處理完資料後,將資料響應到瀏覽器