Tomcat源碼分析(下載、啟動)


 

1.下載Tomcat源代碼:

https://tomcat.apache.org/download-80.cgi

 

 

2. 解壓以及創建必要目錄和配置

解壓、新建catalina-home目錄,同時將目錄中的confwebapps文件夾復制到catalina-home目錄中

 

 

 

需要通過Maven組織文件,因此需要在根目錄下創建目錄中新建pom.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.apache.tomcat</groupId>

    <artifactId>Tomcat8.5</artifactId>

    <name>Tomcat8.5</name>

    <version>8.5</version>

 

    <build>

        <finalName>Tomcat8.5</finalName>

        <sourceDirectory>java</sourceDirectory>

        <testSourceDirectory>test</testSourceDirectory>

        <resources>

            <resource>

                <directory>java</directory>

            </resource>

        </resources>

        <testResources>

           <testResource>

                <directory>test</directory>

           </testResource>

        </testResources>

        <plugins>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>2.3</version>

                <configuration>

                    <encoding>UTF-8</encoding>

                    <source>1.8</source>

                    <target>1.8</target>

                </configuration>

            </plugin>

        </plugins>

    </build>

 

    <dependencies>

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.easymock</groupId>

            <artifactId>easymock</artifactId>

            <version>3.4</version>

        </dependency>

        <dependency>

            <groupId>ant</groupId>

            <artifactId>ant</artifactId>

            <version>1.7.0</version>

        </dependency>

        <dependency>

            <groupId>wsdl4j</groupId>

            <artifactId>wsdl4j</artifactId>

            <version>1.6.2</version>

        </dependency>

        <dependency>

            <groupId>javax.xml</groupId>

            <artifactId>jaxrpc</artifactId>

            <version>1.1</version>

        </dependency>

        <dependency>

            <groupId>org.eclipse.jdt.core.compiler</groupId>

            <artifactId>ecj</artifactId>

            <version>4.5.1</version>

        </dependency>

       

    </dependencies>

</project>

3. 配置IDEA運行項目

 

通過pom.xml文件構建一個新的工程

 

 

 

 

 

如果編譯build的時候出現Test測試代碼報錯,注釋該代碼即可。Tomcat源碼util.TestCookieFilter類會報錯,將其注釋即可

 

 

 

 

 

Tomcat啟動的目錄為一個main方法類:org.apache.catalina.startup.Bootstrap

 

 

 

添加VM options

-Dcatalina.home=catalina-home

-Dcatalina.base=catalina-home

-Djava.endorsed.dirs=catalina-home/endorsed

-Djava.io.tmpdir=catalina-home/temp

-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

-Djava.util.logging.config.file=catalina-home/conf/logging.properties

 

 

 

 

運行項目,訪問http://localhost:8080,得到結果:

 

 

 

原因是我們直接啟動org.apache.catalina.startup.Bootstrap的時候沒有加載org.apache.jasper.servlet.JasperInitializer,從而無法編譯JSP

解決辦法是在tomcat的源碼org.apache.catalina.startup.ContextConfig中的configureStart函數中手動將JSP解析器初始化:

添加代碼:context.addServletContainerInitializer(new JasperInitializer(), null);

添加位置如下圖:

 

 

修改完后,項目再啟動,我們再在瀏覽器訪問http://localhost:8080/ ,就可以看到我們所熟悉的經典歡迎頁面了

 

 

Tomcat啟動流程分析

組件的生命周期管理

 

用Lifecycle管理啟動、停止、關閉

Lifecycle接口預覽

幾個核心方法

Server中的init方法示例

為啥StandardServer沒有init方法

LifecycleBase中的init與initInternal方法

為什么這么設計?

 

分析Tomcat請求過程

鏈接器(Connector)與容器(Container)

解耦

Connector設計

監聽服務端口,讀取來自客戶端的請求

將請求數據按照指定協議進行解析

根據請求地址匹配正確的容器進行處理

將響應返回客戶端

Container設計

Servlet容器的實現。

Servlet的請求和響應如何在容器中流轉呢?

 

管道模式

管道與閥門

管道是就像一條管道把多個對象連接起來,整體看起來就像若干個閥門嵌套在管道中,而處理邏輯放在閥門上。

Tomcat中的管道

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM