一、处理JSON
在SpringMVC中处理JSON步骤:
1、加上jar包
<!--处理json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
2、编写对应的目标方法,使其返回JSON对应的对象或集合
3、在方法上加上注解 @ResponseBody
实例:
@ResponseBody
@RequestMapping(value = "/testJSON",method = RequestMethod.GET)
public Object testJSON(){
return employeeDao.getAll();
}
二、HttpMessageConverter<T>
1、HttpMessageConverter<T> 是Spring 3.0 新增加的一个接口,负责将请求信息转化为一个对象(类型为T),将对象输出为响应信息。
2、HttpMessageConverter<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。
3、原理图:
4、关于HttpMessageConverter<T>的实现类
5、DispatcherServlet 默认装配RequestMappingHandlerAdapter ,而RequestMappingHandlerAdapter 默认装配如下
HttpMessageConverter:
6、加入Jackson jar包后,RequestMappingHandlerAdapter 装配的 HttpMessageConverter 如下:
7、使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
- 使用 @RequestBody / @ResponseBody 对处理方法进行标注
- 使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值
8、当控制器处理方法使用到 @RequestBody、@ResponseBody 或HttpEntity<T>/ResponseEntity<T> 时,Spring首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter,若找不到可用的 HttpMessageConverter 将报错
9、@RequestBody 和 @ResponseBody 不需要成对出现
示例:
@ResponseBody
@RequestMapping(value = "/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "helloworld "+new Date();
}
<form action="/testHttpMessageConverter" method="post" enctype="multipart/form-data">
File:<input type="file" name="file">
Desc:<input type="text" name="desc">
<input type="submit" value="submit">
</form>
@ResponseBody
@RequestMapping(value = "/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
byte[] body = null;
ServletContext context = session.getServletContext();
InputStream in = context.getResourceAsStream("/file/1.doc");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition","attachment;filename=1.doc");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body,headers,statusCode);
return entity;
}