Tomcat 源码分析[1]

[size=medium][color=red]水平有限,如有不足请留言交流,互相提高,谢谢!转载请提供出处,http://treblesoftware.iteye.com/admin/blogs/515042
[/color][/size]


[quote]TOMCAT作为世界上使用较为广泛的SERVLET容器被许多项目所应用。是很值得学习的。[/quote]

首先,我们先要下载TOMCAT的源码,包括要引入TOMCAT的几个依赖包。

1,到 http://tomcat.apache.org/download-60.cgi 下载 Source Code,我下载的是TOMCAT 6.X 版,可以到这里直接下载:http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-6/v6.0.20/src/apache-tomcat-6.0.20-src.tar.gz

2,下载这几个依赖包:org.eclipse.jdt.core.jar (这里可以到ECLIPES架包里找到);wsdl4j.jar;jaxrpc.jar;junit-4.6.jar;ant.jar 。

OK,新建一个JAVA项目,之后把解压好的tomcat源码放入新建项目中,再把依赖包buildpath一下就可以了。

[img]http://dl.iteye.com/upload/attachment/166950/d3937deb-164e-342f-a694-679a42160caf.jpg[/img]

确保此项目可以正确被构建。

我们首先从 org.apache.catalina.startup; 包中的 Bootstrap 类开始。这个类中拥有一个

MAIN函数入口,我们可以把此入口当作TOMCAT的程序入口,并且在这个类里拥有initClassLoaders,createClassLoader,init,load,start,stop,stopServer,destroy这些方法。

下面是一些源码:

/**
* Start the Catalina daemon.
*/
public void start()
throws Exception {
if( catalinaDaemon==null ) init();

Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
method.invoke(catalinaDaemon, (Object [])null);

}


 /**
* Stop the Catalina Daemon.
*/
public void stop()
throws Exception {

Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] ) null);
method.invoke(catalinaDaemon, (Object [] ) null);

}


/**
* Stop the standlone server.
*/
public void stopServer()
throws Exception {

Method method =
catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
method.invoke(catalinaDaemon, (Object []) null);

}



 /**
* Main method, used for testing only.
*
* @param args Command line arguments to be processed
*/
public static void main(String args[]) {

if (daemon == null) {
daemon = new Bootstrap();
try {
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
return;
}
}

try {
String command = "start";
if (args.length > 0) {
command = args[args.length - 1];
}

if (command.equals("startd")) {
args[0] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[0] = "stop";
daemon.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else {
log.warn("Bootstrap: command \"" + command + "\" does not exist.");
}
} catch (Throwable t) {
t.printStackTrace();
}

}


开始发现一点,反射被大量使用了。首先,这里应该不应该使用反射,我想大家意见不一,不过报着学习源码的态度,我们略过,因为我是设置断点进行调试学习的,所以可以更容易跟踪程序的运行步骤。


首先,我们先看看这个Bootstrap类的设计。

public final class Bootstrap {

private static Bootstrap daemon = null;

public static void main(String args[]) {

if (daemon == null) {
daemon = new Bootstrap();
try {
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
return;
}
}
…… …… ……


[quote]
首先可以看出,daemon做为启动TOMCAT的唯一对象,被设计成了单列。在我认为,daemon 本身就应该为单列对象,它控制着TOMCAT的初始化,本身就应该唯一存在,如果多个daemon 必然导致数据与操控上的问题[/quote]

除了使用了单列模式,这个类中还使用了类似于Template方法模式,这个应该算是一个简单的Template Method,记得MARTIN FOWLER在《重构》中也有把沉长的代码分解为一个一个算法,之后拼装在一起。在下面这个方法中体现的很好。

public void init()
throws Exception
{

// Set Catalina path
setCatalinaHome();
setCatalinaBase();

initClassLoaders();

…… …… ……


看完了设计,下面我们先搞清楚UML图里的一些属性,它到底是干什么用的,包括深入这几个方法,看看它们是怎么初始化的,关闭的。

[img]http://dl.iteye.com/upload/attachment/166968/0656b154-32e0-3746-a37f-6e9012d59f34.jpg[/img]
AWS-解析mysql binlog同步数据方案 虽然是公有云的鼻祖,AWS在某些产品的实现却太不给力;可能是习惯了阿里云喂到嘴边的感觉,AWS很多方案需要自己折腾,蛋疼!比如这里要讲的mysql数据同步方案。 阿里云产品DTS,点几下就OK了,AWS,只能通过插件安装、配置、调试、蹚坑……,具体就是用msk的debezium插件连接器。没见识过的一脸懵逼,下面说下配置步骤和一些注意的坑。 阅读详情

相关推荐

子网划分详解

还不会子网划分?看这篇就够了,保姆级教程

m0_47584619的博客 6093

Spring源码分析【1】-Tomcat的初始化

org.apache.catalina.startup.ContextConfig的webConfig() org.apache.catalina.core.StandardContext的addServletContainerInitializer方法 回到configureStart() ... 到了org.apache.catalina.core.Stan

编程的本质是数学问题 1173

长鑫存储面试真题解析:DRAM工程师的工程直觉与产线思维

DRAM作为现代计算系统的底层存储基石,其性能与可靠性高度依赖半导体物理基础、工艺窗口控制和电路-系统协同设计。理解电荷保持机制、位线电容耦合效应、信号完整性约束等核心原理,是突破传统数字IC思维、构建真实产线语感的关键。在晶圆厂级工程实践中,TEM缺陷识别、BIST空间聚类分析、Retention失效定位等能力,直接关联良率爬坡与客户系统稳定性。本文聚焦长鑫存储一线技术面试中高频出现的工艺-电路-测试三维问题,融合‘电荷保持’‘信号完整性’等热词,还原DRAM工程师必备的系统性建模能力与闭环验证思维,覆盖

weixin_34293246的博客 337

Tomcat源码分析(从0到1)

在Java的类加载机制中,通常使用双亲委派模型,即先向父类加载器请求加载类,如果父类加载器找不到,再由当前类加载器加载。但在Tomcat中,由于需要加载Web应用中的类和Tomcat自身的类,自定义了类加载器,使得Tomcat能够优先加载Web应用程序相关的类,避免与JVM或其他库中的类冲突。Catalina解析server.xml:读取Tomcat的配置文件,实例化配置的各个组件,如Server、Service、Connector等。管理组件生命周期:Catalina通过调用相关组件的init()和。

o0oho的博客 1661

STM32F103单片机驱动TM1637数码管显示模块

最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637四位数码管显示模块 实际运行效果 下面先看一下TM1637和数码管连接的具体线路图 实际使用的模块没有带按键,只用了4个数码管,模块和单片机连接只需要4根线VCC、GND、CLK、DIO。芯片和单片机通信使用的是I2C总线,下面就来说一下如何...

HXYDJ的博客 1万+

【一】PCIe基础知识

Linux PCIe基础知识

他山之石 可以攻玉 4万+

tomcat10.1.0源码分析

server.xml server 代表一个tomcat实例,可包含多个service,管理所有的service生命周期包含多个connector和一个container容器:负责处理请求只有一个,可包含多个host虚拟主机,虚拟主机允许Tomcat引擎在将配置在一台机器上的多个域名每个虚拟主机又可以支持多个web应用部署在它下边,这就是我们所熟知的上下文对象在上下文中又可以部署多个servlet,并且每个servlet都会被一个包装组件(Wrapper)所包含(一个wrapper对应一个servlet)

枫火的博客 806

电子产品的老化测试有哪些类型?

因此,越来越多的人在寻找“已知合格的测试连接器”,即经过测试具有可靠性和有效性的测试连接器,可以在老化测试中制定优化方法。例如对于芯片来说,不同的封装有不同的老化测试座,QFP老化测试座,QFN老化测试座等。老化测试时,专用老化电路板上的元件将承受等于或高于其额定工作条件的压力,以消除任何在额定寿命之前过早失效的元件。静态老化:在此类系统中,将测试设备安装到老化板上的插座中,然后放入老化箱中,其中每隔12至24小时施加电源和高温。动态老化:在动态老化系统中,设备以老化速度设定的最大速率进行测试。

软件技术的专栏 1839

Tomcat源码分析 v0.1

tomcat核心由两大部分组成,connector和container.connector处理与客户端的socket通信,主要是多线程监听,建立,接受,处理socket连接。支持http1.1(bio和nio),apr,memory,ajp协议.

研究源码的最底层,只持有正确的仓位 389

基于STM32设计的水质检测系统_333

水质安全对生态环境、农业生产、工业制造以及人类健康至关重要。针对传统水质检测方式检测周期长、成本高、实时性差的问题,本项目设计并实现了一种基于STM32的水质检测系统。系统采用STM32F103RCT6作为主控芯片,集成水温、pH值、电导率和浊度等传感器,能够实时采集水质数据,并通过OLED显示屏进行本地显示。同时,利用Air724UG 4G模块通过MQTT协议将数据上传至华为云IoT平台,实现远程监测。用户可通过Qt5开发的Android手机APP和Windows上位机查看水质数据,并接收超限报警提示。此

713

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Tomcat源码分析 - 1

1、源代码下载与编译 下载: svn cohttp://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_20 编译: [cpbuild.properties.defaultbuild.properties, mkdirrepository,ant] cd到${tomcat...

weixin_34244102的博客 69

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

tomcat源码分析1 —— 整体架构

tomcat的整体结构大概可以分成两块,一个是Connector,另一个是Container。Connector负责接收请求,建立socket连接,根据请求中的信息创建Request和Response对象,具体的处理逻辑交给Container。 server.xml配置文件描述了tomcat服务器的整体结构。 Server:表示整个Tomcat服务器,包含一个或多个Service。 Service:包含一个或多个connector + 一个Engine。 Engine:包含一个或多个Host。 Host:

haiku的博客 1446

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

tomcat源码分析(1)-环境搭建

@TOC tomcat源码分析(1)-环境搭建 不知道最近为啥总是不再状态,没有看过太大的工程,也不做简介了,顺便当下笔记来使用吧 源码下载地址 修改目录文件,配置webapss目录,配置pom 配置jsp解析、解决版本错误 源码下载地址及版本 https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.16/src/apache-tomcat-9.0.16-src.zip 修改目录文件,配置webapps目录 将apache-tomcat-9.0.16-

u012584808的博客 236

tomcat 7 源码分析-1 关于读取properties及注册系统properties

tomcat 7 源码分析-1 关于读取properties及注册系统properties Tomact的启动开始于Bootstrap.java,在其init()中,首先要做的就是   Java代码           setCatalinaHome();           setCatalinaBase();   initClassLoad...

一条鱼 + 一条鱼 162

idea中的tomcat vm_Tomcat源码分析(1)—搭建Tomcat源码环境

愿你越努力越幸运「歇一歇,继续奔跑」作为Java Web的开发者,一定离不开Tomcat服务器的接触,对于如何使用Tomcat服务器部署项目,大家或许很熟悉,所谓知其然知其所以然,对于Tomcat是如何运行我们部署的项目,我们也应该知道其原理,有利于以后及时定位到问题。硬件环境JDK 1.8Intellij IDEATomcat8.5.59Ant1.10.9Maven 3.6.3...

weixin_29133959的博客 165

Tomcat源码分析:1——成功运行

这个步骤参考了博客https://blog.youkuaiyun.com/qq_35448165/article/details/103792637 1.在官网下载src的zip文件 2.在源码的解压目录里添加pom.xml 我用的tomcat8 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XM

xiaoqistudy的博客 149

SprintBoot 1.X 启动tomcat源码分析,与Tomcat启动war包的不同

SprintBoot启动tomcat与Tomcat单独启动war包的区别

502

eclipse部署tomcat add没有8.5_Tomcat源码分析(1)—搭建Tomcat源码环境

愿你越努力越幸运「歇一歇,继续奔跑」作为Java Web的开发者,一定离不开Tomcat服务器的接触,对于如何使用Tomcat服务器部署项目,大家或许很熟悉,所谓知其然知其所以然,对于Tomcat是如何运行我们部署的项目,我们也应该知道其原理,有利于以后及时定位到问题。硬件环境JDK 1.8Intellij IDEATomcat8.5.59Ant1.10.9Maven 3.6.3...

weixin_39805255的博客 403

tomcat 4.1.30启动过程的源码分析

tomcat 4.1.30启动过程的源码分析                                       前几天为了解决sinpool兄的《多线程的问题。》一帖,专门看了一下tomcat 4.1.30的源码,其中重点研究了tomcat的启动这一部分,个人感觉tomcat的源码还是写的很清楚易懂,值得一看。(以前看过struts的部分代码,感觉也比较经典)然后我看后的代码整理了一

bubei的专栏 751

Tomcat 源码分析-启动分析(1)

Tomcat 源码分析-启动分析(1) 文章目录Tomcat 源码分析-启动分析(1)启动脚本从startup.bat开始执行catalina.bat文件参考资料 启动脚本 windows是.bat,linux就是.sh了,差不多一个意思。 启动脚本做的事情,大多是系统环境变量的判断,在所有前置条件满足的情况下执行Tomcat 的源码的启动类。 从startup.bat开始 1 @echo...

程序员的日常学习 5087

Tomcat4.1.24源码分析导引

  1 前言Tomcat是一个servlet容器,它是Java Servlet和JavaServer Pages技术的官方参考实现。Tomcat是在Apache Software License下开发和发布的一个开放源码的项目。在本文做成时Tomcat的主要版本是Tomcat 5.0.2 Alpha版实现了Servlet2.4/JSP2.0规范和Tomcat4.1.24版实现了Servle

赵晨希的Blog 871

【Web容器】Tomcat源码分析(1)-类加载体系

  前言 Tomcat遵循J2EE规范,实现了Web容器。很多有关web的书籍和文章都离不开对Tomcat的分析,初学者可以从Tomcat的实现对J2EE有更深入的了解。此外,Tomcat还根据Java虚拟机规范实现了经典的双亲委派模式的类加载体系。本文基于Tomcat7.0的Java源码,对其类加载体系进行分析。 概述   首先简单介绍下Java虚拟机规范中提到的主要类加载器;   ...

769

Tomcat 源码分析(二)-请求分析(1)

Tomcat 源码分析(二)-请求分析(1) 文章目录Tomcat 源码分析(二)-请求分析(1)@[toc]一.处理线程的产生了解一下大体的线程情况初始化各个必要的对象加载配置信息,创建Connector节点Connector节点构造方法,创建Http11ProtocolHttp11Protocol 对象的产生执行start方法Connector 类的 startInternal 方法所以,这...

程序员的日常学习 655

tomcat6-源码分析(1)

相关基础概念 容器 在tomcat中的容器有:Engine、Host、context等容器,主要用于服务的封装和组织。 连接器 在tomcat中的连接器其实就是一个多线程的serversocket的accept的过程,把获取的socket分配给连接处理器处理。 连接处理器 在tomcat中,连接处理器主要是对客户端的socket的http请求进行解析,并调用相应的内部过滤器 先进行预处理,然后

m47838704的专栏 322
上一篇: 在MySQL设计索引与使用索引
下一篇: 使用Observer模式改善现有软件设计——构建简便的通知
NationSoftware
博客等级 码龄18年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值