在上一篇中说了对DispatherServlet的理解,还差一个最重要的没说,就是springMVC 对请求的处理过程。
spring-webmvc对请求的处理过程
之所以先说了DispatherServlet,是因为必须要了解它的本质是什么,才能了解它怎么起的作用,一般我们都说DispathcerServlet是一个调度器,从它的名字我们就可以发现它其实就是一个servlet,所以它才可以成为接收web请求的入口,进而进行调度。
在调度的过程中:
首先通过doService方法来接收请求,在请求中设置环境上下文,以及web相关的配置,比如主题、国际化等信息。
第二,就到了我们的核心doDispather方法,在该方法,最先通过request对象获取HandlerExecutionChain的对象,如下图,可以看到在HandlerExeutionChain中不仅包含了handler本身,也包括对于这个handler的所有的拦截器,一个handler可以有多个拦截器,最终由一个handler和0个或者多个拦截器组成了一个处理请求的链条。
第三,在上面的步骤中,是怎么获取到HandlerExecutionChain对象的呢?答案如下图,是通过遍历所有HandlerMapping,然后由HandlerMapping的getHandler方法返回一个HandlerExecutionChain对象。
第四,有了HandlerExecutionChain对象后,我们其实已经获取到了handler,但是spring在这里又通过getHandlerAdapter遍历所有的HandlerAdapter,找到一个和这个handler想匹配的HandlerAdapter。
最后,通过调用HandlerAdapter的handle方法,来处理请求,在这个方法中,其实也是通过调用HandlerExecutionChain对象中的handler的方法来实现对请求的处理。
思考点
哦噗,处理一个请求好复杂啊,搞了这么多层,倒了这么多的手,究竟是为啥呢?我想:
第一,为了上层的灵活性,之所以弄了一个HandlerAdapter,就是为了使真正处理请求的Handler可以是任何的javaBean,大家可以在源码里看到,handler是一个Object对象,所以在使用spring的DispacherServlet调度器中,不只是能调度Controller、Servlet,理论上可以调度任何类型。
第二,为了使设计更加符合单一职责的原则,例如HandlerMapping只负责请求和handler的对应关系,HandlerAdapter负责执行Handler,HandlerExecutionChain负责加入拦截器,职责非常的明确。
第三,大家想想吧,想好了告诉我,多谢!