tomcat源码分析之chain of responsibility模式以及请求处理
之前已经分析过了tomcat监听并且接收socket的过程,这里不再赘述。接收到socket之后,通过http11processor从socket中提取出request,response.然后调用Adapter的service方法处理request,response. 对request,response的处理应用了chain of responsibility 设计模式。tomcat中的container共有四级:Engine,Host,Context,Wrapper. request和response需要在这四级里面层层处理,最后到达wrapper里面的servlet.那么这种传递是怎么实现的呢?首先看一下request,response处理的入口:CoyoteAdapter.
在Adapter的实现类 CoyoteAdapter的service方法中,有如下代码:
connector.getContainer().getPipeline().getFirst().invoke(request, response);
这个方法实际上是调用了StandardEngineValue的invoke方法,里面有这样一句:
host.getPipeline().getFirst().invoke(request, response);
这个方法实际上是调用了StandardHostValue的invoke方法,里面有这样一句:
context.getPipeline().getFirst().invoke(request, response);
这个方法实际上是调用了StandardContextValue的invoke方法,里面有这样一句:
wrapper.getPipeline().getFirst().invoke(request, response);
这个方法实际上是调用了StandardWrapperValue的invoke方法.在这个方法里面处理request,response.并且在必要时调用servlet处理request,response.
可见,request,response是在各级container(责任链中的handler)里面层层处理的。每一层(除第一层)通过request参数识别到successor,并且把request,response传递到successor进行处理。