First
继续上篇文章,此时请求已经打到了容器里,看下容器又是怎么处理请求的。
CoyoteAdapter
Adapter连接了Tomcat连接器Connector和容器Container
它的实现类是CoyoteAdapter主要负责的是对请求进行封装
构造Request和Response对象,并将请求转发给Container也就是Servlet容器.
service方法
service的代码流程首先是从coyote的request和response得到connector的request和response并且他们之间互相链接
接下来是通过postParseRequest来解析请求的参数,查找context,解析CookieID,session等
然后用connector.getService().getContainer().getPipeline().getFirst().invoke(request, response)调用容器的方法
从调用的方式可以知道,这个Container已经内置在StandardService中.也就是server.xml的Engine节点.
Engine节点,匹配到具体的Host
Host匹配到context
context匹配到Wrapper
最后是结束请求.调用connector的回调方法.

StandardEngineValve
invoke的具体实现类,匹配具体的host,调用host.invoke

StandardHostValve
invoke的具体实现类,匹配到context,调用context.invoke

StandardContextValve
invoke的具体实现类,匹配到wrapper,调用wrapper.invoke

StandardWrapperValve
调用链路这么长,终于看到了最终处理request和response的地方,StandardWrapperValve主要做 以下几件事
1.加载最终处理请求request的servlet实例
2.创建过滤器链(filterChain)
调用过滤器链的doFilter方法来处理对应的request和response。
filter逻辑执行完后,调用servlet.service方法来处理request和response
后续处理释放过滤器链
3.后续处理卸载该次处理的servlet实例