Dispatcher接收到了客户的请求,遍历所有的HandlerMapping集合,找出被@Controller注解的bean和被@Request注解的类和方法,根据请求的路径,参数等一系列条件,找到符合条件的HandlerMapping,并得到Handler执行链,其中包括拦截器和controller方法,是一条拦截+处理链。
dispatcherServlet让把请求放进入链中,先执行所有拦截器的preHandle方法,执行完后准备去真正的handle方法(即controller的对应方法)。首先使用解析类解析handle方法的参数,包括@RequestParam、@RequestBody、@PathVariable注解的参数,从请求中提取出这些参数的值,并把它们连同请求一起交给handle方法,在handle中执行真正的业务逻辑。在handle方法处理结束之后,再使用一些处理类处理handle方法的返回值,处理完后合并进响应,再去执行所有拦截器的postHandle方法。之后把返回值交给dispatcherServlet,如果返回的是一个ModelAndView,则把它交给视图解析器去解析,由它解析出相应的视图(即html、jsp、xml等)并写到响应中,此时还要执行所有拦截器的afterCompletion再做处理。
然后,把最终处理完成的响应返回给客户。
另:过滤器在dispatcherServlet的前面,如果有过滤器,则请求进来时先进过滤器链,再进dispatcherServlet。响应走时先通过dispatcherServlet,然后再通过过滤器链