Spring MVC源码解析:返回值处理器,处理多种返回值类型

在这里插入图片描述

Handler可以返回多种类型

其实@RequestMapping方法可以返回多种类型的数据,但是我们现在基本上都只会用@ResponseBody这种方式,别的方式基本上不会使用了。

Handler可以返回的类型如下(从官网截图,只截图了一部分)
在这里插入图片描述
其他返回String,View等类型的方式在Spring MVC时代还挺常见的。找了一个之前的Spring MVC项目,给大家演示一下其他返回值类型的处理

在这里插入图片描述
在这里插入图片描述
index.jsp
在这里插入图片描述

在这里插入图片描述

notice.jsp
在这里插入图片描述
在这里插入图片描述

方法或者类上加了@ResponseBody注解,则会直接返回json,xml等内容。
方法或者类上没有加@ResponseBody注解,返回了String,View或者ModelAndView等时则会解析为相应的试图返回。

可以看到根据不同的返回值,需要执行不同的解析逻辑,这时就需要HandlerMethodReturnValueHandler(返回值处理器),根据不同的返回值调用相应的HandlerMethodReturnValueHandler来处理

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

HandlerMethodReturnValueHandlerComposite#handleReturnValue
在这里插入图片描述
在这里插入图片描述
找到第一个支持特定返回值的返回值处理器,然后处理返回值
请添加图片描述

RequestResponseBodyMethodProcessor同时实现了HandlerMethodArgumentResolver接口
和HandlerMethodReturnValueHandler接口,所以既是参数处理器,也是返回值处理器

HandlerMethodArgumentResolver:用来支持@RequestBody注解
HandlerMethodReturnValueHandler:用来支持@ResponseBody注解

ViewNameMethodReturnValueHandler

在这里插入图片描述
用来处理返回值类型是void或者字符串

将试图相关的信息放到ModelAndViewContainer中,后续会根据ModelAndViewContainer中的值创建ModelAndView

RequestResponseBodyMethodProcessor

RequestResponseBodyMethodProcessor#supportsReturnType
在这里插入图片描述
方法上或者类上有ResponseBody注解,则利用RequestResponseBodyMethodProcessor来处理返回值

RequestResponseBodyMethodProcessor#handleReturnValue
在这里插入图片描述
可以看到首先执行mavContainer.setRequestHandled(true),这样handler返回的ModelAndView为null,就不会进行视图渲染的过程

方法里面会利用HttpMessageConverter来进行报文和对象的转换。
在这里插入图片描述
所以当你想更换序列化方式时(jackson,fastjson等),只需要提供对应的HttpMessageConverter即可

参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java识堂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值