Servlet的创建和调用
// Servlet的创建和执行
class org.apache.catalina.connector.CoyoteAdapter{
public void service(org.apache.coyote.Request req,
org.apache.coyote.Response res)
throws Exception {
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);//!!!!!! 管道机制
}
}
class org.apache.catalina.core.StandardWrapperValve{
public final void invoke(Request request, Response response)
throws IOException, ServletException {
StandardWrapper wrapper = (StandardWrapper) getContainer();
//!!!!!!!!!
// !!!!! 加载Servlet类,创建Servlet对象,反射Servlet对象内部的注解,如:@Resource声明的资源,并进行依赖注入到Servlet对象中!!!
// !!!!! 调用Servlet对象的init方法
servlet = wrapper.allocate();
// !!! 创建过滤器链条
// Create the filter chain for this request
ApplicationFilterChain filterChain =
ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);
// 执行过滤器链!!!! ,Servlet在过滤器链条的末端,过滤器执行后,就调用servlet.service(....)
filterChain.doFilter
(request.getRequest(), response.getResponse());
filterChain.release(); // 释放滤器链资源
wrapper.deallocate(servlet); // 释放Servlet资源
if ((servlet != null) &&
(wrapper.getAvailable() == Long.MAX_VALUE)) { // 释放StandardWrapper对象
wrapper.unload();
}
}
}