Tomcat处理请求的详细流程

tomcat处理一个请求的详细流程:

protocolHandler负责生成endpoint和Http11ConnectionHandler
endpoint的acceptor线程负责处理连接请求,收到连接请求后交给worker线程处理,work线程调用Http11ConnectionHandler,Http11ConnectionHandler维护一个Http11Processor池,
在构造Http11Processor时将生成org.apache.coyote.Request和org.apache.coyote.Response对象。
Http11Processor使用InternalInputBuffer类来解析http协议,并将解析后的数据(请求头,分割行等)封装到org.apache.coyote.Request和org.apache.coyote.Response对象中,
之后将此两对象传给CoyoteAdapter.service(request, response)在该方法内部实现了org.apache.coyote.Request-->org.apache.catalina.connector.Request;
org.apache.coyote.Response-->org.apache.catalina.connector.Response的转换,接下来请求进入pipeline,pipeline中value的执行(调用value的invoke方法)顺序如下:
StandardEngineValve-->StandardHostValve-->StandardContextValve-->StandardWrapperValve-->ApplicationFilterChain.doFilter-->Servlet(HttpServlet).service
(由StandardWrapper创建的单实例——多线程共用),invoke方法的参数即为org.apache.catalina.connector.Request/Response。
如果是jsp则继续-->JspServletWrapper.service-->Compiler(如果没有被编译的话)-->装载具体编译后的servlet class file-->交给具体servlet的service方法-->通过out.write写入
html页面,事实上这个out是response.getWriter,所以也就将结果写入了response。

新建session:
Manager manager = context.getManager();
Session session = manager.createSession(null);
如何从服务器上下文查询数据:
Context context = server.getGlobalNamingContext();
UserDatabase database = (UserDatabase) context.lookup("UserDatabase");

你可能感兴趣的:(tomcat,初始化,启动,请求处理流程)