Tomcat 8.5.50 核心流程源码剖析---Mapper组件机制及请求处理机制

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一个完整的执行流程分析结束

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值