必须知道的Spring Boot中的一些Controller注解

本文旨在向你介绍在Spring Boot中controller中最基本的一些注解,不可能涵盖所有的,但至少让你了解最基本的,然后可以通过这些注解来写出一个API或HTML的端点。

本文我们将分为四部分:

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.com/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"> <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.com"}

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

class UserCreateRequest { private String name; private String email; /* Getters & Setters omitted */ }

然后我们使用@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) {} }

总结

也许你每天都在用,但可能并没有如此系统的去学习它。通过本文希望能够让你对controller里的注解有一个系统的认识,虽然这些看起来都是一些基础性的东西,但他们已经足够强大。特别是现在微服务这么火,本文中有关REST风格的请求方式可以让你更方便的构建出一个微服务来!

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2017-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

@Resource,@Autowired,@Inject3种注入方式详解

概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中。 ANNOTATIONPACKAGESOUR...

40590
来自专栏Java学习之路

07 Spring框架 依赖注入(四)基于注解的依赖注入

前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Sprin...

38670
来自专栏杂烩

springmvc4的validation配置

同时注解方式也可细分,一种是将提示信息硬编码到代码里,这种配置简单,另外一种稍微麻烦点,但可以把错误提示信息写到配置文件里。

9320
来自专栏阿杜的世界

利用Mockito模拟DB

前两篇文章的主要内容是:为了给执行测试,如何建立数据库表和导入初始数据。这里我们将学习如何利用Mockito框架和一些注解模拟(mock)Reposito...

13720
来自专栏老付的网络博客

SpringMVC 教程

   Spring 是目前比较流行的MVC框架,让POJO处理起来变的容易,也支持Rest的Url请求。采用松散的耦合可插拔的接口,比其它MVC接口更具有扩展...

20040
来自专栏乐百川的学习频道

JUnit 5 简介

著名的Java单元测试框架Junit 4已经出来很长时间了,当时我发现JUnit 5已经处于测试版,就准备写文章来介绍JUnit 5.不过因为还是测试版,所以有...

25390
来自专栏lgp20151222

@RequestParam与@PathVariable的区别

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

15320
来自专栏desperate633

资源竞速(Race Conditions)和临界区(Critical Sections)临界区临界区的资源竞速避免资源竞速临界区的吞吐量

critical section是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。 资源竞速就是可能在...

12000
来自专栏xingoo, 一个梦想做发明家的程序员

Spring MVC 基于URL的映射规则(注解版)

好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了。这次就跟着之前的问题,继续总结下Spring MVC中的小知识。 关于Sprin...

74170
来自专栏JAVA烂猪皮

Spring IoC中各个注解的理解和使用

一、把在Spring的xml文件中配置bean改为Spring的注解来配置bean

8730

扫码关注云+社区

领取腾讯云代金券