1. 程式人生 > >Tomcat中容器是什麼以及容器與容器之間的數量關係。

Tomcat中容器是什麼以及容器與容器之間的數量關係。

Tomcat容器到底是什麼

學java有一小段時間了,一直使用Tomcat,也知道Tomcat是一個大的Servlet容器,裡面還有許多子容器,容器之間都是相互巢狀的。也看過一下接收Tomcat的文章,都是一幅圖,圖中有好多個框框相互巢狀,表示容器與容器之間的相互巢狀,也沒什麼說明,把我看得雲裡霧裡的。所以要想了解的更多必須自己探索一下。

  現在把自己學到的一點點知識記下來,以免忘記了。

  都說Tomcat是一個容器,那麼這個容器到底是什麼東西,因為說它是一個容器我還是覺得有點抽象,而我看了很多文章都沒看到有人說。所以,我想知道Tomcat的本質。腦袋有點轉不過彎來,寫到這裡才發現既然Tomcat是用java寫的那它的容器的本質應該就是java類啦。

  在開始探索之前我就知道Tomcat中有Server、Service、Engine、Host.....等容器。這些容器與容器之間相互巢狀。既然這些容器的本質就是實實在在的java類(容器就是java類,已經夠具體了,這樣我才能理解,因為我天天寫java類 ^v^ ),那這些不同的容器分別使用什麼樣的java類來描述的呢???我點是我想要知道的。

  經過一番探索,知道這些容器都是有生命週期的java類,他們都繼承了共同的介面 Lifecycle 。所以Lifecycle就是這些容器這些java類的頂層介面了。下面是我畫的繼承體系圖。

圖一:圖片儲存下來看吧,部落格園的圖片編輯無語,改天好好研究一下怎麼讓他彈出來再改。

 通過圖中的類名就可以知道哪些類是表示Server,哪些是表示Service哪些是。。。。。。

Tomcat中的這些容器都是有生命週期的容器,那麼它的類肯定就有宣告週期方法了。先看看頂層介面 Lifecycle ,這個接口裡面主要定義了一些生命週期的方法。所以,繼承自這個介面的所有容器都有生命週期。

圖二:

 init()方法:初始化容器元件,它必須在啟動容器之前呼叫。它會建立許多物件。

start():啟動容器,比如啟動一個Server。

stop():停止執行

destroy():銷燬這個容器。

Server容器:一個StandardServer類例項就表示一個Server容器

Service容器:一個StandardService類例項就表示一個Service容器

Engine容器:一個StandardEngine類例項就表示一個Engine容器。

Host容器:一個StandardHost類例項就表示一個Host容器。

Context容器:一個StandardContext類例項就表示一個Context容器。

Wrapper容器:一個StandardWrapper類例項就表示一個Wrapper容器。

以上一共有六種型別的容器,從上到下巢狀,也就是Server容器裡面有Service容器,Service容器裡面有Engine容器。。。。。。這就是這些容器之間的巢狀關係。

需要注意的是,這些容器之間存在父子關係,但是他們對應的java類之間卻不是父子關係。由圖一可以看出來。

父容器與子容器之間的數量關係

這些父容器和子容器之間有什麼樣的數量關係呢???

一個Server容器可以有多個Service容器

   /**
     * The set of Services associated with this Server.用一個數組來儲存子容器的引用
     */
    private Service services[] = new Service[0];

一個Service容器只可以有一個子容器。

/**
     * The Container associated with this Service. (In the case of the
     * org.apache.catalina.startup.Embedded subclass, this holds the most
     * recently added Engine.)
    它不是用一個數組來儲存子容器的引用的。所以直接的子容器只有一個。
*/ protected Container container = null;

這裡用Container來表示子容器,根據圖一可以看出,Container是Engine、Host、Context、Wrapper 介面的父介面,所以Service容器下面的子容器可能是Engine、Host、Context、Wrapper。但是我覺得一般情況下Service的子容器都是Engine容器吧。
一個Engine容器裡面可以有多個 Host 容器

    /**
     * Add a child Container, only if the proposed child is an implementation
     * of Host.
     *
     * @param child Child container to be added
     */
    @Override
    public void addChild(Container child) {

        if (!(child instanceof Host))//這裡說明Engine的子容器只能是Host
            throw new IllegalArgumentException
                (sm.getString("standardEngine.notHost"));
        super.addChild(child);

    }

一個Host容器裡可以有多個 Context 容器。

    /**
     * Add a child Container, only if the proposed child is an implementation
     * of Context.
     *
     * @param child Child container to be added
     */
    @Override
    public void addChild(Container child) {

        child.addLifecycleListener(new MemoryLeakTrackingListener());

        if (!(child instanceof Context))//這裡說明Host容器的子容器只能是Context容器
            throw new IllegalArgumentException
                (sm.getString("standardHost.notContext"));
        super.addChild(child);

    }

一個Host容器中可以有多個Wrapper容器。

    /**
     * Add a child Container, only if the proposed child is an implementation
     * of Wrapper.
     *
     * @param child Child container to be added
     *
     * @exception IllegalArgumentException if the proposed container is
     *  not an implementation of Wrapper
     */
    @Override
    public void addChild(Container child) {

        // Global JspServlet
        Wrapper oldJspServlet = null;

        if (!(child instanceof Wrapper)) {//這裡說明Context容器的子容器只能是Wrapper容器。
            throw new IllegalArgumentException
                (sm.getString("standardContext.notWrapper"));
        }
      //這裡刪除了部分程式碼
    
    }

Wrapper容器下面不允許再有子容器。Wrapper容器是最底層的容器。如果新增子容器的話會丟擲異常。

    /**
     * Refuse to add a child Container, because Wrappers are the lowest level
     * of the Container hierarchy.
     *
     * @param child Child container to be added
     */
    @Override
    public void addChild(Container child) {

        throw new IllegalStateException
            (sm.getString("standardWrapper.notChild"));

    }

伺服器接收到請求資訊後如何傳到我們編寫的HttpServlet的呢??如果是SpringMVC的話會先到DispatcherServlet再到Controller,而DispatcherServlet也是HttpServlet的一個間接子類。在下一篇文章Tomcat是如何將請求一步步傳遞到我們編寫的HttpServlet類中的

相關推薦

JAVA基礎之類和物件以及之間關係

面向物件是當前軟體開發的主流設計規範,是一種程式語言模式。 面向物件主要包括面型物件分析,面型物件設計,面型物件程式設計。 面型物件分析就是以面向物件“類”的概念去認識問題,分析問題。 1.下面舉一個很簡單的例子,介紹如何建立一個類,以及如何建立類的物件,構造方法,自己定義的方法。

BLE Mesh 前言1:什麼是藍芽Mesh,以及BLE之間關係

我們知道藍芽是目前普及率很廣的全球通用型無線通訊標準,他為智慧裝置帶來了簡捷,安全的連線。但是從它的第一版推出到5.0版本,還是主要針對星型拓撲網路。這也直接決定了它的網路覆蓋面積是有限的。 直到去年的藍芽Mesh標準的推出,才正式為藍芽的應用推向了更廣泛的空間。全新的藍芽

設計模式——類圖以及之間關係

    設計模式在程式設計上有著很重要的作用,使用設計模式可以使得程式碼更容易被理解,使得程式碼更規範,真正實現工程化。 一、用UML表示一個類 類圖一般是三行的結構: 類名稱屬性:格式(可見性

Java的finalize方法gc之間關係

一、可達性演算法   要知道物件什麼時候死亡,我們需要先知道JVM的GC是如何判斷物件是可以回收的。JAVA是通過可達性演算法來來判斷物件是否存活的。這個演算法的基本思路就是通過一系列的稱為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱

Tomcat容器是什麼以及容器容器之間數量關係

Tomcat容器到底是什麼 學java有一小段時間了,一直使用Tomcat,也知道Tomcat是一個大的Servlet容器,裡面還有許多子容器,容器之間都是相互巢狀的。也看過一下接收Tomcat的文章,都是一幅圖,圖中有好多個框框相互巢狀,表示容器與容器之間的相互巢狀,也沒什麼說明,把我看得雲裡霧裡的。所以要

Docker的鏡像容器

容器 mage 構建 create creat root用戶 需要 生命 root docker的整個生命周期有三部分組成:鏡像(image)+容器(container)+倉庫(repository); 容器是由鏡像實例化而來,這和我們學習的面向對象的概念十分相似,我們可以

STL 容器 演算法 迭代器 之間關係

https://blog.csdn.net/adobeadge/article/details/6750831 最近一直在看侯捷寫的《STL原始碼剖析》小有想法。故此一記 1,三者之間聯絡:         

JavaString類常見方法以及之間的轉換

String類中的方法描述 public String() 空引數構造方法 public String(byte[] bytes) 把位元組陣列轉換成字串物件 public String(byte[] bytes,int index,int length) 把位元組陣

伯努利分佈、二項分佈、Beta分佈、多項分佈和Dirichlet分佈他們之間關係以及在LDA的應用

  在看LDA的時候,遇到的數學公式分佈有些多,因此在這裡總結一下思路。 一、伯努利試驗、伯努利過程與伯努利分佈 先說一下什麼是伯努利試驗: 維基百科伯努利試驗中: 伯努利試驗(Bernoulli trial)是隻有兩種可能結果的單次隨機試驗。 即:對於一個隨機變數而言,P(X

Java之間關係以及自己的理解

網上關於此類的討論非常多,發現對於該問題的理解各有各的說法,而各個說法中又相去甚遠。通過瀏覽這些討論以及對《O'Reilly - UML 2.0 In A Nutshell (2007)》的參考,發表一下自己的看法 類間關係有很多種,在大的類別上可以分為兩種:縱向關係、橫向

javaintbyte,以及longbyte之間的轉換

轉載請註明出處! 做專案時候根據協議在傳送網路流的時候需要將所有int及long轉換成byte,因此寫了以下的轉換方法,希望能幫助到需要的朋友 ^_^ 閒話少說,直接上碼。 public cla

vue2.0在頁面自定義元件模組,以及頁面元件之間的資料傳遞

1.在頁面上引入寫好的元件import UpdataPassword from './updataPassWord'       //updataPassWord為元件的name2.註冊元件components:{               //註冊元件  UpdataPa

docker 建立.netcore2.2 api容器 以及連線mysql容器

1】環境說明 作業系統:Window 10 專業版 開發工具 Vs2019專業版 Docker:  Docker for Windows    docker在windows上安裝完畢之後可以看到       2】拉取mysql映象以及建立容器 1:

Golang 如何用 CGO C 之間做一個快取 buffer

Golang 是一個不錯的語言,尤其是做一個快取中間層是非常非常容易的。比較常見的場景就是我們在讀一個很大很大的檔案的時候,我們是做不到一次載入檔案到記憶體的,Golang 可以做到一點一點的將檔案讀至末尾,慢慢處理完,相信很多語言也很容易做到這個,那如果在處理這個檔案的時候專案的主語言是 Golang 而需

tomcat 安裝環境配置java的jdk和jre的環境配置

我安裝的是apache-tomcat-7.0.85,直接從官往下的,直接解壓就可以使用的。 下載完,解壓檔案-》bin-》 startup.bat(啟動伺服器)(shutdown.bat這是關閉伺服器),雙擊啟動伺服器將彈出下面的視窗。最後一行顯示的是 Server sta

設計模式之間關係

在設計模式中類與類之間的關係主要有6種:依賴、關聯、聚合、組合、繼承、實現,它們之間的耦合度依次增加。 一、繼承關係       繼承是一種“is-a”關係。 繼承指的是一個類(稱為子類

CSS3 的 rem 值 px 之間的換算

bootstrap預設 html{font-size: 10px;} rem是一個相對大小的值,它相對於根元素, 比如假設,我們設定html的字型大小的值為html{font-size: 87.5%;}(也就是14px)。 然後其他的字型就是將你要的值除以14得到的值;

廣瑞達揭祕龍華大浪注塑模具價格之間關係

隨著工業化的不斷髮展,我國已發展成為世界注塑加工產品大國,每年所製造的注塑產品流向世界各地,稱之為工業之母的模具工業在經歷了半個多世紀的發展後已有了較大的提高,發展速度十分迅速。總的來說,我國模具設計與製造技術的發展經歷了手工作坊製造的萌芽階段、工業化生產的快速發展及產品競爭階段和現代化生產的品牌競

activityfragment以及fragmentfragment之間的通訊

activity向其引用的fragment傳值 第一步 : Activity中建立Fragment物件 , 呼叫setArguments(bundle) 方法儲存值 第二步 : Fragment

之間關係:依賴關係和關聯關係及繼承關係self是什麼? 類裡面的特殊成員

類與類之間的關係   ⼤千世界, 萬物之間皆有規則和規律. 我們的類和物件是對⼤千世界中的所有事物進行歸類. 那事物之間存在著相對應的關係. 類與類之間也同樣如此. 在⾯向物件的世界中. 類與類中存在以下關係:  1. 依賴關係  2. 關聯關係  3. 組合關係  4. 聚合關係  5. 繼承關係  6.