首页 > 其他 > 详细

Tomcat源码分析

时间:2019-07-22 11:30:48      阅读:72      评论:0      收藏:0      [点我收藏+]

 

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中的管道

技术分享图片

技术分享图片

 

Tomcat源码分析

原文:https://www.cnblogs.com/Soy-technology/p/11223604.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!