SERVLET簡述

上一篇講了使用者輸入url點選回車後DNS解析及CDN相關內容,這一次繼續往下講,講一個很重要的內容——SERVLET,先上兩張圖。

SERVLET簡述

2-1 servlet執行簡圖

SERVLET簡述

2-2 servlet程式參考圖

先看圖2-2,我們定義了一個TestServlet類,繼承了HttpServlet,並在web。xml做了配置,其中標籤是在專案中聲明瞭類的存在,而則是給外界提供了一個呼叫這個類的入口。再看圖2-1,當我在瀏覽器輸入了http://localhost:8080/sd後,服務端接收到我的請求,根據這個url找到了為“sd”的servlet,並將請求內容送到了TestServlet中,TestServlet經過各種處理後,將響應資訊(可能是html,可能是json資料等)返回給了瀏覽器。這就是servlet的簡要執行過程,當然整個過程不會這麼簡單,下面我們來詳細說一說。

Tomcat開始啟動時會將web。xml的各個配置項解析成相應的屬性儲存在WebXml物件中,然後將這些屬性設定到Context容器中,其中包括servlet物件,它會被包裝成Context容器中的StandardWrapper,也就是說在Tomcat裡面,Context容器直接管理Servlet在容器中的包裝類Wrapper,所以Context容器如何執行將直接影響Servlet的工作方式。

Wrapper。 loadServlet方法會獲取servletClass然後把它交給InstanceManager去建立一個基於servletClass。class的物件,2-2中的是DefaultServlet,如果是jsp就會是JspServlet,這兩個配置可以在Tomcat的conf/web。xml裡看到。物件建立好後就要開始初始化了,初始化Servlet在StandardWrapper的initServlet方法中,這個方法很簡單,就是呼叫Servlet的init()方法,同時把包裝了StandardWrapper物件的StandardWrapperFacade作為ServletConfig傳給Servlet,這樣Servlet物件就初始化完成了。

那麼服務端接收到url請求時,又是怎麼找到對應的servlet呢?Tomcat中有這樣一個類org。apache。tomcat。util。http。mapper,它儲存了Tomcat的Container容器中的所有子容器資訊,org。apache。catalina。connector。Request類在進入Container容器之前,Mapper會根據請求的url匹配每個Servlet中配置的將host和context容器設定到Request的mappingData屬性中,所以當Request進入Container容器之前,它要訪問哪個子容器就已經確定了。

總結一下,瀏覽器傳送請求到服務端,服務端根據url找到對應的servlet,servlet生成資料後將資料返回給服務端,服務端再將響應資料給瀏覽器。