SpringBoot各种Controller写法
最近玩SpingBoot,以下是⼀些Controller的各种写法
本⽂我们将分为四部分:
1、Controller的类型(传统的 和 REST)
2、路由(Routes)
3、如何接收数据
4、Controller⽰例
Controller 类型
你也许每天都在使⽤Spring ,但你知道controller有⼏种类型吗?其实controller是有两种的,⼀种就是传统的web的那种controller,⽽另外⼀种就是REST类型的controller。
@Controller 通常是被使⽤服务于web 页⾯的。默认,你的controller⽅法返回的是⼀个string 串,是表⽰要展⽰哪个模板页⾯或者是要跳转到哪⾥去。
@RestController 就是专门⽤在编写API的时候,特别那种返回⼀个JSON,或者是XML等等。然后⽅法返回的是可以是⼀个对象,是⼀个可以被序列化的对象。
当然了你也可以通过controller来实现返回JSON、XML这些。只是这⾥为了"REST",得另⽴门户,这样会更加的清晰明了。
路由(Routes)
这⾥的路由就是指http method。(GET,POST,PUT,PATCH,DELETE)。
HTTP Methods
在Spring boot中,http method可以被⽤类似“*Mapping”的格式来表⽰:
@GetMapping
@PostMapping
@PutMapping
@PatchMapping
@DeleteMapping
然后这些注解中可以添加path,像下⾯这样:
例⼦: @GetMapping("/users")
⼀个⽐较典型的REST controller ⼀般是像下⾯这样来映射路由的:
@RestController
public class UsersController {
@GetMapping("/users")
public List<User> index() {...}
@GetMapping("/users/{id}")
public User show(...) {...}
@PostMapping("/users")
public User create(...) {...}
@PutMapping("/users/{id}")
public User update(...) {...}
@DeleteMapping("/users/{id}")
public void delete(...) {...}
}
还有⼀种⽐较常见的做法是通过在controller类上添加⼀个@RequestMapping注解。这样相当于可以把上⾯的所有的mapping前缀添加到这⾥。
像下⾯这样(基于上⾯的例⼦修改):
@RestController
@RequestMapping("/users")
public class UsersController {
@GetMapping
public List<User> index() {...}
@GetMapping("{id}")
public User show(...) {...}
@PostMapping
public User create(...) {...}
@PutMapping("{id}")
public User update(...) {...}
@DeleteMapping("{id}")
public void delete(...) {...}
}
返回状态
Controller的⽅法可以去指定⼀个返回状态码。默认的是返回⼀个200 OK,如果是没有返回值(void)则返回 204 No Content。
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User create(...) {...}
路径变量
你可以通过添加@PathVariable注解来把路径上的值捕获下来:
// DELETE /users/123
@DeleteMapping("/users/{id}")
public void delete(@PathVariable long id) {...}
默认情况下,参数名必须要和路径上的变量名⼀样。但你也可以通过下⾯的⽅式来修改,就是你通过给@PathVariable赋值为路径变量名,然后参数名就可以是不⼀样的了:
// GET /users/me@example/edit
@GetMapping("/users/{email}/edit"
public String edit(@PathVariable("email") String userEmail) {...}
接收数据
查询字符参数
如果是通过?xxx=xxx&yyy=yyy来传递过来的参数,那么我们可以通过@RequestParam来获取:
// GET /users?count=10
@GetMapping("/users")
public List<User> index(@RequestParam int count) {...}
默认的话,变量名必须要和查询字符参数是⼀样的。你也可以通过下⾯的⽅式来修改:
// GET /users?num_per_page=50
@GetMapping("/users")
public List<User> index(@RequestParam("num_per_page") int numPerPage) {...}
提交HTML表单数据
如果我们想要创建⼀个⽤户。这时候,我么可能在前端,写下⾯这样⼀个form:
<form action="/users" method="POST">
springboot结构
<input name="name"/>
<input name="email"/>
<button type="submit">Create User</button>
</form>
现在我们创建⼀个请求模型,⽤来匹配我们的前端form结构:
class UserCreateRequest {
private String name;
private String email;
/* Getters & Setters omitted */
}
然后我们就可以在controller对应的⽅法上来捕获form⾥的值,我们通过对参数添加⼀个@ModelAttribute注解就可以实现了:
@PostMapping("/users")
public User create(@ModelAttribute UserCreateRequest request) {...}
提交JSON
就像上⾯例⼦那样,我们创建⼀个⽤户,然后是⼀个JSON格式:
{ "name": "Som Eone", "email": "someone@example"}
然后请求模型还是沿⽤之前的:
class UserCreateRequest {
private String name;
private String email;
}
然后我们使⽤@RequestBody来捕获前端发送过来的JSON串,然后反序列化到我们的请求模型UserCreateRequest:@PostMapping
public User create(@RequestBody UserCreateRequest request) {...}
Controller 举例
以下是使⽤上述所有注解创建Controller的⽰例。 没有具体逻辑,只是简单的展⽰上⾯说到的各个注解。
传统的controller
这类型的controller返回值表⽰要展⽰的页⾯或要跳转到哪个请求。
@Controller
@RequestMapping("/users")
public class UsersController {
@GetMapping
public String index() {
return "users/index";
}
@GetMapping("{id}")
public String show(@PathVariable long id) {
return "users/show";
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public String create(@ModelAttribute UserCreateRequest request) {
return "redirect:/users";
}
@PutMapping("{id}")
public String update(@PathVariable long id, @RequestBody UserUpdateRequest request) {
return "redirect:/users/" + id;
}
@DeleteMapping("{id}")
public String delete(@PathVariable long id) {
return "redirect:/users";
}
}
REST controller
这类型的controller返回值是⼀些对象,这些对象要被序列化成JSON、XML等其他格式,并不是表⽰要跳转到哪个HTML模板。
@RestController
@RequestMapping("/users")
public class UsersController {
@GetMapping
public List<User> index() {        return new ArrayList<User>();
}
@GetMapping("{id}")
public User show(@PathVariable long id) {        return new User();
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User create(@RequestBody UserCreateRequest request) {
return new User();
}
@PutMapping("{id}")
public User update(@PathVariable long id, @RequestBody UserUpdateRequest request) {              return new User();
}
@DeleteMapping("{id}")
public void delete(@PathVariable long id) {}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。