前言:本篇主要介绍SpringMVC如何处理Json数据,包括接收和响应json数据。
本篇文章重点关注以下问题:
- 处理json数据示例
- 关注HttpMessageConverter<T>
1. 处理Json数据的样例
总共三步:
1. 加入 jar 包(开发过程中,这一步也就无需考虑了):
2. 编写目标方法,使其返回 JSON 对应的对象或集合;
3. 在方法上添加 @ResponseBody 注解;
返回可以是个Map集合,也可是key-value形式的List集合以返回json数组
@RequestMapping("dataBinder/getCmpVo.action")
@ResponseBody
public Map<String, Object> getCmpVo(UserVo user){
System.out.println("【自定义复合类型】" + user);
Map<String, Object> map = new HashMap<>();
map.put("user", user);
return map;
}
完成上述三个步骤,SpringMVC就可以自动给前台响应json数据,是不是相当简单。
2. 聊聊HttpMessageConverter<T>
HttpMessageConverter<T> 是Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息。
方法有:
- Boolean canRead(Class<?> clazz,MediaType – mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等);
- Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。
- LIst<MediaType> getSupportMediaTypes():该转换器支持的媒体类型。
- T read(Class<? extends T> clazz,HttpInputMessage inputMessage– ):将请求信息流转换为 T 类型的对象。
- void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为contentType。
工作流程如下:
2.1 SpringMVC内置HttpMessageConverter实现类
名称 | 作用 | 读支持 MediaType | 写支持 MediaType |
ByteArrayHttpMessageConverter | 数据与字节数组的相互转换 | \/\ | application/octet-stream |
StringHttpMessageConverter | 数据与 String 类型的相互转换 | text/\* | text/plain |
FormHttpMessageConverter | 表单与 MultiValueMap的相互转换 | application/x-www-form-urlencoded | application/x-www-form-urlencoded |
SourceHttpMessageConverter | 数据与 javax.xml.transform.Source 的相互转换 | text/xml 和 application/xml | text/xml 和 application/xml |
MarshallingHttpMessageConverter | 使用 Spring 的 Marshaller/Unmarshaller 转换 XML 数据 | text/xml 和 application/xml | text/xml 和 application/xml |
MappingJackson2HttpMessageConverter | 使用 Jackson 的 ObjectMapper 转换 Json 数据 | application/json | application/json |
MappingJackson2XmlHttpMessageConverter | 使用 Jackson 的 XmlMapper 转换 XML 数据 | application/xml | application/xml |
BufferedImageHttpMessageConverter | 数据与 java.awt.image.BufferedImage 的相互转换 | Java I/O API 支持的所有类型 | Java I/O API 支持的所有类型 |
2.2 使用HttpMessageConverter
将请求信息转化并绑定到处理方法的入参中:
- 使用 @RequestBody对处理方法进行标注;
- 使用HttpEntity<T>作为处理方法的入参;
将响应结果转为对应类型的响应信息:
- 使用 @ResponseBody对处理方法进行标注;
- 使用ResponseEntity<T>作为返回值;
Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错。(@RequestBody 和 @ResponseBody不需要成对出现)
2.3 示例(摘自网络)
因项目中主要使用处理Json数据,因此针对HttpMessageConverter的其他使用并未做demo,因此此处提供的网上案例仅供参考。
1. @RequestBody、@ResponseBody 示例
2. HttpEntity、ResponseEntity 示例