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实例