协作模式
每个容器包含一个pipeline,每个pipeline包含一个valve集合,位于前面的的valve做完业务处理后将调用后面的valve做业务处理,而容器的缺省valve位于集合的最后一个位置,负责调用下层容器的pipeline的第一个valve做业务处理,调用会从Engine的第一个valve调用开始,一直执行到调用Wrapper的缺省valve:StandardWrapperValve,而filter与servlet的处理就是在这个valve中进行的 。Engine的第一个valve是由Adapter调用的,在connector章节中也看到CoyoteAdapter在处理完request以后会执行connector.getContainer().getPipeline().getFirst().invoke(request, response);
这其中讲了几个点说一下
- 每个容器都有一个pipeline
- 每个容器都有个缺省的valve
- 每个容器缺省的valve都将在最后一个被调用
源码窥探
Engine缺省的valve StandardEngineValve
public final void invoke(Request request, Response response)
throws IOException, ServletException {
// 定位host
Host host = request.getHost();
if (host == null) {
......
return;
}
// 调用host的第一个valve
host.getPipeline().getFirst().invoke(request, response);
}
Host的缺省valve StandardHostValve
public final void invoke(Request request, Response response)
throws IOException, ServletException {
// 定位context
Context context = request.getContext();
if (context == null) {
......
return;
}
......
// 调用context的第一个valve
context.getPipeline().getFirst().invoke(request, response);