參考:web
Tomcat詳解(1)---Tomcat 的頂層結構及啓動過程設計模式
Tomcat詳解(2)---Tomcat 的生命週期管理瀏覽器
Tomcat詳解(3)---Container 分析tomcat
Tomcat詳解(4)---Pipeline-Value 管道安全
詳解Servlet多線程
四張圖帶你瞭解Tomcat系統架構 總結的很好架構
一、用戶點擊網頁內容,請求被髮送到本機端口8080,被在那裏監聽的Coyote HTTP/1.1 Connector得到。
二、Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的迴應。
三、Engine得到請求localhost/test/index.jsp,匹配全部的虛擬主機Host。
四、Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機),名爲localhost的Host得到請求/test/index.jsp,匹配它所擁有的全部的Context。Host匹配到路徑爲/test的Context(若是匹配不到就把該請求交給路徑名爲「 」的Context去處理)。
五、path=「/test」的Context得到請求/index.jsp,在它的mapping table中尋找出對應的Servlet。Context匹配到URL PATTERN爲*.jsp的Servlet,對應於JspServlet類。
六、構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet()或doPost().執行業務邏輯、數據存儲等程序。
七、Context把執行完以後的HttpServletResponse對象返回給Host。
八、Host把HttpServletResponse對象返回給Engine。
九、Engine把HttpServletResponse對象返回Connector。
十、Connector把HttpServletResponse對象返回給客戶Browser。
Tomcat 是Web應用服務器,是一個Servlet/JSP容器. app
Tomcat 做爲Servlet容器,負責處理客戶請求,把請求傳送給Servlet,並將Servlet的響應傳送回給客戶。而Servlet是一種運行在支持 Java語言的服務器上的組件。 Servlet最多見的用途是擴展Java Web服務器功能,提供很是安全的、可移植的.jsp
一、Connecter組件
一個Connecter將在某個指定的端口上偵聽客戶請求,接收瀏覽器的發過來的 tcp 鏈接請求,建立一個 Request 和 Response 對象分別用於和請求端交換數據,而後會產生一個線程來處理這個請求並把產生的 Request 和 Response 對象傳給處理Engine(Container中的一部分),從Engine出得到響應並返回客戶。
Tomcat中有兩個經典的Connector,
- 一個直接偵聽來自Browser的HTTP請求,
- 另一個來自其餘的WebServer請求。
- Cotote HTTP/1.1 Connector在端口8080處偵聽來自客戶Browser的HTTP請求,Coyote JK2 Connector在端口8009處偵聽其餘Web Server的Servlet/JSP請求。
Connector 最重要的功能就是接收鏈接請求而後分配線程讓 Container 來處理這個請求,因此這必然是多線程的,多線程的處理是 Connector 設計的核心。
二、Container是容器的父接口,
該容器的設計用的是典型的責任鏈的設計模式,它由四個自容器組件構成,分別是Engine、Host、Context、Wrapper。這四個組件是負責關係,存在包含關係。
Tomcat 的容器等級中,Context 容器是直接管理 Servlet 在容器中的包裝類 Wrapper,因此 Context 容器如何運行將直接影響 Servlet 的工做方式。一個 Context 對應一個 Web 工程,
客戶端的請求直接打到tomcat,它監聽端口,請求過來後,根據url等信息,肯定要將請求交給哪一個servlet去處理,而後調用那個servlet的service方法,service方法返回一個response對象,tomcat再把這個response返回給客戶端。
service( HttpServletRequest req, HttpServletResponse resp)
這個方法就是判斷瀏覽器過來的請求方式是哪一種,每種的處理方式不同,咱們經常使用的就是get,post,而且,咱們處理的方式可能有不少的內容,因此,在該方法內會將get,post等其餘5種請求方式提取出來,變成單個的方法,而後咱們須要編寫servlet時,就能夠直接重寫doGet或者doPost方法就好了,而不是重寫service方法,更加有針對性。
因此在編寫servlet時,繼承httpServlet,只要重寫兩個方法,一個doGet,一個doPost,其實就是service方法會調用這兩個方法中的一個(看請求方式)。
從建立到毀滅:
由下面能夠看見,servlet的init方法和destroy方法,通常容器調用這兩個方法之間的過程,就叫作servlet的生命週期。