处理JSON

  1. 加入jar包

    1. <!--处理json-->
    2. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    3. <dependency>
    4. <groupId>com.fasterxml.jackson.core</groupId>
    5. <artifactId>jackson-databind</artifactId>
    6. <version>2.10.0</version>
    7. </dependency>
  2. 编写目标方法,使其返回JSON对应的对象或集合

  3. 在方法上添加@ResponseBody注解
    1. @ResponseBody
    2. @RequestMapping("/getUsers")
    3. public List<User> testAjax() {
    4. List<User> users = new ArrayList<>();
    5. users.add(new User(1, "a", new Date(), 1000));
    6. users.add(new User(2, "b", new Date(), 2000));
    7. return users;
    8. }

HttpMessageConverter

  1. HttpMessageConverter是Spring 3.0新添加的一个接口,负责将请求信息转换为一个对象(类型为T),将对象(类型为T)输出为响应信息
  2. HttpMessageConverter接口定义的方法:
    1. Boolean canRead(Class<?> clazz, MediaType mediaType):指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为clazz类型的对象,同时指定支持MIME类型(text/html, application/json等)
    2. Boolean canWrite(Class<?> clazz, MediaType mediaType):指定转换器是否可将clazz类型的对象写到响应流中,响应流支持的媒体类型在MediaType中定义。
    3. T read(Class<? extends T> clazz,HttpInputMessage inputMessage): 将请求信息流转换为 T 类型的对象。
    4. void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类 型为 contentType。
    5. image-20200921133910349.png
  3. DispatcherServlet默认装配RequuestMappingHandlerAdapter,而RequestMappingHandlerAdapter默认装配如下:
    1. image-20200921180341755.png
    2. 加入jacksonjar包之后,RequestMappingHandlerAdatper装配的HttpMessageConverter如下:
    3. image-20200921180458576.png
  4. 使用HttpMessageConverter将请求信息转化并绑定到处理方法的入参中或将相应结果转为对应类型的响应信息,Spring提供了两种途径:
    1. 使用@RequestBody/@ResponseBody对处理方法进行标注
    2. 使用HttpEntity/ResponseEntity作为处理方法的如此那或返回值。
  5. 当控制器处理方法使用到@RequestBody/@ResponseBody或HttpEntity/ResponseEntity时,Spring首先根据请求呕吐或响应头的Accept属性选择匹配的HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter,若找不到可用的HttpMessageConverter将报错。
  6. @RequestBody和@ResponseBody不需要成对出现。

    1. @ResponseBody
    2. @RequestMapping("testHttpMessageConverter")
    3. public String testHttpMessageConverter(@RequestBody String body) {
    4. System.out.println(body);
    5. return "helloWorld " + new Date();
    6. }

HttpMessageConverter的实现类

实现类 功能说明
StringHttpMessageConverter 将请求信息转换为字符串
FormHttpMessageConverter 将表单数据读取到MultiValueMap中
XmlAwareFormHttpMessageConverter 扩展与FormHttpMessageConverter,如果部分表单属性是XML数据,可用该转换器进行读取
ResourceHttpMessageConverter 读写org.springframework.core.io/Resource对象
BufferedImageHttpMessageConverter 读写BufferedImage对象
ByteArrayHttpMessageConverter 读写二进制数据
SourceHttpMessageConverter 读写javax.xml.tranform.Source类型的数据
MarshallingHttpMessageConverter 通过Spring的org.springframework.xml.Marshaller和Unmarshaller读写xml消息
Jaxb2RootElemengHttpMessageConverter 通过JAXB2读写XML信息,将请求信息转换到标注XMLRootElement和XxmlType直接的类中
MappingJacksonHttpMessageConverter 利用Jackson开源包的ObjectMapper读写JSON数据
RssChannelHttpMessageConverter 能够读写RSS种子消息
AtomFeedHttpMeessageConverter 和RssChannelHttpMessageConverter能够读写RSS种子消息