处理 JSON
- 加入jar包
- 编写目标方法,使其返回JSON对应的对象或集合。
- 在方法上添加@ResponseBody注解
index.jsp:
<script>
$(function(){
$("#testJson").click(function (){
$.post("testJson",{},function (data){
console.log(data);
});
});
});
</script>
<button id="testJson">Test JSON</button>
Controller层代码:
@ResponseBody
@RequestMapping("/testJson")
public List<User> testJson(){
List<User> users = new ArrayList<>();
users.add(new User("Lucy","11111","2345@qq.com",18));
users.add(new User("Tom","222222","2345@qq.com",28));
users.add(new User("Bob","333333","2345@qq.com",48));
users.add(new User("Green","444444","2345@qq.com",38));
return users;
}
HttpMessageConverter
- HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息。
- HttpMessageConverter 接口定义的方法:
– Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器
可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对
象,同时指定支持 MIME 类型(text/html,applaiction/json等)
– Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器
是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型
在MediaType 中定义。
– LIst getSupportMediaTypes():该转换器支持的媒体类
型。
– T read(Class<? extends T> clazz,HttpInputMessage inputMessage):
将请求信息流转换为 T 类型的对象。
– void write(T t,MediaType contnetType,HttpOutputMessgae
outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类
型为 contentType。
HttpMessageConverter 的实现类
DispatcherServlet 默认装配RequestMappingHandlerAdapter ,而RequestMappingHandlerAdapter 默认装配如下
HttpMessageConverter:
加入 jackson jar 包后, RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:
使用 HttpMessageConverter
- 使用 HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
– 使用 @RequestBody / @ResponseBody 对处理方法进行标。
– 使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值。 - 当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错。
- @RequestBody 和 @ResponseBody 不需要成对出现
示例
@ResponseBody
@RequestMapping("/testHttpMessageConvert")
public String testHttpMessageConvert(@RequestBody String body ){
System.out.println(body);
return "Hello World"+new Date();
}
<form action="testHttpMessageConvert" method="post">
File:<input type="file" name="file">
desc:<input type="test" name="desc">
<input type="submit" value="Submit">
</form>
使用 HttpEntity<T> / ResponseEntity<T>实现下载
controller:
@RequestMapping("/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
byte[] body = null;
ServletContext servletContext = session.getServletContext();
InputStream in = servletContext.getResourceAsStream("/files/123.txt");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition","attachment;filename=123.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<>(body,headers,statusCode);
return response;
}