关于controller注意事项
spring boot的controller水深无比,经过学习,我总结一些tips,以便以后参照,减少错误:
1.controller主要有两个标签
@Controller和@RestController,两个标签无法同时发挥作用,前者标注的类只能返回静态文件,后者标注的类用于返回数据类型如json字符串
2.使用@Controller标签时
templates下的文件并不能被识别(自己试验过,发现和网上很多说法都不一样),只有static文件夹下文件能直接被读取,具体代码如下:
1
2
3
4
|
@RequestMapping (value= "/" , method= RequestMethod.GET) public String home() { return "views/index.html" ; } |
这里static作为根目录被访问。
各种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 一般是像下面这样来映射路由的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@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前缀添加到这里。
像下面这样(基于上面的例子修改):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@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。
1
2
3
|
@PostMapping @ResponseStatus (HttpStatus.CREATED) public User create(...) {...} |
路径变量
你可以通过添加@PathVariable注解来把路径上的值捕获下来:
1
2
3
|
// DELETE /users/123 @DeleteMapping ( "/users/{id}" ) public void delete( @PathVariable long id) {...} |
默认情况下,参数名必须要和路径上的变量名一样。但你也可以通过下面的方式来修改,就是你通过给@PathVariable赋值为路径变量名,然后参数名就可以是不一样的了:
1
2
3
|
// GET /users/me@example.com/edit @GetMapping ( "/users/{email}/edit" public String edit( @PathVariable ( "email" ) String userEmail) {...} |
接收数据
查询字符参数
如果是通过?xxx=xxx&yyy=yyy来传递过来的参数,那么我们可以通过@RequestParam来获取:
1
2
3
|
// GET /users?count=10 @GetMapping ( "/users" ) public List<User> index( @RequestParam int count) {...} |
默认的话,变量名必须要和查询字符参数是一样的。你也可以通过下面的方式来修改:
1
2
3
|
// GET /users?num_per_page=50 @GetMapping ( "/users" ) public List<User> index( @RequestParam ( "num_per_page" ) int numPerPage) {...} |
提交HTML表单数据
如果我们想要创建一个用户。这时候,我么可能在前端,写下面这样一个form:
1
2
3
4
5
|
< form action = "/users" method = "POST" > < input name = "name" /> < input name = "email" /> < button type = "submit" >Create User</ button > </ form > |
现在我们创建一个请求模型,用来匹配我们的前端form结构:
1
2
3
4
5
|
class UserCreateRequest { private String name; private String email; /* Getters & Setters omitted */ } |
然后我们就可以在controller对应的方法上来捕获form里的值,我们通过对参数添加一个@ModelAttribute注解就可以实现了:
1
2
|
@PostMapping ( "/users" ) public User create( @ModelAttribute UserCreateRequest request) {...} |
提交JSON
就像上面例子那样,我们创建一个用户,然后是一个JSON格式:
{ "name": "Som Eone", "email": "someone@example.com"}
然后请求模型还是沿用之前的:
1
2
3
4
|
class UserCreateRequest {undefined private String name; private String email; } |
然后我们使用@RequestBody来捕获前端发送过来的JSON串,然后反序列化到我们的请求模型UserCreateRequest:
1
2
|
@PostMapping public User create( @RequestBody UserCreateRequest request) {...} |
Controller 举例
以下是使用上述所有注解创建Controller的示例。 没有具体逻辑,只是简单的展示上面说到的各个注解。
传统的controller
这类型的controller返回值表示要展示的页面或要跳转到哪个请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@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模板。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@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) {} } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/m0_37828249/article/details/75208062