Tomcat请求处理流程: 当一个servlet请求到来的时候, tomcat是通过怎样的机制来定位到servlet请求, 并执行请求 的呢
以请求这个 为例 url: http://localhost:8080/web_demo/order/addorder
Mapper组件机制
Tomcat 设计了 Mapper(映射)组件 完成 url 和Host、Context、Wrapper等组件容器的映射
org.apache.catalina.mapper.Mapper.MapElement 基类,组件都继承于它
请求处理机制
-
代码追踪
- org.apache.tomcat.util.net.NioEndpoint.Poller#processKey
- org.apache.tomcat.util.net.AbstractEndpoint#processSocket
org.apache.tomcat.util.net.SocketProcessorBase#run
-- > org.apache.tomcat.util.net.SocketProcessorBase#doRun 模块方法,由 子类 org.apache.tomcat.util.net.NioEndpoint.SocketProcessor#doRun 实际运行
- org.apache.coyote.AbstractProtocol.ConnectionHandler#process
- 获取Processor (将socket转换为 tomcat标准的request)
开始处理请求
- org.apache.coyote.AbstractProcessorLight#process
首先封装 Request 和 Response , Processor处理完成之后,交由Adapter 去处理 .
- org.apache.catalina.connector.CoyoteAdapter#service
- ------------------------------------------------------------------------- org.apache.catalina.connector.CoyoteAdapter#postParseRequest 开始 -------------------------------------------------------------------------
封装后所有的host, context,wrapper信息都封装在 request.getMappingData() 中
org.apache.catalina.mapper.Mapper#map(org.apache.tomcat.util.buf.MessageBytes, org.apache.tomcat.util.buf.MessageBytes, java.lang.String, org.apache.catalina.mapper.MappingData)
--> org.apache.catalina.mapper.Mapper#internalMap
给mappingData.host赋值
给mappingData.context赋值
给mappingData.wrapper赋值
最终获取的 MappingData的值
------------------------------------------------------------------------- org.apache.catalina.connector.CoyoteAdapter#postParseRequest 结束 -------------------------------------------------------------------------
- org.apache.catalina.connector.CoyoteAdapter#service 回到该方法中
invoke()方法 找到请求对应的 engine ,
StandardEngineValve.invoke() 中继续找对应的 Host
StandardhostValve.invoke() 中继续找对应的Context
- 对应的流程如下图所示
最终到 StandardWrapperValve中,封装Servlet
获取过滤链,去执行 过滤链(包含Servlet方法) 中的各个方法
- org.apache.catalina.core.ApplicationFilterChain#internalDoFilter
最终这个 servlet.servcie(request, response) 就是 我们自己定义的Servlet方法,执行方法,返回结果
至此,tomcat一个完整的执行流程分析结束