文章目录
一、 响应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
- 返回值处理器判断是否支持这种类型返回值 supportsReturnType
- 返回值处理器调用 handleReturnValue 进行处理
- 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. 具体流程
-
利用 MessageConverters(消息转换器) 进行处理 将数据写为json
1. 内容协商(++浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型++)
-
服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,服务器能生产的类型与浏览器能生产的类型进行比较匹配;
-
SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
1. 得到MappingJackson2HttpMessageConverter可以将对象写为json
2. 利用MappingJackson2HttpMessageConverter将对象转为json再写出去。