SpringMVC的运转流程及代码解析

来源:互联网 发布:淘宝中国质造加入条件 编辑:程序博客网 时间:2024/05/22 08:32

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

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

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


流程解析:

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方法。


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

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



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




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



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


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


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



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


getHandlerAdapter:


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


handleInternal方法,在RequestMappingHandlerAdapter中:


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



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


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

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















0 0
原创粉丝点击