SpringMvc RetrunHandler原理 HttpMessageConverter原理

一、 响应Json

@ResponseBody+jackson.jar

Springmvc为什么可以返回JSON

在这里插入图片描述

过程

  • 当请求结束,需要相应给浏览器时,
  • 首先判断返回值是否为空,是否时字符串类型,然后在进行处理返回值
  • 先找到能处理对应返回值的处理器
@Nullable
private HandlerMethodReturnValueHandler selectHandler(@Nullable Object value, MethodParameter returnType) {
	boolean isAsyncValue = isAsyncReturnValue(value, returnType);
	for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
		if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
			continue;
		}
		if (handler.supportsReturnType(returnType)) {
			return handler;
		}
	}
	return null;
}
  • 做出响应的处理RequestResponseBodyMethodProcessor

@Override
    public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
            throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {

        mavContainer.setRequestHandled(true);
        ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
        ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);

        // Try even with null return value. ResponseBodyAdvice could get involved.
        // 使用消息转换器进行写出操作
        writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
    }

解析原理

1. 找到对应的返回值处理器
  • returnValueHandlers
    在这里插入图片描述
  1. 返回值处理器判断是否支持这种类型返回值 supportsReturnType
  2. 返回值处理器调用 handleReturnValue 进行处理
  3. RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。
2. HTTPMessageConverter原理
1. 原理
- 是否支持将Class对象MediaType
- 是否支持将Class类型对象写出mediatype
- **Object TO Json**

在这里插入图片描述

2. 消息转换器

0 - 只支持Byte类型的
1 - String
2 - String
3 - Resource
4 - ResourceRegion
5 - DOMSource.class \ SAXSource.class) \ StAXSource.class \StreamSource.class \Source.class
6 - MultiValueMap
7 - true
8 - true
9 - 支持注解方式xml处理的。

在这里插入图片描述

最终MappingJackson2HttpMeassageConverter通过底层jackson将Person对象转换为Json数据

3. 具体流程
  1. 利用 MessageConverters(消息转换器) 进行处理 将数据写为json
    1. 内容协商(++浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型++)
    在这里插入图片描述

  2. 服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,服务器能生产的类型与浏览器能生产的类型进行比较匹配;
    在这里插入图片描述

  3. SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
    1. 得到MappingJackson2HttpMessageConverter可以将对象写为json
    2. 利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

所有的返回值处理器

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值