专栏首页java技术大本营tomcat学习|源码学习方法及tomcat处理Web请求

tomcat学习|源码学习方法及tomcat处理Web请求

上一波,我们一起新建了web应用,然后把war包丢到tomcat源码中的webapps 目录,然后通过源码启动的方式成功debug运行了我们web应用,并且在浏览器上看到了相应的输出: https://www.lixiang.red/articles/2019/08/13/1565705566068.html

源码学习方法

能debug就debug

直接看源码就很容易头晕,加上现在面向接口编程,我们很难直观看到在运行时,这个接口实际的实现类是什么 但在debug界面就不一样了,我们可以清楚的看到变量的状态值,调用的接口实际上是哪个实现类,如下图所示

所以说,学习源码,公司的项目代码,要运行起来,这样还可以边改边看效果

寻找有效文档并分段

直接从代码看,如果不找文档的话,没有一个学习的入口,不知道从什么地方下手,面对庞大的代码,就会感到学习不下,没法学 我们最开始学习tomcat时,是因为我们知道平时启动tomcat是从startup.sh 开始的,所以我们沿着这个脚本,一步步的找到了Bootstrap.java 的 main函数,然后通过main函数又一步步的研究到各个组件. 从文档中找到学习的入口,可能是某个类的某个方法,可以能是张流程图等等,如现在我们要去学习tomcat 处理web请求,我们可以从相关书籍上找到, 是从CoyoteAdapter.service 进行的主要处理. 这时候,我们就找到了我们学习的入口,然后打断点在方法入口处,后面就可以一步一步的跟踪下去了 然后通过文档里面的关键点,找到代码的对应部分,然后划分代码段落,找到每段代码的大致意思

建立知识库

知识主要分已知和未知,我们大部分的学习,都应该是从已知到未的过程,随着我们学习的深入,不断的有知识点被加入到我们的已知库里面. 如: 我们现在知道知识点A, 然后可以从A 推导出 B,C. 那么就把B,C也加入到我们的已知库里面,下次学习的时候,就可以用B 推导D, C推导E 等等,这样不断的去壮大.

现在对于我们tomcat学习,我们的已知有以下几点: A. 我们已知请求的 url ,http://localhost:8088/study/hello B. 我们已知请求处理的方法入口: CoyoteAdapter.service C. 我们通过以前的文章学习已知: 有coyote组件, Connector组件, Engine组件 等等

那么下面,我们开始边看断点的运行状态边推导,如下图所示 由A和断点状态,

可以看到我们的url 最开始是和

org.apache.coyote.Requestg

是对应起来的,

然后用 Connector.createRequest 去创建了一个

org.apache.catalina.connector

下的Request,也是我们后面一直用的request.

这个就是新知识D, 我们把他加入到我们已知库里面, 然后类似于这样,不断的去壮大已知库

web请求处理

通过上面的方法,我们可以运用到今天的源码学习中. 通过查找资料,我们可以看到tomcat处理web请求时,有以下几个关键点: 1.CoyoteAdapter.Service 2.请求映射 3.获取并执行Engine的valve 4. 判断是否是同步/异步 5.执行对应的逻辑 我们对源码的分段如下图所示,这样本来130多行的源代码,我们只用近10行就把大致意思,过程给精简出来了:

然后我们就可以深入到每一段,看他是怎么处理的,可以循环使用上面的学习方法 下面,我们以请求映射为例一起深入学习下

请求映射

同样,我们先进行代码分段,如下图所示,可以看到300行的代码我们一个屏幕内就可以看到整个大体的逻辑,后面我们可以再把这个再深入,然后分段,这样一直学习下去

本文分享自微信公众号 - java技术大本营(java-ideashare),作者:微笑的小小刀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tomcat学习|通过tomcat源码启动web项目

    上一波,我们学习了tomcat 中主要接口的方法及关系: https://www.lixiang.red/articles/2019/08/12/1565622...

    微笑的小小刀
  • JVM|02内存模型

    Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下...

    微笑的小小刀
  • 来,一起造作吧!拥抱DDD!

    好像从从业开始之后,每每向前辈请教代码怎么写,前辈总是云淡风清的说一句,先建库建表,然后对着建的表写实体类,然后用表和实体类写DAO层,然后跟着写...

    微笑的小小刀
  • OpenGL学习笔记——上色

    Oceanlong
  • 腾讯云批量计算型BC1实例配置性能使用场景及注意事项

    腾讯云批量型实例具有最优单位核时性价比,适用于渲染、基因分析、晶体药学等短时频繁使用超大规模计算节点的计算密集型应用。InstanceTypes分享腾讯云批量计...

    用户2416682
  • Java中GUI的默认窗体布局 和 常见的窗体布局方案

    黑泽君
  • 004.OpenShift命令及故障排查

    OCP将OpenShift集群中的为由主节点管理的对象统称为资源,如:node、service、pod、project、deployment、user。

    木二
  • 打开小程序之门,“拉勾”之约

    接触了小程序,发现还是挺有意思的,学习过程中也写写项目,那这次呢就写了一个拉勾小程序, 来聊一聊踩到的坑,以及如何跳出坑,说不定对你有些帮助,来看看

    前端博客 : alili.tech
  • python的Tqdm模块

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    于小勇
  • python mnist数据导入以及处理

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

    bear_fish

扫码关注云+社区

领取腾讯云代金券