必须知道的Spring Boot中的一些Controller注解
这篇文章是抄其他人的,原址:https://cloud.tencent.com/developer/article/1082720
本文旨在向你介绍在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等等。然后方法返回的是可以是一个对象,是一个可以被序列化的对象
路由(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) {} }
必须知道的Spring Boot中的一些Controller注解的更多相关文章
- Spring Boot中的AutoConfiguation核心注解
import org.springframework.boot.autoconfigure.condition.*; @ConditionalOnBean // 当容器中有指定bean的条件下 @Co ...
- Spring Boot中Service用@Transactional 注解
一般来说function2和function1用的是同一个Transaction. 这个取决于@Transactional 的 propagation设置(事务的传播性) 默认的是 1 @Transa ...
- [你必须知道的.NET]第二十六回:认识元数据和IL(下)
发布日期:2009.03.04 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 书接上回: 第二十四回:认识元数据和IL(上), ...
- Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...
- 传统的Servlet在spring boot中怎么实现的?
传统的Servlet在spring boot中怎么实现的? 本文主要内容: 1:springboot一些介绍 2:传统的servlete项目在spring boot项目中怎么实现的?web.xml.u ...
- Spring Boot 中自定义 SpringMVC 配置,到底继承谁哪一个类或则接口?
看了这篇文章,写的非常的言简意赅,特此记录下: 1.Spring Boot 1.x 中,自定义 SpringMVC 配置可以通过继承 WebMvcConfigurerAdapter 来实现. 2.Sp ...
- MVC中你必须知道的13个扩展点
MVC中你必须知道的13个扩展点 pasting 转:http://www.cnblogs.com/kirinboy/archive/2009/06/01/13-asp-net-mvc-extensi ...
- 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述
开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...
- 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用
前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...
随机推荐
- centos下vi的用法大全
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- VS在.NETFramework升级时遇到类库冲突如何解决
相信大家在开发环境中随着程序的不断升级,很多时间需要升级. NETFramework版本.今天项目中遇到的问题是从. NETFramework4.0升级到4.5时提示 Entityframework. ...
- IntelliJ IDEA中Terminal路径的问题(win7环境)
在安装java jdk,配置系统变量后,再安装idea,有时候会出现使用idea中Termimal进行编译运行java文件出现,javac/java不是内部命令,或者“错误: 找不到或无法加载主类”的 ...
- Linux下部署 apache+jdk+tomcat
1.输入下面的命令安装apache2: ubuntu@VM-164-86-ubuntu:sudo apt-get install apache2 当提示“您希望继续执行吗?”时 输入 Y 然后等待安 ...
- jdbc链接数据库的url两种写法
首先看下面两个jdbc的url 一:jdbc.url=jdbc:oracle:thin:@100.2.194.200:1521/abc二:jdbc.url=jdbc:oracle:thin:@100. ...
- ef join查询
temp = temp.OrderByDescending(s => s.CreateTime).Skip((param.PageIndex - ) * param.PageSize).Take ...
- JAVA中循环删除list中元素的方法总结(同上篇)
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...
- hadoop的hdfs中的javaAPI操作
package cn.itcast.bigdata.hdfs; import java.net.URI; import java.util.Iterator; import java.util.Map ...
- base64图片
常见的html中或css中图片的src赋值为data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHR ...
- 保持ssh连接长时间不断开的技巧
我经常用ssh连接服务器,过段时间不用, 需要恢复一下断开的连接, 原因是NAT防火墙喜欢对空闲的会话进行超时处理,以确保它们状态表的干净和内存的低占用率,因为 长时间保持连接, 会长期占用部分系统资 ...