Spring MVC 执行过程原理(请求映射原理、参数处理原理、返回值处理器)

Spring MVC 执行过程分析

文章目录

  • Spring MVC 执行过程分析
  • 请求映射原理
  • 适配器Adapter
  • 执行目标方法
    • 参数处理器解析器HandlerMethodArgumentResolver
      • @RequestBody测试
      • @RequestParam测试
      • RequestParamMethodArgumentResolver分析
    • 执行目标方法体
    • 返回值处理器解析器
    • 目标方法执行完成
  • 处理派发结果

请求映射原理

SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch()方法
在这里插入图片描述
在这里插入图片描述
handlerMappings: 中保存了5个具体处理器映射器

请求进来getHandler()方法中,挨个尝试遍历所有的handlerMappings看是否有请求信息。如果有就找到这个请求对应的handler返回,如果没有就是下一个 HandlerMapping
在这里插入图片描述
这handler就是Controller控制器中对应的具体方法。
在这里插入图片描述

RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则,在容器启动就已经初始化好了。这handler就是Controller控制器中对应的具体方法。
在这里插入图片描述

在这里插入图片描述

适配器Adapter

1、在请求映射中调用getHandler()方法找到能处理请求的Handler,找到了RequestMappingHandlerMapping处理,这Handler就是Controller控制器中对应的具体方法。

2、然后调用getHandlerAdapter()方法为当前handler找一个适配器 HandlerAdapter;找到了 (RequestMappingHandlerAdapter) 处理
3、适配器可以让我们写的控制器方法和DispatcherServlet一起协同工作
在这里插入图片描述

执行目标方法

1、适配器执行目标handle并确定方法参数的每一个值,返回ModelAndView对象
在这里插入图片描述
2、进入handle()方法,发行是HandlerAdapter接口,查看实现类
在这里插入图片描述
3、进到AbstractHandlerMethodAdapter抽象类中在这里插入图片描述在这里插入图片描述

4、查看具体实现类RequestMappingHandlerAdapter
在这里插入图片描述
5、在RequestMappingHandlerAdapter中执行目标方法,任何方法参数和返回值类型都将以某种方式进行处理。HandlerMethodArgumentResolver都无法识别的方法参数,如果是简单类型,则将其解释为请求参数,否则将其解释为模型属性。HandlerMethodReturnValueHandler都无法识别的返回值将被解释为模型属性。
在这里插入图片描述
6、跟进invokeHandlerMethod()方法,调用RequestMapping处理程序方法来准备ModelAndView
在这里插入图片描述
7、跟进invokeAndHandle()方法,调用该方法并通过其中一个配置的HandlerMethodReturnValueHandler或 HandlerMethodReturnValueHandlers处理返回值。
在这里插入图片描述
8、跟进invokeForRequest()方法中
在这里插入图片描述
9、调用Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);获取方法的参数值,这里使用的策略模式,即被不同的注解修饰的参数,可以使用不同的参数解析器解析。其本质还是调用了servlet原生API获取请求参数,只不过框架帮我们封装了这个过程。

在这里插入图片描述

参数处理器解析器HandlerMethodArgumentResolver

确定将要执行的目标方法的每一个参数的值是什么;SpringMVC目标方法能写多少种参数类型。取决于参数解析器,我们也可以自定义参数解析器。在解析参数时使用的策略模式,即被不同的注解修饰的参数,可以使用不同的参数解析器解析进行解析。
在这里插入图片描述

@RequestBody测试

在这里插入图片描述
使用了RequestResponseBodyMethodProcessor处理器解析器解析
在这里插入图片描述

@RequestParam测试

在这里插入图片描述
使用RequestParamMethodArgumentResolver解析器进行解析
在这里插入图片描述
由此证明了我们的结论,在进行参数绑定时,参数是否绑定成功,取决与我们是否有对该参数的处理器解析器。

RequestParamMethodArgumentResolver分析

在这里插入图片描述
跟进resolveArgument()方法,发行他是一个顶层接口HandlerMethodArgumentResolver,也就是所有参数处理器解析器的父类。
在这里插入图片描述

在这里插入图片描述
查看具体实现类RequestParamMethodArgumentResolver
在这里插入图片描述
总结: 确定将要执行的目标方法的每一个参数的值是什么;SpringMVC目标方法能写多少种参数类型。取决于参数解析器,我们也可以自定义参数解析器。当前解析器是否支持解析这种参数,支持就调用 resolveArgument

执行目标方法体

在这里插入图片描述
继续往下放行,会来到我们控制器方法中的断点中
在这里插入图片描述
继续F8往下走,当执行return "success"时往下F8会执行到doInvoke方法的return中返回
在这里插入图片描述
继续往上层返回
在这里插入图片描述
继续往上层返回
在这里插入图片描述
继续往上层返回
在这里插入图片描述

返回值处理器解析器

在这里插入图片描述
1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
2、返回值处理器调用 handleReturnValue 进行处理
3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。

  • 利用 MessageConverters 进行处理将数据写为json

    1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)

    2、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,

    3、SpringMVC会挨个遍历所有容器底层的HttpMessageConverter,看谁能处理?

    • 得到MappingJackson2HttpMessageConverter可以将对象写为json
    • 利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

目标方法执行完成

将所有的数据都放在ModelAndViewContainer;包含要去的页面地址View。还包含Model数据。
在这里插入图片描述

处理派发结果

在这里插入图片描述
处理程序选择和处理程序调用的结果,这要么是一个ModelAndView,要么是一个要解析为ModelAndView的Exception。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推箱子android源代码,android自定义view实现推箱子小游戏

本文实例为大家分享了android推箱子游戏的具体实现代码,供大家参考,具体内容如下自定义view:package com.jisai.materialdesigndemo.tuixiangzhi;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bi…

android没有捂脸表情,微信新emoji表情安卓机怎么没有?微信新emoji表情安卓机没有怎么回事?...

在最新版ios版微信中不少用户在聊天时发现了新emoji表情哟,但是安卓机最新版即没有发现,那么微信新emoji表情安卓机怎么没有?微信新emoji表情安卓机没有怎么回事?下面小编就给大家具体介绍下。iOS版微信总共加入了9款新表情&#…

springboot源码分析: 请求方式+请求映射原理+获取参数原理

注解相关 AliasFor:.在同个注解中为同一个功能定义两个名称不一样的属性,那么这两个属性彼此互为别名 RequestMapping注解里面的代码 AliasFor("path")String[] value() default {};AliasFor("value")String[] path() default {};G…

android 或者vide的高度和宽度,关于Android中videoView.setVideoPath(“PATH”)的问题!!!急!!...

满意答案yfdsan31972015.06.03采纳率:52% 等级:9已帮助:364人path 是获取的路径,如果你把视频文件夹写在raw文件夹下 ,/*** raw文件夹下的文件处理工具类** */public class RawFileUtils {private RawFileUtils( ){…

Java使用minio的基本操作

Java使用minio的基本操作 导入jar包 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.0.2</version> </dependency>public static void main(String[] args) {try{MinioClient minioClie…

吃透Java IO:字节流、字符流、缓冲流

文章目录前言1 初识Java IO1.1 IO流分类1.2 案例实操2 IO流对象2.1 File类2.2 字节流2.3 字符流2.4 序列化3 IO流方法3.1 字节流方法3.2 字符流方法4 附加内容4.1 位、字节、字符4.2 IO流效率对比4.3 NIO前言 有人曾问fastjson的作者&#xff08;阿里技术专家高铁&#xff09;&…

android 侧滑删除功能,200行代码让你在Android中完美实现iOS版侧滑删除效果

使用几个月的IOS之后,发现IOS中侧滑删除俺就大家好&#xff0c;自己开始学习Android已经差不多半年了吧&#xff0c;前前后后看了不少的博客获益匪浅。渐渐的随着技术的提升&#xff0c;慢慢感觉网上其它的一些功能的实现又不是那么完美&#xff0c;今天就给大家带来一篇在Andr…

java IO体系的学习总结

1.Java Io流的概念&#xff0c;分类&#xff0c;类图。 1.1 Java Io流的概念 ? ? java的io是实现输入和输出的基础&#xff0c;可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源&#xff08;键盘&#xff0c;文件&#xff0c;网络连接等&#xff09;抽象表…

android 浏览器 多窗口显示,Android浏览器图形侧多窗口方案

Android平台浏览器当前多窗口方案为多个浏览器子窗口公用一个图形buffer&#xff0c;窗口的z序和显示控制由浏览器进程维护&#xff0c;图形侧只能看到一个窗口。该方案能基本实现浏览器多窗口的大部分需求。但无法实现linux机顶盒中存在的部分窗口交叉的业务场景&#xff0c;即…

response.reset() 与response.resetbuffer使用场景

getResponse的getWriter()方法 getResponse的getWriter()方法连续两次输出流到页面的时候&#xff0c;第二次的流会包括第一次的流&#xff0c;所以可以使用response.reset或者resetBuffer的方法。 reset(): Clears any data that exists in the buffer as well as the statu…

android listview asynctask,关于android:ListView + ArrayList + AsyncTask

本问题已经有最佳答案&#xff0c;请猛点这里访问。我的想法是使用AsynTask下载数据集并存储在arrayList中。 我已经检查并运行良好。在onPostExecute方法中&#xff0c;我调用一个函数来更新listView&#xff0c;然后加载存储在ArrayList中的数据。码&#xff1a;protected vo…

ServletResponse reset()方法慎用

reset()用于重置,但是在重置的时候也会清空相关数据,例如session存的信息。

android10获取imei,Android 10 root用户获取imei

IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写&#xff0c;由15-17位数字组成&#xff0c;与手机是一一对应的关系。无论刷机还是恢复出厂设置&#xff0c;该设备标识码都不会改变&#xff0c;所以在广告和流量统计等方面特别好用&#xff0c;备受…

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应 用户在客户端输入网址&#xff08;虚拟路径&#xff09;时&#xff0c;开始发送一个HTTP请求&#xff08;请求行、请求头、请求体&#xff09;至服务器。服务器内的Tomcat引擎会解析请求的地址&#xff0c;去找XML文件&#xff0c;然后根据…

android imageview 设置网络图片,ImageView加载网络图片

android网络加载图片框架Android-Universal-Image-Loader功能非常强大&#xff0c;其开源地址https://github.com/nostra13/Android-Universal-Image-Loader&#xff0c;讲解非常地详细&#xff0c;今天我要贴下工作中用到的利用这个框架加载网络图片并在ImageView控件中显示出…

Logger之Logger.getLogger(CLass)

之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性 pri…

订阅号助手android,微信订阅号助手app

微信订阅号助手app属于微信官方推出的软件&#xff0c;可以把我们的手机当做公众号的平台&#xff0c;让你直接用手机来实现公众号的各种工作、互动内容&#xff0c;微信订阅号助手app不用担心使用一些第三方软件被封号了&#xff0c;非常实用可靠。【应用介绍】订阅号助手是一…

使用LoggerFactory.getLogger(xxx.class)方法在控制台打印日志信息

使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 使用指定的类XXX初始化日志对象&#xff0c;方便在日志输出的时候&#xff0c;可以打印出日志信息所属的类。 …

signature=f0dd2033ed5bb3cdb94f9136381f7750,Lesson 8: Signature Assignment

摘要&#xff1a;This unit will focus on the Civil Rights Era in the 1960s. Students will learn what the Civil Rights Movement was and how it changed the United States. By learning about the pivotal leaders of the movement, students will build their underst…

LoggerFactory.getLogger的用法

Logger类下有多个不同的error方法&#xff0c;根据传入参数的个数及类型的不同&#xff0c;自动选择不同的重载方法。 使用&#xff0c;只打印异常&#xff0c;不打印堆栈信息 private static final Logger logger LoggerFactory.getLogger(LoggerTest.class);Testpublic voi…