一句话:简单到没有朋友,特别的简单
1.@ResponseBody注解
位置:方法上
作用:
- 将Controller目标方法的返回值直接写入 HTTP response body 中,一般在异步获取数据时使用(AJAX),值得注意的是,标注@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。
首先我们要导入3个jar包,如下:
现在index.jsp写一个超链接
<a href="testJson" id="testJson">Test Json</a>
我们需要他返回employee成员变量,所以需要一些js代码
<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;
var args = {};
$.post(url, args, 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>
Controller目标方法
@ResponseBody //
@RequestMapping("/testJson")
public Collection<Employee> testJson(){
return employeeDao.getAll();
}
结果
2. HttpMessageConverter的工作原理
原理图:
HttpMessageConverter 的实现类
SpringMVC默认搭载6个实现类
加入Json jar包后就会自动多搭载一个
3. 使用HttpMessageConverter
- HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring提供了两种途径:
- 使用
@RequestBody
/@ResponseBody
对处理方法进行标注 - 使用
HttpEntity<T>
/ResponseEntity<T>
作为处理方法的入参或返回值
-
当控制器处理方法使用到
@RequestBody
/@ResponseBody
或HttpEntity<T>
/ResponseEntity<T>
时, SpringMVC首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错 -
@RequestBody 和 @ResponseBody 不需要成对出现
3.1 @RequestBody
/ @ResponseBody
示例
- handle15()方法:SpringMVC根据handle15()方法的返回值类型(byte)和标注的注解@ResponseBody,会自动去匹配ByteArrayHttpMessageConverter,把我们返回的数组返回给客户端(转换后返回给客户端)
- handle14()方法:SpringMCV根据handle14()方法入参的类型和入参标注的@RequestBody,会自动的去匹配StringHttpMessageConverter,将请求信息转换为String类型的字符串传入到目标方法(转换后传入目标方法)
文件上传代码示例:
Controller目标方法
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "helloworld! " + new Date();
}
index.jsp
<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>
3.2 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/abc.txt");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=abc.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}
index.jsp
<a href="testResponseEntity">Test ResponseEntity</a>