主要查看tomcat的server.xml配置文件,其顺序大致如下:
在输入http://localhost:8080/myweb/index.jsp的时候;
1,请求被端口为8080的connector监听到,对应于server.xml里:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2,connector将请求交给他所在的service里对应的engine,来处理;
<Engine defaultHost="localhost" name="Catalina">
3,engine获得请求后,将匹配他所有的host主机,如果匹配不到则交给默认的defaultHost,也就是localhost;此时,从请求localhost/myweb/index.jsp中解析到,对应的host主机名为“localhost”;
4,host接收到请求后,匹配他下面的context,也就是你部署的项目,这里从请求路径“/myweb/index.jsp”中,解析到对应的context为“myweb”,故交给name=”myweb”的context处理;
5,context随后在自己的mapping table里寻找servlet-mapping拦截路径为*.jsp的servlet,这里找到得是JSPServlet处理(下面解释);
6,找到JSPServlet后,开始构造 HttpServletRequest和HttpServletResponse,用于参数调用JSPServlet的doGet或doPOST方法;
7,context执行完毕后,将HttpServletResponse 返回给Host;
8,host将HttpServletResponse 返回给engine;
9,engine 将HttpServletResponse 返回给 connector;
10, connector 将 HttpServletResponse 返回给用户的browser;
补充,tomcat容器在启动后,context对应的项目在初始化的时候,要加载相应的servlet,加载的顺序为:
1,$CATALINA_HOME/conf/web.xml里定义的servlet(对应于上面第5步的JSPServlet);
2,context对应的项目WEB-INF下的web.xml中定义的servlet;
更正:,HttpServletRequest不是在context处生成的,而是在connector生成的,connector在接受到请求后,也就是一个socket连接,将socket封装成Request和Response对象;
补充2:tomcat采用的是BIO的方式,即同步阻塞方式,也就是说,一个连接创建一个线程,注意,是一次“连接”,也就是说,只要有一个TCP连接,tomcat就会创建对应的线程来处理,这里势必会造成不必要的开销,当然可以采用线程池优化,