1、使用HttpMessageConvter<T>可以将请求信息转换并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息。spring提供了两种途径:
- @RequestBody和@ResponseBody对方法进行标注
- HttpEntity<T>和ResponseEntity<T>作为处理方法的入参返回值
2、当控制器方法使用到@RequestBody和@ResponseBody或HttpEntity<T>和ResponseEntity<T>时,spring首先根据请求头或响应头的Accept属性匹配到HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter,若找不到可用的HttpMessageConverter将报错。
3、@RequestBody和@ResponseBody不需要成对出现。
一、可以使用@RequestBody和@ResponseBody来将表单转成String类型,注意这种是不能进行文件上传的。
@ResponseBody @RequestMapping("/testHttpMessageConverter") public String testHttpMessageConverter(@RequestBody String body) { System.out.println(body); return "hello world"+new Date(); }
前端:
<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>
二、使用HttpEntity<T>和ResponseEntity<T>模拟下载
@RequestMapping("/testResponseEntity") public ResponseEntity<byte []> testResponseEntity(HttpSession session) throws IOException{ byte [] body = null; ServletContext servletContext = session.getServletContext(); InputStream in = servletContext.getResourceAsStream("/file/tmp.txt"); body = new byte[in.available()]; in.read(body); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=tmp.txt"); HttpStatus statusCode = HttpStatus.OK; ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body,headers,statusCode); return response; }
前端页面:
<a href="testResponseEntity">testResponseEntity</a>
点击之后会下载在WebContent/file文件夹下的tmp.txt文件