我跟你讲这个东西暂时就两种使用一个是加@ResponseBody注解(异步请求),一个是ResponseEntity<T>作为返回值(文件的下载)
HttpMessageConverter原理
HttpMessageConverter<T>
- 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。
- DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
加入 jackson jar 包后, RequestMappingHandlerAdapter
装配的 HttpMessageConverter 如下:
PS:默认情况下数组长度是6个;增加了jackson的包后多了一个MappingJackson2HttpMessageConverter:处理JSON格式的请求或响应消息。
使用HttpMessageConverter
使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
使用 @RequestBody / @ResponseBody 对处理方法进行标注
使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值当控制器处理方法使用到 @RequestBody/@ResponseBody 或
HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错
@RequestBody 和 @ResponseBody 不需要成对出现用
@requestbody是在异步请求的时候使用的,一般返回的都是JSON类型的数据,可是all是集合,但是有了消息转换器再加上对象的jar包就可以在相应数据的时候将集合对象转换为JSON对象 PS:加入 jackson jar
@ResponseBody
@RequestMapping("/emps")
public Object emp() {
System.out.println("显示所有的数据的方法");
Collection<Employee> all = ed.getAll();
for (Employee employee : all) {
System.out.println(employee);
}
return all;
}
ResponseEntity<T>
下载文件时,服务器向浏览器发送的数据
body:文件的字节形式
headers:设置相应信息,让浏览器知道,这个文件是要下载而不是展示在浏览器上。
statusCode:状态码 OK为200
/**
*
* @param httpSession 这个是为了获取真实的路径
* @return
* @throws IOException
*/
@RequestMapping("/download")
public ResponseEntity<byte[]> download(HttpSession httpSession) throws IOException {
// String realPath = httpSession.getServletContext().getRealPath("download");
// System.out.println(realPath);
//将文件转换成流对象的形式
InputStream resourceAsStream = httpSession.getServletContext().getResourceAsStream("/download/22222.jpg");
byte[] body=new byte[resourceAsStream.available()];//获取流中数据的大小
resourceAsStream.read(body);//将数据写入到byte数组中
MultiValueMap<String, String> headers=new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=22222.jpg");
HttpStatus statusCode=HttpStatus.OK;
ResponseEntity<byte[]> re=new ResponseEntity<byte[]>(body, headers, statusCode);
return re;
}