Spring MVC中的REST风格

文章目录

    • REST风格
      • 1 REST简介
        • 问题导入
        • 1.1 REST介绍
        • 1.2 RESTful介绍
        • 1.3 注意事项
      • 2 RESTful入门案例
        • 问题导入
        • 2.1 快速入门
        • 2.2 @PathVariable介绍
        • 2.3 @RequestBody、@RequestParam、@PathVariable区别和应用
      • 3 REST快速开发【重点】
        • 3.1 代码中的问题
        • 3.2 Rest快速开发
      • 4案例:基于RESTful页面数据交互
        • 4.1 案例效果和环境准备
          • 4.1.1 案例效果
          • 4.1.2 环境准备
        • 4.2 代码实现
          • 4.2.1 制作SpringMVC控制器,并通过PostMan测试接口功能
          • 4.2.2 设置对静态资源的访问放行
          • 4.2.3 前端页面通过异步提交访问后台控制器

REST风格

1 REST简介

问题导入

Rest风格使用了几种请求方式定义访问行为?

答:四种,GET,POST,PUT,DELETE

1.1 REST介绍
  • REST(Representational State Transfer),表现形式状态转换
    • 传统风格资源描述形式
      http://localhost/user/getById?id=1
      http://localhost/user/saveUser
    • REST风格描述形式
      http://localhost/user/1
      http://localhost/user
  • 优点:
    • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
    • 书写简化
1.2 RESTful介绍
  • 按照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
1.3 注意事项
  • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
  • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts……

2 RESTful入门案例

问题导入

Rest风格如何通过路径传递参数?

2.1 快速入门

做法:在Controller中定义方法时设定"http请求动作(请求方式)“和"设定请求参数(路径变量)”

@Controller
public class UserController {//设置当前请求方法为POST,表示REST风格中的添加操作@RequestMapping(value = "/users",method = RequestMethod.POST)@ResponseBodypublic String save(){System.out.println("user save...");return "{'module':'user save'}";}//设置当前请求方法为DELETE,表示REST风格中的删除操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("user delete..." + id);return "{'module':'user delete'}";}//设置当前请求方法为PUT,表示REST风格中的修改操作@RequestMapping(value = "/users",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update..."+user);return "{'module':'user update'}";}//设置当前请求方法为GET,表示REST风格中的查询操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("user getById..."+id);return "{'module':'user getById'}";}//设置当前请求方法为GET,表示REST风格中的查询操作@RequestMapping(value = "/users",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("user getAll...");return "{'module':'user getAll'}";}
}
2.2 @PathVariable介绍
  • 名称:@PathVariable
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

image-20210805120253164

2.3 @RequestBody、@RequestParam、@PathVariable区别和应用
  • 区别
    @RequestParam用于接收url地址传参或表单传参
    @RequestBody用于接收json数据
    @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
  • 应用
    后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
    如果发送非json格式数据,选用@RequestParam接收请求参数
    采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

3 REST快速开发【重点】

3.1 代码中的问题

image-20210805132351738

以上截图中的代码和我们之前写的UserController中的方法类似,其中图中两个方法都有三处是有问题的,可以进行优化。存在的问题如下:

问题1:每个方法的@RequestMapping注解中都定义了访问路径/books,重复性太高。

问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高。

问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高。

3.2 Rest快速开发

解决以上三个问题

解决问题1:在Controller类上使用@RequestMapping定义共同的访问路径。

@Controller
@RequestMapping("/books")
public class BookController {@RequestMapping(method = RequestMethod.POST)public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}@RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}@RequestMapping(method = RequestMethod.PUT)public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}@RequestMapping(value = "/{id}" ,method = RequestMethod.GET)public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}@RequestMapping(method = RequestMethod.GET)public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}

解决问题2:使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替@RequestMapping(method=RequestMethod.XXX)

@Controller   
@RequestMapping("/books")
public class BookController {//    @RequestMapping( method = RequestMethod.POST)@PostMapping//使用@PostMapping简化Post请求方法对应的映射配置public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}//    @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)@DeleteMapping("/{id}")  //使用@DeleteMapping简化DELETE请求方法对应的映射配置public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}//    @RequestMapping(method = RequestMethod.PUT)@PutMapping   //使用@PutMapping简化Put请求方法对应的映射配置public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}//    @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)@GetMapping("/{id}")    //使用@GetMapping简化GET请求方法对应的映射配置public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}//    @RequestMapping(method = RequestMethod.GET)@GetMapping      //使用@GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}
  • 名称:@GetMapping @PostMapping @PutMapping @DeleteMapping
  • 类型:方法注解
  • 位置:基于SpringMVC的RESTful开发控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
  • 属性:
    value(默认):请求访问路径

解决问题3:在Controller类上使用@RestController注解,等同于@Controller与@ResponseBody两个注解组合功能

@RestController     //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {//方法省略了没写
}
  • 名称:@RestController
  • 类型:类注解
  • 位置:基于SpringMVC的RESTful开发控制器类定义上方
  • 作用:设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能

4案例:基于RESTful页面数据交互

4.1 案例效果和环境准备
4.1.1 案例效果

image-20210805140535262

4.1.2 环境准备
//POJO实体类
public class Book {private Integer id;private String type;private String name;private String description;//同学们自己重写getter、setter、toString()方法...
}//SpringMVC容器初始化类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}//SpringMVC配置类
@Configuration
@ComponentScan({"com.nuage.controller","com.nuage.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
4.2 代码实现
4.2.1 制作SpringMVC控制器,并通过PostMan测试接口功能
@RestController
@RequestMapping("/books")
public class BookController {@PostMappingpublic String save(@RequestBody Book book){System.out.println("book save ==> "+ book);return "{'module':'book save success'}";}@GetMappingpublic List<Book> getAll(){System.out.println("book getAll is running ...");List<Book> bookList = new ArrayList<Book>();Book book1 = new Book();book1.setType("计算机");book1.setName("SpringMVC入门教程");book1.setDescription("小试牛刀");bookList.add(book1);Book book2 = new Book();book2.setType("计算机");book2.setName("SpringMVC实战教程");book2.setDescription("一代宗师");bookList.add(book2);Book book3 = new Book();book3.setType("计算机丛书");book3.setName("SpringMVC实战教程进阶");book3.setDescription("一代宗师呕心创作");bookList.add(book3);return bookList;}
}

4.2.2 设置对静态资源的访问放行
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问/pages/????时候,从/pages目录下查找内容registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");        		registry.addResourceHandler("/css/**").addResourceLocations("/css/");       registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}
4.2.3 前端页面通过异步提交访问后台控制器
//添加
saveBook () {axios.post("/books",this.formData).then((res)=>{});
},
//主页列表查询
getAll() {axios.get("/books").then((res)=>{this.dataList = res.data;});
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua 函数前的冒号和点号,你知道他们的区别吗?

1. 函数前的冒号和点号 点号&#xff08;.&#xff09;和冒号&#xff08;:&#xff09;的区别主要在于是否自动处理self参数。 在Lua中&#xff0c;函数定义时前面有点号&#xff08;.&#xff09;和冒号&#xff08;:&#xff09;的区别主要体现在函数如何处理其第一个参数…

【node】模块化与包(二)

1、模块化的基本概念 模块化是指解决一个复杂的问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 &#xff08;1&#xff09;模块化的优点 遵循固定规则&#xff0c;把大文件拆分成对立并相互依赖…

springboot3 打包报错32-bit architecture x86 unsupported或者 returned non-zero result

springboot3 打包异常情况处理记录 在测试springboot3 native打包时候遇到的异常&#xff0c;百度和谷歌上方法都无法解决我的问题&#xff0c;最后记录一下我最后的原因和解决方案。 前置要求&#xff1a;自己处理好vs的相关内容后 报错一&#xff1a; [1/7] Initializing…

升级版本彻底解决bootstrap-table-fixed-columns固定列后行对不齐问题

升级到bootstrap-table和bootstrap-table-fixed-columns版本都升级到v1.22.3版本以上&#xff0c;即可解决该问题 bootstrap-table&#xff1a;bootstrap-table/dist/bootstrap-table.min.css at develop wenzhixin/bootstrap-table GitHub bootstrap-table-fixed-columns&…

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

浅谈 前端的动态绑定属性

目录 前言1. 基本知识2. Demo 前言 作为Java开发者&#xff0c;从开发转到全栈&#xff0c;前端好些细节都需要科普&#xff0c;这不就来个动态绑定属性 起因是这个&#xff1a; <uni-tr> <uni-td align"center" :rowspan"checkTypesCount 1"…

SSM 整合使用 @PropertySource 问题

SSM 整合使用 PropertySource 问题 如果你想将数据库连接的相关属性移入一个 classpath 下的 “.properties” 文件中&#xff0c;让后再在上述配置类中结合 PropertySource 和 Value 来加载 .properties 配置文件&#xff0c;引入相关属性值&#xff0c;那么&#xff0c;你会…

跨境电子商务支付与结算的支撑系统

​1、跨境电子商务支付与结算的核心系统。 核心系统是用户执行跨境电子商务支付的核心模块&#xff0c;包括以下具体流程。 ​ ​①用户从跨境电子商务支付应用启动跨境电子商务支付流程。 ②跨境电子商务支付应用根据应用和用户选择的支付工具&#xff0c;来调用对应的支付产…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

SkyEye:助力飞行器状态控制系统仿真

飞行器与常见的航天器一样&#xff0c;属于安全关键领域的大型复杂设备&#xff0c;对安全性、可靠性有着极高的要求。为保证稳定飞行&#xff0c;需要对目标对象进行实时跟踪&#xff0c;通过发出正确的修正偏差指令来操纵飞行器改变飞行姿态&#xff0c;因此对飞行器状态控制…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

ISIS单区域实验简述

ISIS 中间系统到中间系统&#xff0c;也是链路状态协议&#xff0c;工作在数据链路层&#xff0c;不依赖IP地址&#xff1b;与OSPF一样采用最短路径SPF算法&#xff0c;收敛速度快。 实验基础配置&#xff1a; r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 cat /root/..kube/config 查看秘钥 -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIBAgIIGOkRkIVlo74wDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE AxMKa3ViZXJuZXRlczAeFw0yNDAyMDgwNjAwMjdaFw…

王庆:当下股市过于悲观,A股、港股基本完成补跌和普跌过程,逆向布局时机已到

核心观点&#xff1a; 1、房地产对中国经济增长拖累最严重的时期正在过去...密切关注真正拐点的出现。 2、当前资本市场从价格表现上来讲&#xff0c;表现的远远超过了基本面所决定的悲观程度。 由于当前资本市场过于悲观&#xff0c;那么反过来就是孕育着机会。 3、我们判…

模型的参数量、计算量、延时等的关系

模型的参数量、计算量、延时等的关系 基本概念相互关系代码计算 基本概念 1.参数量&#xff1a;Params 2.计算量&#xff1a;FLOPs&#xff0c;Floating Point Operations&#xff0c;浮点运算次数&#xff0c;用来衡量模型计算复杂度。 3.延时&#xff1a;Latency 4.内存访问…

快速排序 刷题笔记

思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…

10个必知必会的SQL聚合函数

掌握十大必备的SQL聚合函数&#xff0c;助你成为数据分析高手&#xff01; 目录 掌握十大必备的SQL聚合函数&#xff0c;助你成为数据分析高手&#xff01;1. COUNT()&#xff1a;计算表中行的数量2. SUM()&#xff1a;计算表中某个数值列的总和3. AVG()&#xff1a;计算表中某…

隐马尔可夫模型(HMM) |暴力算法 |一个简单的例子说清计算过程 |一般步骤总结

如是我闻: 本文通过一个简单的例子来详细说明隐马尔可夫模型(HMM)的暴力算法 我们求解的问题是&#xff1a;给定模型及观测序列计算其出现的概率。 隐马尔可夫模型由三个主要部分组成&#xff1a; 隐藏状态集合观测状态集合以及三个概率矩阵&#xff08;状态转移概率矩阵、观…

24计算机考研调剂 | 中科院(深圳)

2024中科院深圳方鹏课题组考研调剂招生信息发布&#xff08;0854电子/计算机/生医工/0856材料&#xff09; 考研调剂招生信息 学校:中科院 专业:工学->电子科学与技术 年级:2024 招生人数:3 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP…

window安装Docker

Windows上安装Docker 安装Docker的大体上的步骤 需要打开hyper-v 为什么要打开Hyper-v&#xff1f; 在Windows 10上安装Docker需要打开Hyper-V&#xff0c;主要是因为Docker上的Windows容器可以在两种不同的运行时隔离模式下运行&#xff1a;进程隔离和Hyper-V隔离。尽管在未使…