1、Http11Protocol中的內部類Http11ConnectionHandler,執行其process方法
if (processor == null) { processor = createProcessor(); } SocketState state = processor.process(socket);//交給processor處理
2、上面的processor為Http11NioProcessor類的例項,在其process方法中,會呼叫介面卡adapter進行資料的處理
adapter.service(request, response);
這裡的adapter實際為CoyoteAdapter型別的例項,該adapter的作用就是作為從connector到container的入口來使用的
3、下面是adapter的處理過程,從該適配的connector中獲取容器,進入容器的管道處理流程
public void service(org.apache.coyote.Request req,org.apache.coyote.Response res)throws Exception { Request request = (Request) req.getNote(ADAPTER_NOTES); Response response = (Response) res.getNote(ADAPTER_NOTES); // Parse and set Catalina and configuration specific // request parameters req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName()); if (postParseRequest(req, request, res, response)) {//postParseRequest用來解析request請求 connector.getContainer().getPipeline().getFirst().invoke(request, response);//這裡開始進入容器的處理過程,返回結果為response
}
……
}
4、進入容器container處理後,就要使用到容器的一個重要的結構:管道pipeline。每個容器類元件都有一個pipeline屬性,這個屬性控制請求的處理過程,在pipeline上可以新增Valve,進而可以控制請求的處理流程。可以將請求想象成水的流動,請求需要在各個元件之間流動,中間經過若干的水管和水閥,等所有的水閥走完,請求也就處理完了,而每個元件都會有一個預設的水閥(以Standard作為類的字首)來進行請求的處理,如果業務需要的話,可以自定義Valve,將其安裝到容器中。
下面是對整個流程的一些圖解,可以很形象地用來幫助理解:整個流程的最終目的就是走到Wrapper的地方,找到正確的Servlet,執行對應的過濾器和doService方法,返回response