请求进入tomcat后,tomcat的Connector会为请求分配一个线程来处理它。
tomcat会把http请求里的数据解析出来,封装到一个HttpServletRequest对象中。
接着还会创建一个HttpServletResponse对象用来保存响应数据。
然后根据web.xml配置的servlet-mapping,找处理该请求的servlet。如果为该请求还能匹配上filter-mapping,那么tomcat在把请求交给servlet之前,还会执行所有匹配得上的过滤器(可以理解为责任链模式)。
如果使用了spring mvc,那请求会交给spring mvc的前端控制器(DispatcherServlet)。
tomcat将创建好的HttpServletRequest和HttpServletResponse对象作为参数,调用DispatcherServlet的service方法。
此后处理请求的执行权落到了spring mvc手上。
spring mvc首先为这个请求执行所有匹配得上的拦截器的preHandle方法,然后根据@RequestMapping把请求交给对应Controller的对应方法处理。处理完后,执行所有对应拦截器的postHandle方法。DispatcherServlet渲染了视图后还会调用所有对应拦截器的afterCompletion方法。
spring mvc前端控制器的service方法执行完后,执行权回到tomcat手上,tomcat将处理好的HttpServletResponse对象解析为http响应返回给客户端。