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 方法设置,如果实体类中添加了有参构造器,没有加无参构造器,接收参数时会异常。- 例子:
更多的注解使用,也会在后续的文章中说明添加。