这篇文章是抄其他人的,原址: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注解的更多相关文章

  1. Spring Boot中的AutoConfiguation核心注解

    import org.springframework.boot.autoconfigure.condition.*; @ConditionalOnBean // 当容器中有指定bean的条件下 @Co ...

  2. Spring Boot中Service用@Transactional 注解

    一般来说function2和function1用的是同一个Transaction. 这个取决于@Transactional 的 propagation设置(事务的传播性) 默认的是 1 @Transa ...

  3. [你必须知道的.NET]第二十六回:认识元数据和IL(下)

    发布日期:2009.03.04 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 书接上回: 第二十四回:认识元数据和IL(上), ...

  4. Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

    用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...

  5. 传统的Servlet在spring boot中怎么实现的?

    传统的Servlet在spring boot中怎么实现的? 本文主要内容: 1:springboot一些介绍 2:传统的servlete项目在spring boot项目中怎么实现的?web.xml.u ...

  6. Spring Boot 中自定义 SpringMVC 配置,到底继承谁哪一个类或则接口?

    看了这篇文章,写的非常的言简意赅,特此记录下: 1.Spring Boot 1.x 中,自定义 SpringMVC 配置可以通过继承 WebMvcConfigurerAdapter 来实现. 2.Sp ...

  7. MVC中你必须知道的13个扩展点

    MVC中你必须知道的13个扩展点 pasting 转:http://www.cnblogs.com/kirinboy/archive/2009/06/01/13-asp-net-mvc-extensi ...

  8. 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述

    开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...

  9. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

    前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...

随机推荐

  1. react高阶组件

    高阶组件 为了提高组件复用性,在react中就有了HOC(Higher-Order Component)的概念.所谓的高阶组件,其本质依旧是组件,只是它返回另外一个组件,产生新的组件可以对属性进行包装 ...

  2. Linux和Windows启动后台程序

    平时很多时候,我们需要通过脚本命令调用执行程序,集成一体后方便使用快捷.但是启动脚本窗口比较碍眼,能设置为后台运行既方便又美观. Linux启动后台程序 1.后台执行 nohup方法:不挂断的运行命令 ...

  3. 实验一:通过bridge-utils工具创建网桥并实现网络连接

    实验名称: 通过bridge-utils工具创建网桥并实现网络连接 实验环境: 实验要求: 安装bridge-utils工具,创建网桥br0,通过brctl命令,为网桥配置IP地址192.168.23 ...

  4. linux服务nfs与dhcp篇

    nfs复习: 1.简介:用于liunx与linux之间的文件传输系统 2.下载nfs-utils和rpcbind 3.打开配置文件/etc/exports——文件名(目录名)共享给予的ip地址(rw) ...

  5. hadoop2.6.4集群笔记

    ---恢复内容开始--- 一,linux下的准备工作 1,修改主机名: vi /etc/sysconfig/network 2,修改ip vi /etc/sysconfig/network-scrip ...

  6. Dubbo基本原理机制

      分布式服务框架: –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连接和 ...

  7. win10家庭版 监听无法启动 报TNS-12560 TNS-00530

    首先win10权限问题, 搜索设置->更新和安全 ->恢复->高级启动立即重启 疑难解答-高级选项-启动设置-重启-选择“4” 按“WIN+R”组合键,输入“control user ...

  8. 分享下自己写的一个微信小程序请求远程数据加载到页面的代码

    1  思路整理 就是页面加载完毕的时候  请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码  我是改的 onload函数 /** * 生命周期函数--监听页面加载 */ on ...

  9. python_09 文件处理流程,文件操作方法

    文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 f=open('test.txt',encoding='gbk') data = f.read() ...

  10. Git如何在不提交当前分支的情况下切换到其它分支进行操作——git stash

    假如现在的Bug你还没有解决,而上边又给你派了一个新的Bug,而这个Bug相比较现在正在苦思冥想的Bug比较容易解决. 你想先解决新的Bug,可是之前的Bug还没有解决完而不能提交.怎么办? 解决方法 ...