zoukankan      html  css  js  c++  java
  • 后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节20(核心对象,视图解析器,JSON)

    1、概念

      当返回值为JSON时,根据Handler方法的返回值分为以下两种情形:

    1. 当返回值为字符串类型时,它可以直接是JSON字符串。
    2. 当返回值为实体对象时,通过配置将实体对象转换为字符串。

    2、使用

      根据返回值的类型,它的实现方式有三种。

    1. 当返回值为JSON字符串时,添加@ResponseBody注解,设置produces属性
    2. 当返回值为实体对象时,添加@JsonView注解。
    3. 当返回值为实体对象时,配置相关配置项。

    2.1    json字符串

      当返回值为JSON字符串时,它的使用步骤如下:

    1. 第一步,在handler方法上添加@Responsebody注解,或者在Controller类上添加@RestController注解
    2. 第二步,在@XXMapping方法上设置produces属性的值为Application json相关的值即可。或者在Controller类上添加@XXMapping注解,并设置produces的值。

    2.2    jsonView

      当返回值为实体对象时,它的使用步骤如下:

    1. 第一步,创建返回的实体对象,现在通常情况下都是ResponseEntity<T>,组成部分有三个code,message,data。
    2. 第二步,在实体对象的属性上添加@JsonView注解。
    3. 第三步,在handler方法上添加@JsonView,@ResponseBody注解。

    2.3     配置

      当返回值为实体对象时,它的使用步骤如下:

    1. 第一步,配置响应内容类型,调用configureContentNegotiation。
    2. 第二步,配置HttpMessageConverter。
    3. 第三步,验证,返回任意的实体对象。

    3、示例

      在实际项目中经常使用json字符串,示例省略。

    3.1    JsonView示例

      1、第一步,创建ResponseEntity<T>对象。在属性上添加@JsonView注解

    @Getter
    @Setter
    public class ResponseEntity<T extends Bean> {
    	public interface ResponseData {};
    	// 返回码
    	@JsonView(ResponseData.class)
    	private Integer code;
    	// 返回信息
    	@JsonView(ResponseData.class)
    	private String message;
    	// 返回实体对象
    	@JsonView(ResponseData.class)
    	private T  data;
    }
    

      2、第二步,在Handler方法上添加@JsonView注解

    @GetMapping("/jsonView")
    @ResponseBody
    @JsonView(ResponseData.class)
    public ResponseEntity<User> getUser(@ModelAttribute User user) {
    	ResponseEntity<User> responseData = new ResponseEntity<User>();
    	responseData.setCode(200);
    	responseData.setMessage("some message");
    	responseData.setData(user);
    	return responseData;
    }
    

      3、第三步,在User实体对象上,需要返回的属性上添加@JsonView注解

    @Getter
    @Setter
    public class User extends Bean{
    	// 姓名
    	@JsonView(ResponseData.class)
    	private String name;
    	// 年龄
    	@JsonView(ResponseData.class)
    	private int age;
    }
    

      4、第四步,验证,访问jsonView,结果如下:

    {"code":200,"message":"somemessage","data":{"name":"Jack","age":10}}
    

    3.2     配置

      1、第一步,配置内容响应类型,当请求中携带.json后缀时,响应内容就会设置为Application_json

    @Override
    public void 
    configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    	// 是否支持url中的后缀做为判断依据,false时会禁用
    	configurer.favorPathExtension(true)
    	// 请求Url参数的名称,或者是请求头中的参数名称
    	.parameterName("mediatype")
    	// 是否忽略请求头信息,true会忽略,此时相当于禁用根据请求头信息判断内容类型
    	.ignoreAcceptHeader(false)
    	.useJaf(false)
    	// 设置默认的响应类型,此时设置为Application_json
    	.defaultContentType(MediaType.APPLICATION_JSON_UTF8)
    	// 建立参数值或者是后缀值与响应类型MediaType之间的关系,例如请求url后缀为xx.json,此时根据json,响应类型为Application_JSON
    	.mediaType("json", MediaType.APPLICATION_JSON)
    	// xml表示Application_xml
    	.mediaType("xml", MediaType.APPLICATION_XML);
    }

      2、第二步,配置HttpMessageConverter

    /**
     * 
     * 配置messageConverter
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    	// 创建ObjectMapperBuilder对象
    	Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true)
    			  .dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    	// 将对象转换为JSON
    	converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }

      3、第三步,验证。访问jsonView.json,结果如下:

    {
      "code" : 200,
      "message" : "some message",
      "data" : {
        "name" : "Jack",
        "age" : 10
      }
    }
    

      这种方式个人感觉最优。

  • 相关阅读:
    013.ES6 -对象字面量增强型写法
    012. ES6
    011. ES6 语法
    10. 9. Vue 计算属性的setter和getter 以及 计算属性的缓存讲解
    4. Spring MVC 数据响应方式
    3. SpringMVC 组件解析
    9. Vue 计算属性
    【洛谷 2984】给巧克力
    【洛谷 1821】捉迷藏 Hide and Seek
    【洛谷 1821】银牛派对Silver Cow Party
  • 原文地址:https://www.cnblogs.com/rain144576/p/12903012.html
Copyright © 2011-2022 走看看