springboot中的controller注意事项说明

网友投稿 340 2022-08-19


springboot中的controller注意事项说明

目录关于controller注意事项1.controller主要有两个标签2.使用@Controller标签时各种controller的写法我们将分为四部分Controller 类型路由(Routes)接收数据Controller 举例

关于controller注意事项

spring boot的controller水深无比,经过学习,我总结一些tips,以便以后参照,减少错误:

1.controller主要有两个标签

@Controller和@RestController,两个标签无法同时发挥作用,前者标注的类只能返回静态文件,后者标注的类用于返回数据类型如json字符串

2.使用@Controller标签时

templates下的文件并不能被识别(自己试验过,发现和网上很多说法都不一样),只有static文件夹下文件能直接被读取,具体代码如下:

@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 一般是像下面这样来映射路由的:

@RestController

public class UsersController {

@GetMapping("/users")

public List 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 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.com/edit

@GetMapping("/users/{email}/edit"

public String edit(@PathVariable("email") String userEmail) {...}

接收数据

查询字符参数

如果是通过?xxx=xxx&yyy=yyy来传递过来的参数,那么我们可以URhZvYu通过@RequestParam来获取:

// GET /users?count=10

@GetMapping("/users")

public List index(@RequestParam int count) {...}

默认的话,变量名必须要和查询字符参数是一样的。你也可以通过下面的方式来修改:

// GET /users?num_per_page=50

@GetMapping("/users")

public List index(@RequestParam("num_per_page") int numPerPage) {...}

提交HTML表单数据

如果我们想要创建一个用户。这时候,我么可能在前端,写下面这样一个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.com"}

然后请求模型还是沿用之前的:

class UserCreateRequest {undefined

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;

}

@DeleteMahttp://pping("{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 index() { return new Arrayhttp://List();

}

@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) {}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot手动动态注入controller和service方式
下一篇:JAVA控制流程break continue的示例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~