[Tomcat原始碼系列]結構解析 1)總體結構預覽

potato123發表於2010-03-27

一、從範例開始
    在開始分析之前,我們先使用Tomcat元件來組裝一個完整的WebContainer。
1)準備好目錄結構
    準備好如下目錄結構

BaseDir(C:/tomcattest/)
                    --conf
                    --webapps
  • 從{tomcat目錄}/conf目錄下的拷貝web.xml到如上的conf目錄(可選,支援JSP和welcome file)
  • 拷貝tomcat的examle應用到如上的webapps目錄作為範例

2)範例(注意如下的程式碼說明部分)

package ray.tomcat.test;

import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.core.StandardService;
import org.apache.catalina.startup.HostConfig;

public class TomcatMainV5
{
    public static void main(String[] args) throws Exception
    {
        // 設定基目錄,使用這種方式貌似不夠幽雅
        System.setProperty("catalina.base", "C:/tomcattest/");

        // Connector
        Connector connector = new Connector("HTTP/1.1");
        connector.setPort(8080);

        // 請求處理器(Engine+Host)
        // Host
        StandardHost standardHost = new StandardHost();
        standardHost.setName("localhost");
        standardHost.setAppBase("webapps");
        // HostConfig負責解析Context配置,並將Context加入到Host中,
        standardHost.addLifecycleListener(new HostConfig());
        // Engine
        StandardEngine standardEngine = new StandardEngine();
        standardEngine.setName("Catalina");
        //此處可以看到Host是Engine的Child
        standardEngine.addChild(standardHost);
        standardEngine.setDefaultHost("localhost");

        // Connector+請求處理器 組裝成webserver
        StandardService standardService = new StandardService();
        standardService.setName("Catalina");
        //設定接收請求Connector,可支援多個Connector
        standardService.addConnector(connector);
        //設定請求處理器
        standardService.setContainer(standardEngine);

        // 開始初始化
        standardService.start();

        while (true)
        {
            Thread.sleep(60000);
            System.out.println("still active");
        }
    }
}

 

3)訪問http://localhost:8080/examples,可以看到examples應用生效了
二、總體結構預覽
    從如上的範例,我們大概可以對Tomcat的主要組成有了基本的瞭解,包括其他一些在如上無法反映出來的元件,Tomcat由如下元件組成
1)請求連線接收和分發元件

  • Connector(org.apache.catalina.connector.Connector):包括我們在上一篇 中瞭解的各種Protocol

2)請求處理元件

  • Engine(org.apache.catalina.Engine):Engine是請求處理的入口,一個Engine會包含多個Host,我們看看Tomcat中關於Engine的定義
An Engine is a Container that represents the entire Catalina servlet engine.
  • Host(org.apache.catalina.Host):Host代表了一個虛擬主機(virtual host),一個Host會包含多個Context,我們看看Tomcat關於Host的定義
A Host is a Container that represents a virtual host in the Catalina servlet engine.
  •  Context:Context代表了一個獨立的應用,一個Context會包含多個請求處理器(Wrapper),我們看看Tomcat關於Context的定義
A Context is a Container that represents a servlet context, and therefore an individual web application, in the Catalina servlet engine.
  •  Wrapper:Wraper代表了一個Servlet,我們看看Tomcat關於Wrapper的定義
A Wrapper is a Container that represents an individual servlet definition from the deployment descriptor of the web application.

 

3)組合元件

  • Service:Service通過管理多個Connector和請求處理引擎,處理各Connector進入的請求,並由同一個請求處理引擎進行處理

三、結束語
    本篇通過一個範例對Tomcat的主體結構做一個預覽,具體的細節我們在後面的篇章《生命期控制結構》、《請求處理結構》中更詳細地分析。

相關文章