Web容器(三):Servlet規範和Servlet容器

本文參照:極客時間-《深入拆解 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接口,前者是基於過程的,後者是基於狀態的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章