今天就由本大佬(请原谅我使用了略微夸张的修辞手法)亲自带队,来为大家导游,带领大家探秘神奇的SpringMVC世界,重走一次HTTP请求处理之路,本次行程共计7站,约用时10分钟。
来来来,上车的请把票买一下(点个赞、交个朋友嘛),说你呢!对!说的就是你,长这么帅,不点赞想啥呢?(别打我……保护猿类,人人有责)
OK,现在我们每个人都有一张门票(想象成每个人都是一个HTTP请求),每张票上都有一串神秘代码(不是你们想的那种神秘代码,就想象成请求链接url),车票都保存好,一会进大门可要检查的。
坐稳了,老司机这就带你起飞……
OK,现在我们首先来到DispatcherServlet,它是作为SpringMVC的大门而存在,只有先穿过它,才能到达真正的入口。
我先来给大家科普(八卦)一下DispatcherServlet的来历:
这DispatcherServlet虽然整了个高大上洋文名,但我们千万不要被它唬住,它本质上还是我们熟悉的那个翠花(普通Servlet类),在这给我装啥呢?
来来来,咱们继续往前走,前面即将到达doDispatch,大家都跟上!
有人问doDispatch是个啥地方呀?
它呀,相当于景区的检票口,通过之后各位就可以自由活动了,最后出来时我们再到这里集合。
来来来,这是本次的线路图,大家都来看一下!(ps:看一次5元,养家糊口不容易啊):
大家排好队,把门票都拿出来,准备检票啦~大包小包,过机安检(有没有一种来到车站的感觉)。
什么?把票弄丢了?别闹,腰不好。
到底检查啥呢?
这个问题问的好,一看就是个文化人。
这一步主要是检查你有没有携带物品(是不是一个上传文件请求),如果你携带了物品,那么工作人员就会把你的物品取出来包装一下、变成MultipartFile再还给你,再给你身上贴上一个此人携带贵重物品的标志,也就是multipartRequestParsed标志位(这是深怕别人不知道你有钱啊),把你和没带物品的人区分开。
OK,检查完毕以后,接下来就是各自确定游玩路线。
各位携带贵重物品的大佬们,等会交个朋友呗!(你们还缺一位可爱真诚的小老弟吗?)
怎么确定路线?
这个问题提的太好了!怎么又是你?这位机智的朋友,我已经记住你了。
我们每个人不是都有一张门票嘛,门票上都有一串神秘代码(请求链接url),这里我们就是通过这个神秘代码来找到各自对应的路线(根据请求url找到对应的Controller、以及方法)。
在每个人确定各自的路线后,大家有5分钟时间准备一下,现在有事还能回去,过了这村可就回不去啦。
在这期间可以做些什么事呢?
这个问题同样的非常好,首先我们来看一下:
HandlerInterceptor?是不是有点熟悉?对,你没有看错!就是拦截器。在这里SpringMVC会首先调用我们拦截器里的preHandle方法。
Tip:在preHandle方法里我们可以提前进行一些登录校验、权限校验、日志记录等的工作,可以将一些非法的请求拒之门外。
都准备好了吧?那么大家就按照的路线去玩耍吧(执行Controller业务逻辑),最后还会有拼图大礼包再向你们招手呢(返回模型视图ModelAndView)
本宝宝就在这眯一会等你们!(反正你们最后会发现还会回到这儿的)
一路都有啥好玩的?
这我可得给你好好说道说道。来,坐下,小笔记记好:
首先参数解析器会对它进行一个参数解析、校验、参数绑定的操作过程,然后才会到达我们的Controller方法进行具体的业务处理,最终都会返回一个ModelAndView。
大家都回来了没有?没回来的吱个声!(吱声我也听不到)
准备返回之前,我们还有一点时间可以搞点事情。
可以搞哪些事情?
HandlerInterceptor!恭喜这位朋友,都学会抢答了!
对,又是HandlerInterceptor拦截器,在这里会调用后置处理方法postHandle。
Tip:在postHandle方法里我们有机会对返回的模型数据和试图数据进行最后的修改。
欢乐的时光总是这么短暂,我们愉快的HTTP请求之旅到这里就接近尾声了。
返程途中可以干什么?
返程途中大家可以拿出拼图大礼包(ModelAndView),拼出一幅美丽的图画(View渲染)。
在这一步,DispatcherServlet会将模型数据(Model)渲染到View模版上生成一个新的视图,也就是我们看到的页面了,当然了也有可能只有数据没有视图,就像我们写接口一样。