深入理解SpringMVC(一)工作原理

2 篇文章 0 订阅

MVC 模式

MVC 的原理图如下:

img

SpringMVC 简单介绍

SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。

SpringMVC 工作原理

image-20200707193247429

流程说明(重要):

(1)客户端(浏览器)发送请求,直接请求到 DispatcherServlet。

(2)DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。

(3)解析到对应的 Handler后,开始由 HandlerAdapter 适配器处理。

(4)HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。

(5)处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。

(6)ViewResolver 会根据逻辑 View 查找实际的 View。

(7)DispaterServlet 把返回的 Model 传给 View(视图渲染)。

(8)把 View 返回给请求者(浏览器)

SpringMVC工作流程(重要)

一、 用户发送请求至前端控制器DispatcherServlet。

1.DispatcherServlet它也是servlet,tomcat启动时它也会初始化,初始化参数是contextConfigLocation上下文配置文件位置。在SpringMVC 中可以通过自动扫描包名、注解映射支持、静态资源访问这些配置的信息在就会实例化HandlerMapping对象。这些对象是在tomcat进行参数初始化的时候也会实例化完成。在DispatcherServlet中维护着一个表,存放的是HandlerMapping对象list.下面截图是DispatcherServlet中的部分代码,在DispatcherServlet中维护着handerMappingshanderAdapters等对象列表。在initStrategies方法中对上面的一些属性进行初始化。

DispatcherServlet.class

image-20200708200010401

二、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

请求到达DispatcherServlet中之后,就是get、post这些请求,这些请求是DispatcherServlet的父类FrameworkServlet中定义着的,而在这些方法中又调用了processRequestprocessRequest中调用了doService

FrameworkServlet.class

image-20200708201843429

DispatcherServlet重写了doService方法,doService中主要设置了一些属性和调用doDispatch方法,doDispatch用来做分发请求

DispatcherServlet.class

image-20200708201904785

三、 处理器映射器找到具体的处理器

可以根据xml配置、注解进行查找,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

DispatcherServlet.class

image-20200708204400810

DispatcherServlet.class

image-20200708204721541

HandlerExecutionChain.class

image-20200708204847156

getHander返回的是一个HandlerExecutionChain,这个HandlerExecutionChain中包含一个handler和多个HandlerInterceptor(拦截器)。同时要留意HandlerExecutionChain是通过HandlerMapping对象的getHandler获取的。

四、 DispatcherServlet调用HandlerAdapter处理器适配器
DispatcherServlet.class

image-20200708205209048

获取适配器是通过遍历handlerAdapters列表找的,HandlerAdapter包含了3个方法。

HandlerAdapter.class

image-20200708205623551

五、 HandlerAdapter经过适配调用具体的Handle处理器(Controller,也叫后端控制器)
六、 Controller执行完成返回ModelAndView。
七、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

先判断如果是get请求更新下lastModified请求头,然后执行HandlerExecutionChain中的applyPreHandle这个方法.

DispatcherServlet.class

image-20200708210425015

applyPreHandle中它会遍历该HandlerExecutionChain中所有的拦截器,然后使用拦截器通过preHandlehandler进行预处理,如果所有的拦截器都能处理那就会继续往下执行,如果一旦有一个拦截器不能处理,就没必要往下走了,那就会触发triggerAfterCompletion方法,在triggerAfterCompletion中它是倒序遍历的拦截器的,执行完triggerAfterCompletion返回false之后doDispatch这个方法就执行结束了,下面的八、九、十、十一就不再执行。

八、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
九、 ViewReslover解析后返回具体View

找到ModelAndView对应的viewname,设置成它的属性值。

this.applyDefaultViewName(processedRequest, mv);

image-20200708210604737

applyPostHandleapplyPreHandle是对应着的,遍历handler的拦截器,执行postHandle方法。

mappedHandler.applyPostHandle(processedRequest, response, mv);
十、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

processDispatchResult方法中有一句render(mv, request, response),在render中先是获取View对象然后调用view.render(mv.getModelInternal(), request, response);将viewmodel绑定来进行渲染试图。

DispatcherServlet.class

image-20200708211000974

十一、 DispatcherServlet响应用户

响应用户其实是在父类FrameworkServletprocessRequest方法中

FrameworkServlet

image-20200708211239613

本文引用:

SpringMVC之处理流程 作者:社会主义接班人

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值