天天看點

Servlet的執行流程

Servlet的執行流程
具體流程:

1)用戶端主機通過請求中的IP找到伺服器主機,并建立連結;

2)用戶端浏覽器将表單中的資料封裝在HTTP請求封包中,并将該請求封包發送給伺服器;

3)伺服器接收到用戶端浏覽器發送過來的請求封包,解析請求封包中的url(例如url為:http://localhost:8080/MyDemo/helloServlet):

  (1)解析url,得到端口号8080,虛拟目錄MyDemo,資源請求路徑helloServlet。

  (2)伺服器(可能是一台主機,也可能是計算機叢集)根據端口号可以找到用戶端浏覽器要想問的應用程式(伺服器上運作了許多應用程式,沒有端口号,就不知道浏覽器要通路的是哪個應用程式了),簡單來說就是通過端口找到Web容器(Tomcat);

  (3)伺服器根據虛拟目錄MyDemo找到從Tomcat部署的衆多Web應用找到浏覽器正在通路的那個Web應用;

  (4)伺服器根據資源請求路徑helloServlet在Web應用的WEB-INF檔案夾的web.xml檔案中找到浏覽器要通路的Servlet的全類名

Servlet的執行流程

4)伺服器找到Servlet的全類名後,通過反射建立對象,同時也建立了ServletConfig(裡面存放了一些初始化資訊,這些資訊這可以在init-para标簽對中進行配置,Tomcat在建立ServletConfig對象之後,會将init-param标簽對中的值設定到這個ServletConfig對象中,用于進行初始化操作);

Servlet的執行流程

5)對象建立好之後,首先要執行init()方法,但是我們發現我們自定義類下沒有init方法,是以程式會到其父類HttpServlet裡找。但是我們發現HttpServlet類裡也沒有init()方法,是以繼續向上找,即向其父類GenericServlet中繼續尋找,在GenericServlet中我們發現了init方法,則執行init方法(對接口Servlet中的init方法進行了重寫)

Servlet的執行流程

注意:在GenericServlet中執行public void init(ServletConfig config)方法的時候,又調用了自己無慘無方法體的init()方法,其目的是為了友善開發者,如果開發者在初始化的過程中需要實作一些功能,可以重寫此方法;

6)調用service()方法

  (1)伺服器(Tomcat)會先建立兩個對象:ServletRequest請求對象和ServletResponse響應對象,其中ServletRequest和ServletResponse是Servlet定義的接口,而具體的實作類是由Tomcat進行實作的,ServletRequest和ServletResponse的實作類為:RequestFacade類和ResponseFacade;

  (2)伺服器(Tomcat)将HTTP請求封包封裝在ServletRequest對象中,并與ServletResponse對象一個傳遞給service()方法;

  (3)接着伺服器會預設在我們寫的類裡尋找service(ServletRequest req, ServletResponse res)方法,但是HelloServlet類中不存在,那麼會到其父類中尋找;

Servlet的執行流程

7)使用ServletResponse對象向浏覽器傳回響應消息

Servlet的執行流程