SpringBoot_01


SpringBoot_01

前言

因为 SpringBoot 都是以 Json 数据为交互的,所以在学习 SpringBoot 之前,需要对 Json 的数据格式有一个初步的了解。

Json 数据格式,包括 JsonObject ,是一种 { } 样式的数据格式。JsonArray 是一种 [ ] 样式的数据格式。两种数据格式都是依托 json 数据而来的,并且可以相互转换。

同时需要注意的是在 JAVA 中 List 的数据格式也是 [ ],同理 Map 的数据格式是 { }。

返回后台数据

  • 代码
@Controller
@ResponseBody
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHello() {
        return "hello";
    }
}

当 HTTP 的请求为:http://localhost:8080/hello 的时候,返回的数据是 sayHello 方法中 return 的返回值 hello

返回到指定的 HTML

  • 代码
@Controller
public class HelloController {
    @RequestMapping(value = "/hellos", method = RequestMethod.GET)
    public String sayHello() {
        return "hellos";
    }
}
  • 配置文件
thymeleaf:
  prefix: classpath:/templates/
  check-template-location: true
  cache: false
  suffix:  .html
  #encoding: UTF-8
  #content-type: text/html
  mode: HTML5

在指定的目录 templates 下有一个 HTML 文件,文件名为 hellos.html 。这个时候当请求为:http://localhost:8080/hello 返回的就是文件 hellos.html 里面的内容。

二者差异的说明

  • 在 SpringBoot 的项目中,如果 controller 层使用注解 @Controller@ResponseBody 那么返回的数据为方法返回的数据类型。(这里 @Controller@ResponseBody 这两个注解相当于 @RestController 这个注解。)
  • 在 SpringBoot 的项目中,如果 controller 层使用注解 @Controller ,并且返回的方法需要找到指定的前端界面,需要引用架包 spring-boot-starter-thymeleaf ,并在配置文件中指定对应的配置,这个时候 controller 层的方法才会找到对应的前端界面。

关于注解的说明

先看一段代码

  • 代码
@RestController
@RequestMapping("/api")
public class BookController {
    private List<Book> books = new ArrayList<>();

    @PostMapping("/book")
    public ResponseEntity<List<Book>> addBook(@RequestBody Book book) {
        books.add(book);
        return ResponseEntity.ok(books);
    }

    @DeleteMapping("/book/{id}")
    public ResponseEntity deleteBookById(@PathVariable("id") int id) {
        books.remove(id);
        return ResponseEntity.ok(books);
    }

    @GetMapping("/book")
    public ResponseEntity getBookByName(@RequestParam("name") String name) {
        List<Book> results = books.stream().filter(book -> book.getName().equals(name)).collect(Collectors.toList());
        return ResponseEntity.ok(results);
    }
}
  • 注解的说明
  1. @RestController 将返回的对象数据直接以 Json 的形式写入到 HTTP 的响应(Response)中。
  2. @RequestMapping 指定请求的注解。
  3. @PostMapping实际上就等价于 @RequestMapping(method = RequestMethod.POST),同样的 @DeleteMapping ,@GetMapping也都一样。
  4. @PathVariable 取url地址中的参数。
  5. @RequestBody 可以将 HttpRequest body 中的 JSON 类型数据反序列化为合适的 Java 类型。
  6. ResponseEntity 表示整个 HTTP Response 状态码,标头和正文内容。我们可以使用它来自定义 HTTP Response 的内容。

@RequestBody@RequestParam

  • @RequestBody 主要用来接收前端传递给后端的 Json 字符串中的数据,常使用的请求是 Post 请求。需要注意的是 @RequestBody 接收的请求实体里的数据。
  • @RequestParam 接收的是参数里的数据,参数可以是元素,数组,集合,对象。
  • 也就是说如果参数放在请求实体中,application/json 传入后台的话,那么后台要用 @RequestBody 才能接收到,如果不放在请求实体中的话,那么后台接受前台传过来的参数时,要用 @RequestParam 来接收。
  • 需要注意的是,如果参数设置了 @RequestParam(xxx),那么前端必须有对应的 xxx名字。否则数据接收不到,请求会报错。
  • 如果后端参数是一个对象,且该参数是以 @RequestBody 修饰的,那么前端传递 json 参数时,必须满足一下要求:
    1. 后端 @RequestBody 注解的类在装配到目标类(即 @RequestBody 后面的类)时,会根据 json 字符串中的 key 来匹配对应实体类的属性,如果匹配一致且 json 中的该 key 的值符合实体类的对应属性类型要求,会调用实体类的 setter 方法将值赋值给该属性。
    2. json 字符中,如果 value 为 “” 的话,后端对应属性如果是 String 类型,那么接收的就是 “”。如果后端属性类型是 Integer,Double 类型,那么接收的就是 null。
    3. json 字符串如果 value 为 null 的话,后端对应收到的就是 null。
    4. 如果某个参数没有 value 的话,不要在传 json 给后端。
    5. @RequestBody 是通过无参构造器 new 的对象,然后通过 set 方法设置,如果实体类中添加了有参构造器,没有加无参构造器,接收参数时会异常。
  • 例子:

image-20211017130442647

image-20211017130527516

image-20211017130604979

image-20211017131012324

更多的注解使用,也会在后续的文章中说明添加。


文章作者: L Q
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 L Q !
  目录