Java servlet執行的完整流程(圖解含原始碼分析)

n-lauren發表於2019-05-23

摘要: 

主要描述了從瀏覽器到伺服器,再從伺服器到瀏覽器的整個執行過程


瀏覽器請求


瀏覽器向伺服器請求時,伺服器不會直接執行我們的類,而是到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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章