Tomcat中间件-Servlet的加载流程

前言:Servlet在Tomcat是如何被生成,如何被调用的,这篇作为这些过程的笔记

简单分析

根据如下的Tomcat的架构图所示,一个HTTP请求应该是在EndPoint处接收,然后再来到Processor进行处理,接着通过Adapter进行封装为Servlet对象的相关类,最后才是被Container中的对象来进行处理

简单的整理下,其实流程就应该是如下所示

寻找HTTP请求监听入口点

这里就直接给了入口点是哪里了

org/apache/tomcat/util/net/NioEndpoint.java#processKey,这个方法提供了对外部请求socket的处理方法

上面获取到了这个socket之后,这里就会准备通过缓存池中取出相关processor对象来对这个socket进行处理

SocketProcessor这个对象是一个实现了Runnable的对象,所以它在线程池运行的执行,则调用的是它的run方法

接着就是processor对象的出场,这里会对这个socket来进行处理

一般对socket处理的processor对象都是Http11Processor对象

继续跟

接着就是来到了processor对象的处理分支过程,因为上面走的分支是read,所以这里processor走的也是read分支

processor会将这个处理继续转接给Adapter对象,让它对这个request/response来进行转换Servelt的Request/Response

Adapter对象进行转换操作

转换完了之后Adapter之后就开始进行通过Container组件来进行invoke反射调用

Engine引擎反射调用

这里跟进去为什么会出现AccessLogValve的反射调用呢?其实这个跟server.xml也有关系,因为配置中有包含这个组件的调用

接着就会涉及到HOST到Context的过渡

再之后就是Context会选取对应的解析器来进行过渡,就比如有存在jsp和Servlet这两种情况

再最后的话就是调用这个jsp/servlet了

这里其实还有一个过滤器链,但是这里就不讲了,因为自己在这篇内容中有记录过,关于过滤器链Filter,可以来看下这篇参考 https://www.cnblogs.com/zpchcbd/p/14814385.html

posted @ 2021-08-19 01:16  zpchcbd  阅读(545)  评论(0)    收藏  举报