处理 JSON:使用 HttpMessageConverter
处理JSON:
- 在pom.xml中加入:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
- 编写目标方法,使其返回 JSON 对应的对象或集合,在方法上添加 @ResponseBody 注解
EmployeeHandler.java
//@ResponseBody 使得返回的为Json对象
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee> testJson(){
return employeeDao.getAll() ;
}
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>restful index</title>
<script type="text/javascript" src="/scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("#testJson").click(function () {
var url = this.href ;
$.post(url,function (data) {
for (var i = 0 ; i < data.length ;i++){
var id = data[i].id ;
var lastName = data[i].lastName ;
alert(id+" : "+lastName) ;
}
}) ;
return false ;
}) ;
})
</script>
</head>
<body>
<a href="/testJson" id="testJson">Test Json</a>
</body>
</html>
- 注意此处导入了Jquery,需要处理静态资源,检查springmvc.xml有没有:
<!--静态资源处理-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
效果界面:
resonse :
HttpMessageConverter
HttpMessageConverter<T>
是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息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。原理:
HttpMessageConverter实现类:
DispatcherServlet 默认装配RequestMappingHandlerAdapter ,而RequestMappingHandlerAdapter 默认装配如下HttpMessageConverter:
加入 jackson jar 包后, RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:
使用 HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
使用 @RequestBody / @ResponseBody 对处理方法进行标注
使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值当控制器处理方法使用到 @RequestBody/@ResponseBody 或
HttpEntity<T>/ResponseEntity<T>
时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错@RequestBody 和 @ResponseBody 不需要成对出现
示例1:
index.jsp:
<form action="testHttpMessageConverter" method="post" enctype="multipart/form-data">
File: <input type="file" name="file"><br>
DESC: <input type="text" name="desc"><br>
<input type="submit" value="Submit">
</form>
handler:
// //当你的index.jsp 在webaap(即根)下的crud文件下时,需要 @RequestMapping("/crud/testHttpMessageConverter")这样,才能正常在浏览器显示,否则会发生404错误
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "Hello World !!! " + new Date() ;
}
提交表单,会上传文件.
成功效果:
后台打印:
- 示例2:
index.jsp:
<a href="testResponseEntity" >testResponseEntity</a>
handler:
@RequestMapping("testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession httpSession) throws IOException {
byte[] body = null ;
ServletContext servletContext = httpSession.getServletContext() ;
InputStream in = servletContext.getResourceAsStream("/files/index.jsp") ;
body = new byte[in.available()] ;
in.read(body) ;
HttpHeaders httpHeaders = new HttpHeaders() ;
httpHeaders.add("Content-Disposition","attachment;filename=index.jsp");
HttpStatus httpStatus = HttpStatus.OK ;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body,httpHeaders,httpStatus) ;
return response ;
}
点击链接会下载: