SpringMVC的运转流程及代码解析

在Java开发中经常会用到的一个框架就是SpringMVC,那么SpringMVC的运转流程你有清楚多少,下面我简单的介绍一下我自己的理解。

SpringMVC主要是围绕着DispatcherServlet运行的,可以把DispatcherServlet看作是一个指挥中心。

在官方文档中给出了一下的执行流程,我们先简单的分析下官方给出的执行流程然后在深入的探讨一下具体的执行流程,之后再进行代码解析进一步理解和记忆这个整个流程的运行原理。

SpringMVC的运转流程及代码解析_第1张图片

流程解析:

1、用户的请求首先被发送到DispatcherServlet(前段控制器)中,DispatcherServlet根据请求的信息来决定调用那个controller(也可以理解为action)来处理请求。找到controller后DispatcherServlet将请求交于controller处理。

2、controller接到请求后,根据请求的信息进行处理,调用业务层。处理完之后将结果封装程一个ModelAndView返回给DispatcherServlet。

3、DispatcherServlet接到controller返回的结果后,根据返回的视图名调用相应的视图模版,并对数据进行渲染。

4、最后DispatcherServlet将渲染后的数据返回给用户。

接下来我们在深入一点的进行分析理解:

1、用户发送请求到DispatcherServlet

2、DispatcherServlet接受到请求后调用HandlerMapping,HandlerMapping会查找到具体处理相关请求的Handler对象。

3、HandlerMapping查找Handler对象时,返回的不是一个具体的Handler元是对象,而是返回一个Handler执行链(这个执行链包括拦截器和处理请求的Handler对象)。

4、DispatcherServlet接受到这个执行链知乎会调用Handler适配器,去执行具体的Handler。

5、Handler适配器完成Handler(也就是我们编写的Controller)处理之后,返回一个ModelAndView。

6、DispatcherServlet接受到Handler适配器返回ModelAndView,根据其中的视图名调用具体的视图解析器。

7、视图解析器根据视图名解析成一个真正的view视图并返回给DispatcherServlet。

8、DispatcherServlet介绍到视图之后,根据ModelAndView中的Model对视图进行填充(这就是所谓的试图渲染)。

9、渲染完成后DispatcherServlet将结果返回给用户。

接下来我们进行代码跟踪分析进一步的理解和记忆。

DispatcherServlet其实就是一个Servlet。Servlet在处理请求的时候会交给service方法进行处理。DispatcherServlet也不例外,DispatcherServlet继承自FrameworkServlet,

首先我们进入FrameworkServlet的service方法。

SpringMVC的运转流程及代码解析_第2张图片

HttpServlet会根据请求的类型不同调用doGet或者doPost方法。FrameworkServlet重写了这些方法,在这些方法中调用processRequest进行处理。processRequest调用了doService方法,这个doService方法就是在DispatcherServlet中实现的。

接下来我们继续跟踪看看DispatcherServlet中的doService方法是怎么实现的

SpringMVC的运转流程及代码解析_第3张图片

SpringMVC的运转流程及代码解析_第4张图片

DispatcherServlet开始真正的进行处理调用doDispatch方法。

SpringMVC的运转流程及代码解析_第5张图片

SpringMVC的运转流程及代码解析_第6张图片

SpringMVC的运转流程及代码解析_第7张图片

对应着这段代码mappedHandler = getHandler(processRequest,false);我们看下getHandler方法。


SpringMVC的运转流程及代码解析_第8张图片

继续往下看getHandler方法,在AbstractHandlerMapping类中

SpringMVC的运转流程及代码解析_第9张图片

首先看下根据requrst获取handler步骤getHandlerInternal方法,在AbstractHandlerMethodMapping中:

SpringMVC的运转流程及代码解析_第10张图片

看下根据路径寻找handler的方法lookupHandlerMethod:

SpringMVC的运转流程及代码解析_第11张图片

SpringMVC的运转流程及代码解析_第12张图片

如果上面没有获取到Handler,就会获取默认的Handler。如果还获取不到就返回null。
如果上面处理完的Handler是String类型的,就会根据这个handlerName获取bean。
上面获取完Handler,就开始封装执行链了,就是将我们配置的拦截器加入到执行链中去,getHandlerExecutionChain:

SpringMVC的运转流程及代码解析_第13张图片

getHandlerAdapter:

SpringMVC的运转流程及代码解析_第14张图片

也就是对last-modified的处理
就是遍历所有的我们定义的interceptor,执行preHandle方法
ha.handle执行当前Handler,我们这里使用的是RequestMappingHandlerAdapter,首先会进入AbstractHandlerMethodAdapter的handle方法:


handleInternal方法,在RequestMappingHandlerAdapter中:

SpringMVC的运转流程及代码解析_第15张图片

前缀和后缀名都加上
执行拦截器的postHandle方法
遍历intercepter的postHandle方法。
processDispatchResult方法:

SpringMVC的运转流程及代码解析_第16张图片

SpringMVC的运转流程及代码解析_第17张图片

重点看下render方法,进行渲染:

SpringMVC的运转流程及代码解析_第18张图片

view.render就是进行视图的渲染,然后跳转页面等处理。

到这里基本上就完事了,这里面设计的东西很多这里就不再详细的讲解了。















你可能感兴趣的:(Java,SpringMVC,java,框架)