SpringMVC - REST风格介绍已经RESTful简化开发
文章目录
- REST
- REST基本介绍
- RESTful快速入门
- RESTful快速开发
REST
REST基本介绍
REST (Representational State Transfer), 表现形式状态转换(访问网络资源的风格)
传统风格资源描述形式
- http://localhost/user/getById?id=1
- http://localhost/user/saveUser
REST风格描述形式
- http://localhost/user/1
- http://localhost/user
REST优点:
隐藏资源的访问行为,无法通过地址得知对资源是何种操作
书写简化
REST风格介绍:
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
- http://localhost/users 查询全部用户信息 GET(查询)
- http://localhost/users/1 查询指定用户信息 GET(查询)
- http://localhost/users 添加用户信息 POST(新增/保存)
- http://localhost/users 修改用户信息 PUT(修改/更新)
- http://localhost/users/1 删除用户信息 DELETE(删除)
根据REST风格对资源进行访问称为RESTful
注意事项:
上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts……
RESTful快速入门
1. 设定http请求动作(请求方式)
通过@RequestMapping注解的, method属性
@Controller
public class UserController {// 新增/保存 指定请求行为: POST@RequestMapping(value = "/users", method = RequestMethod.POST)@ResponseBodypublic String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}// 删除 指定请求行为: DELETE@RequestMapping(value = "/users", method = RequestMethod.DELETE)@ResponseBodypublic String delete(Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}
}
2. 设定请求参数(路径变量)
@PathVariable注解, 写在形参变量的前面, 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
设置完成后可以在路径中携带id访问: http://localhost:80/users/1
@Controller
public class UserController {// 定义路径参数@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)@ResponseBody// 从路径参数中取值public String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}
}
@RequestBody @RequestParam @PathVariable 对比:
区别:
@RequestParam用于接收url地址传参或表单传参
@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
应用:
后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
RESTful快速开发
使用RESTful开发, 我们可以发现有许多重复的代码
例如下面代码: 每一个处理器都需要写
value = "/users"
以及@ResponseBody
;
@Controller
public class UserController {@RequestMapping(value = "/users", method = RequestMethod.POST)@ResponseBodypublic String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}@RequestMapping(value = "/users", method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user) {System.out.println("user update..." + user);return "{'module': 'user update'}";}
}
简化一: 将公共的路径提取到处理器所在类上
@Controller
@RequestMapping("/users")
public class UserController {@RequestMapping(method = RequestMethod.POST)@ResponseBodypublic String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}
}
简化二: 将每个处理器都有的@RequestBody注解提取到处理器所在类上
@Controller
@RequestMapping("/users")
@ResponseBody
public class UserController {@RequestMapping(method = RequestMethod.POST)public String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)public String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}
}
简化三: @RestController注解
@RestController等同于@ResponseBody加上@ResponseBody注解组合起来的功能
@RestController
@RequestMapping("/users")
public class UserController {@RequestMapping(method = RequestMethod.POST)public String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)public String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}
}
简化四: 通过@GetMapping @PostMapping @PutMapping @DeleteMapping注解替代method = RequestMethod.XXX
设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求;
默认属性value:请求访问路径
@RestController
@RequestMapping("/users")
public class UserController {// 新增/保存 指定请求行为: POST@PostMappingpublic String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'module': 'user save'}";}// 删除 指定请求行为: DELETE@DeleteMapping("/{id}")public String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'module': 'user delete'}";}// 修改/更新 指定请求行为: PUT@PutMappingpublic String update(@RequestBody User user) {System.out.println("user update..." + user);return "{'module': 'user update'}";}// 查询全部 指定请求行为: GET@GetMappingpublic String selectAll() {System.out.println("user selectAll...");return "{'module': 'user selectAll'}";}// 查询根据id 指定请求行为: GET@GetMapping("/{id}")public String selectById(@PathVariable Integer id) {System.out.println("user selectById..." + id);return "{'module': 'user selectById'}";}
}
相关文章:

SpringMVC - REST风格介绍已经RESTful简化开发
文章目录 RESTREST基本介绍RESTful快速入门RESTful快速开发 REST REST基本介绍 REST (Representational State Transfer), 表现形式状态转换(访问网络资源的风格) 传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user/saveUser REST风格描述形式 …...

Android 10.0 user模式下解除系统进入recovery功能的限制
1.前言 在10.0的系统rom定制化开发中,系统中recovery模式功能也是很重要的一部分,而在原生系统中,对于debug模式的产品,可以通过电源键和音量+键进入recovery模式, 但是在user模式下的产品,对于通过这种方式,进入recovery模式就受限制了,防止用户无操作为了产品安全等…...

用这些 JavaScript 试题来提高你的编程技能
文章目录 一、解释 Promise 的概念和用法。二、解释节流(throttle)和防抖(debounce)在 JavaScript 中的应用场景。三、请列举 JavaScript 中的原始数据类型。四、请解释JavaScript中的作用域。五、写一个名为 multiply 的函数&…...

倾斜摄影超大场景的三维模型在网络发布应用遇到常见的问题浅析
倾斜摄影超大场景的三维模型在网络发布应用遇到常见的问题浅析 倾斜摄影超大场景的三维模型在网络发布应用时,常见的问题包括: 1、加载速度慢。由于数据量巨大,网络发布时需要将数据文件分割成多个小文件进行加载,这可能会导致页…...

基于遗传算法的梯级水电站群优化调度研究(Matlab代码实现)
💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …...

java每日问题
一,什么时聚集索引什么时非聚集索引 聚集索引就是基于主键创建的索引除了主键索引以外的其他索引被称为非聚集索引也叫二级索引由于在innodb引擎里面一张表的数据对应的物理文件本事就是按照B树来组织的一种索引结构而聚集索引就是按照每张表的主键来构建一颗B树然后…...

C++设计模式之 依赖注入模式探索
依赖注入模式 前言依赖注入模式的角色依赖注入模式的UML图依赖注入模式的设计和实现(C)依赖注入和访问者模式的区别依赖注入模式的使用场景依赖注入模式的优缺点结语 前言 GoF设计模式主要关注的是面向对象编程设计的问题,而依赖注入作为一种编程技术,它…...

如何实现Spring AOP以及Spring AOP的实现原理
AOP:面向切面编程,它和OOP(面向对象编程)类似。 AOP组成: 1、切面:定义AOP是针对那个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各种是一个切面。切面是有切点加通知组成的。 2、连接点:所有可…...

数学建模——数据预处理
在数学建模时,经常遇到数据的预处理,那么会有一些什么情况呢,跟着北海老师总结了他的内容~希望对大家有所帮助! 缺失值 比赛提供的数据,发现有些单元格是null或空的缺失太多:例如调查人口信息,发现“年龄…...

第8章:树
1.树是什么 一种分层数据的抽象模型前端工作中常见的树包括:DOM树,级联选择(省市区),树形控件,…javascript中没有树,但是可以用Object和Array构建树 4.树的常用操作:深度/广度优先遍历,先中后…...

Java基础学习(10)
Java基础学习 一、JDK8时间类1.1 Zoneld时区1.2 Instant时间戳1.3 ZonedDateTime1.4 DateTimeFormatter1.5 日历类时间表示1.6 工具类1.7 包装类JDK5提出的新特性Integer成员方法 二、集合进阶2.1 集合的体系结构2.1.1 Collection 2.2collection的遍历方式2.2.1 迭代器遍历2.2.…...

Tomcat多实例部署实验
引言 本文主要内容是tomcat的多实例配置实验。 一、实验准备 Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,互不影响。多实例与虚拟主机不同,虚拟主机的本质是在一个服务下有多个相对独立的目录,但是多实…...

无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...
职场套路多,一不小心就会掉坑,一位网友讲述了自己的遭遇: 今天被领导催促离职了,当时就是这个领导把他从别的公司挖过来。这家公司催得太急,为了投奔这里,他和上家的HR都闹翻了,上家总监挽留他&…...

忙碌中也要记得休息,这两款好玩的游戏推荐给你
第一款:古墓丽影9年度版 《古墓丽影9》(原名Tomb Raider)是由水晶动力开发,史克威尔艾尼克斯发行的动作冒险游戏。 它于 2013 年发布。续集是古墓丽影崛起和古墓丽影暗影。 本作的重点是新版劳拉(Lara Croft…...

四种方法可以实现判断字符串包含某个字符
小编介绍过js中使用indexOf() 方法判断字符串包含某个字是一个很好用的方法,但除了这个方法之外,JavaScript中还有四种方法可以实现判断字符串包含某个字符: 1、使用字符串search() 方法 search() 方法用于检索字符串中指定的子字符串&…...

ubuntu进程相关command
列出当前系统中所有正在运行的进程的详细信息 ps aux查看所有包含某关键字的进程 例:查看所有包含关键字click的进程 ps aux | grep click运行后显示如下信息: root 8998 0.0 0.0 10984 4052 ? S 4月23 0:00 sudo ./bin/click…...

7.参数校验
在controller和service进行前端传参校验,保证存到数据库的数据是正确的 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>这里无需…...

nginx简单介绍
文章目录 1. 下载并解压2. 80端口被占用,更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用,更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…...

美创科技首届渠道高峰论坛| 两大分论坛亮点汇聚
4月22日,美创科技首届渠道高峰论坛在海南三亚隆重举行,本届高峰论坛以“新起点 新战略 共赢数安蓝海”为主题,全国各地200余家合作伙伴齐聚。当日下午,行业分论坛、技术分论坛两大论坛以及圆桌会议,多方视角、全方位共…...

QML中【预计符号】和【Unknown Component M300】的红色警告解决方法
问题描述: QML的项目中带中文,每次打开项目都在问题栏显示【预计符号】的红色警告,还有一种是【Unknown Component M300】的警告,代码能正常编译和运行。像我这样对代码追求优雅的强迫症患者看着很不爽,查了很多网上的…...

聊聊「低代码」的实践之路
区块链、低代码、元宇宙、AI智能; 01 【先来说说背景】 这个概念由来已久,但是在国内兴起,是最近几年; 低代码即「Low-Code」; 指提供可视化开发环境,可以用来创建和管理软件应用; 简单的说…...

(一)服务发现组件 Eureka
1、Eureka 简介 Eureka 是Spring Cloud Netflix 微服务套件中的一部分, 它基于Netflix Eureka 做了二次封装, 主要负责完成微服务架构中的服务治理功能。我们只需通过简单引入依赖和注解配置就能让Spring Boot 构建的微服务应用轻松地与Eureka 服务治理…...

学会笔记本电脑录屏快捷键,轻松实现录屏!
案例:笔记本电脑录屏有快捷键吗? 【我每次打开笔记本电脑录屏都要耗费比较长的时间,这样会影响到我录屏的效率。在这里想问一下,有没有快速打开电脑录屏的方法?】 在日常的工作、学习、娱乐中,我们经常需…...

( “树” 之 Trie) 208. 实现 Trie (前缀树) ——【Leetcode每日一题】
知识点回顾 : Trie,又称前缀树或字典树,用于判断字符串是否存在或者是否具有某种字符串前缀。 ❓208. 实现 Trie (前缀树) 难度:中等 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构ÿ…...

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树
文章目录 整数拆分题解(动态规划)贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n ,将其拆分为…...

设计模式及代码
1、工厂方法模式(Factory Method Pattern): 定义一个用于创建对象的接口,让子类决定实例化哪一个类。应用场景:当一个类不知道它所必须创建的对象的类时;一个类希望由它的子类来指定它所创建的对象时。 抽…...

9.java程序员必知必会类库之加密库
前言 密码学在计算机领域源远流长,应用广泛。当前每时每刻,每一个连接到互联网的终端,手机,电脑,iPad都会和互联网有无数次的数据交互,如果这些数据都是明文传输那将是难以想象的。为了保护用户隐私&#…...

C技能树:for循环:九九乘法表
使用for循环,打印九九乘法表。下列四个选项中有一项无法实现该功能,请找出该错误选项。 #include <stdio.h> int main(int argc, char** argv) {int i 0;int j 0;(_____1_____)return 0; } int row 0; int col 0; for(i 0; i < 8…...

Win10老是蓝屏收集错误信息重启无效怎么办?
Win10老是蓝屏收集错误信息重启无效怎么办?有用户遇到了电脑开机蓝屏的情况,收集错误信息重启电脑之后,依然无法解决问题。那么这个问题要怎么去进行解决呢?接下来我们来看看以下具体的处理方法教学吧。 准备工作: 1、…...

Redis入门学习笔记【五】Redis在分布式环境下常见的应用场景
一、分布式锁 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的操作或者访问。 与之对应有线 程锁,进程锁。 分布式锁可以避免不同进程重复相同的工作,减少资源浪费。 同时分布式锁可以避免破坏数据正 确性的发生, …...