本文參照:極客時間-《深入拆解 Tomcat & Jetty》-03_你應該知道的Servlet規範和Servlet容器 & 04_打造和運行一個Servlet
Servlet規範
Servlet容器用來加載和管理業務類。HTTP服務器不直接跟業務類打交道,而是把請求交給Servlet容器去處理,Servlet容器會將請求轉發到具體的Servlet,如果這個Servlet還沒創建,就加載並實例化這個Servlet,然後調用這個Servlet的接口方法。因此Servlet接口其實是Servlet容器跟具體業務類之間的接口。
圖的左邊表示HTTP服務器直接調用具體業務類,它們是緊耦合的。再看圖的右邊,HTTP服務器不直接調用業務類,而是把請求交給容器來處理,容器通過Servlet接口調用業務類。因此Servlet接口和Servlet容器的出現,達到了HTTP服務器與業務類解耦的目的。
而Servlet接口和Servlet容器這一整套規範叫作Servlet規範。Tomcat和Jetty都按照Servlet規範的要求實現了Servlet容器,同時它們也具有HTTP服務器的功能。
Servlet容器
Spring、SpringMVC和Servlet
Tomcat&Jetty在啓動時給每個Web應用創建一個全局的上下文環境,這個上下文就是ServletContext,其爲後面的Spring容器提供宿主環境。
Tomcat&Jetty在啓動過程中觸發容器初始化事件,Spring的ContextLoaderListener會監聽到這個事件,它的contextInitialized方法會被調用,在這個方法中,Spring會初始化全局的Spring根容器,這個就是Spring的IoC容器,IoC容器初始化完畢後,Spring將其存儲到ServletContext中,便於以後來獲取。
Tomcat&Jetty在啓動過程中還會掃描Servlet,一個Web應用中的Servlet可以有多個,以SpringMVC中的DispatcherServlet爲例,這個Servlet實際上是一個標準的前端控制器,用以轉發、匹配、處理每個Servlet請求。
Servlet一般會延遲加載,當第一個請求達到時,Tomcat&Jetty發現DispatcherServlet還沒有被實例化,就調用DispatcherServlet的init方法,DispatcherServlet在初始化的時候會建立自己的容器,叫做SpringMVC 容器,用來持有Spring MVC相關的Bean。同時,Spring MVC還會通過ServletContext拿到Spring根容器,並將Spring根容器設爲SpringMVC容器的父容器,請注意,Spring MVC容器可以訪問父容器中的Bean,但是父容器不能訪問子容器的Bean, 也就是說Spring根容器不能訪問SpringMVC容器裏的Bean。說的通俗點就是,在Controller裏可以訪問Service對象,但是在Service裏不可以訪問Controller對象。
總結
1.Servlet規範:Servlet和Servlet容器的一整套規則
2.Servlet和Servlet的出現是爲了解耦http服務器和業務邏輯
3.ServletRequest和ServletResponse對象是對通信協議的封裝
4.Servlet接口有5個方法,其中包括生命週期函數兩個:init和destroy;獲取信息的函數兩個:getServletConfig和getServletInfo;還有一個就是業務邏輯處理方法:service
5.一個ServletContext接口對應一個web應用,它持有web應用中的所有servlet,所以可以通過它來實現請求在Servlet之間的轉發
6.Servlet容器的擴展機制:Filter接口和Listener接口,前者是基於過程的,後者是基於狀態的