SpringMVC执行流程——快速掌握,内容详细。

springMVC执行流程

快速了解:
a.流程图
在这里插入图片描述
b.流程的核心——DispatcherServlet:
在springMVC的web.xml配置文件中,我们配置了DispatcherServlet前端控制器,它会捕获服务器发来的请求并进行处理。
在这里插入图片描述
如何处理?
请看他的本领:
在这里插入图片描述

小提示:Ctrl + F12 可以查看一个类的方法及属性结构(如上图),Ctrl + H 可以一个类的继承结构(如下图)。

所以说,DispatcherServelt类就是SpringMVC的中心枢纽,这个类对Servlet进行了封装,实现了"前辈"留下的接口,完善地补充各个功能,是真正的处理者。
而其中的doDispatcher()方法更像一个办事入口。这个入口内又提供了各种“ 业务办理窗口”(例如:获取handler,获取handlerAdapter,以及执行目标方法),然后通过“指挥内部工作人员”(调用底层实现代码)完成相应功能。
在这里插入图片描述


-------------------------------------------------------------正文---------------------------------------------------------------

流程讲解:
下面将介绍DispatcherServlet处理请求的整个过程:以我的一个EmployeeController为例。

在这里插入图片描述

1.在浏览器页面中,用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet捕获。

在这里插入图片描述
在这里插入图片描述

2.DispatcherServlet对请求进行解析,得到请求资源路径,判断路径对应的映射是否存在(即项目中所有Controller的所有XXXMapping方法的value值,有没有和路径一样的)。

<->如果不存在:
i.判断是否配置了<mvc:default-servlet-handler>(默认静态资源控制器),同时需要配置<mvc:annotation-driven>(注解控制器),不然只执行视图(静态资源)控制器。
ii.若没有配置,控制台报错映射查不到,客户端显示404
ii.若有配置,执行资源,进行页面跳转。在这里插入图片描述

3.根据路径,调用HandlerMapping获得Handler配置所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain(处理程序执行链)对象的形式返回。
在这里插入图片描述

1.Handler对象实际上是一个HandlerMethod类型的对象,里面包含了请求所在的类信息,请求方法,请求参数等内容。
2. 从这里可以认为Handler对象相当于是平常业务代码中的每一个请求对应的controller类以及方法,即Controller.xxxmethod()。

在这里插入图片描述
4.根据从HandlerMapping获得的Handler,为其选择一个合适的适配器(HandlerAdapter)
在这里插入图片描述

适配器的用途:从下面这张图不难看出,适配器所担任的角色和所发挥的作用
在这里插入图片描述

5.成功获得HandlerAdapter后,如果配置了拦截器,此时会执行拦截器的preHandler()方法。

如果没有配置拦截器,直接执行目标方法:
在这里插入图片描述

6.开始处理Handler(Controller.xxxmethod()),进行参数解析,数据响应(响应页面,响应数据)。

参数解析:在参数列表中我们使用各种注解(@Requestody,@PathVariable,@RequestParam)和自定义类型封装参数,那么请求中带有的参数是如何复制给我们定义的形参的呢?
答:是argumentResolvers(参数解析器),里面有各种解析器,通过挨个循环判断来选出一个最合适的解析器,来解析参数的值。
如果参数是基本类型,直接解析就行了。
如果参数是自定义类型,需要通过WebDataBinder(web数据绑定器)中的Converters将请求数据转化成指定数据类型,然后封装到自定义的bean对象中。
最后,暴露模型作为请求域属性,将所有的数据都放在ModelAndViewContainer,包括要去的页面地址View,和Model数据。
在这里插入图片描述
数据响应:
a.响应数据:如果请求方法上标注@ResponseBody
与参数解析类似,通过遍历所有返回值处理器,找到一个最合适的处理器进行解析,通过内容协商,返回指定类型数据(json,xml,自定义)
在这里插入图片描述
b.响应页面:
在目标方法处理的过程中,所有的数据都会被放到ModelAndViewContainer中,当目标方法结束后会返回 一个ModelAndView对象。根据这个对象的String名称(是否有转发类型的前缀,如forword,redirect),选择合适的视图解析器进行渲染。
在这里插入图片描述

7.Handler(目标方法)执行完毕后,返回一个ModelAndView对象,然后执行拦截器的postHandle()方法。
8.根据返回的ModelAndView对象,通过对象的String名称(是否有转发类型的前缀,如forword,redirect),选择合适的视图解析器进行渲染。(如果有异常则返回异常视图)。
9,视图渲染完成后,执行拦截器的afterCompletion()方法。
10,跳转视图页面到客户端。


总结:SpringMVC执行的流程一定要熟悉,不要求每个细节都知道,但大致流程要能说的上来,这部分真的很重要。
第一次学习SpringMVC流程的时候都懵逼,源码看着都慌,看不下去,那是因为在我们的认知中,我们觉得它太难了,一直给大脑传递一个信号———我一定学不会,自己都不相信自己,谁还能相信你。
心态放好,思路紧跟,一遍不行,再来一遍,力求质量,不求数量。
书读百遍,其意自现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyKinh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值