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);
    }
}- 注解的说明
@RestController将返回的对象数据直接以 Json 的形式写入到HTTP的响应(Response)中。
@RequestMapping指定请求的注解。
@PostMapping实际上就等价于@RequestMapping(method = RequestMethod.POST),同样的@DeleteMapping,@GetMapping也都一样。
@PathVariable取url地址中的参数。
@RequestBody可以将 HttpRequest body 中的 JSON 类型数据反序列化为合适的 Java 类型。
ResponseEntity表示整个 HTTP Response 状态码,标头和正文内容。我们可以使用它来自定义 HTTP Response 的内容。
@RequestBody和@RequestParam
@RequestBody主要用来接收前端传递给后端的 Json 字符串中的数据,常使用的请求是 Post 请求。需要注意的是@RequestBody接收的请求实体里的数据。
@RequestParam接收的是参数里的数据,参数可以是元素,数组,集合,对象。- 也就是说如果参数放在请求实体中,
application/json传入后台的话,那么后台要用@RequestBody才能接收到,如果不放在请求实体中的话,那么后台接受前台传过来的参数时,要用@RequestParam来接收。- 需要注意的是,如果参数设置了
@RequestParam(xxx),那么前端必须有对应的xxx名字。否则数据接收不到,请求会报错。- 如果后端参数是一个对象,且该参数是以
@RequestBody修饰的,那么前端传递 json 参数时,必须满足一下要求:
- 后端
@RequestBody注解的类在装配到目标类(即@RequestBody后面的类)时,会根据 json 字符串中的 key 来匹配对应实体类的属性,如果匹配一致且 json 中的该 key 的值符合实体类的对应属性类型要求,会调用实体类的 setter 方法将值赋值给该属性。- json 字符中,如果 value 为 “” 的话,后端对应属性如果是 String 类型,那么接收的就是 “”。如果后端属性类型是 Integer,Double 类型,那么接收的就是 null。
- json 字符串如果 value 为 null 的话,后端对应收到的就是 null。
- 如果某个参数没有 value 的话,不要在传 json 给后端。
@RequestBody是通过无参构造器 new 的对象,然后通过 set 方法设置,如果实体类中添加了有参构造器,没有加无参构造器,接收参数时会异常。- 例子:
更多的注解使用,也会在后续的文章中说明添加。




 
                        
                        