REST风格 -- SpringMVC入门保姆级教程(四)

news2024/11/25 5:27:54

文章目录

  • 前言
  • 四、REST风格
    • 1.了解REST风格
    • 2.REST风格写法一般步骤
    • 3.REST风格快速开发
    • 4.REST风格中的注解
    • 5. 案例:基于REST风格页面数据交互
  • 总结


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

四、REST风格

1.了解REST风格

  1. REST风格简介

REST (Representational State Transfer) ,表现形式状态转换,是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格;规范了HTTP请求动作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有对应的语义。

  1. REST风格对比传统风格

传统风格资源描述形式:
http://localhost/user/getById?id=1
http://localhost/user/saveUser

对应的REST风格描述形式:
http://localhost/user/1
http://localhost/user

  1. REST风格的优点

1.隐藏资源的访问行为,无法通过地址得知对资源是何种操作
2.书写简化

  1. REST风格增删改查举例

按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
http://localhost/users – 查询全部用户信息 – GET(查询)
http://localhost/users/1 – 查询指定用户信息 – GET(查询)
http://localhost/users – 添加用户信息 POST – (新增/保存)
http://localhost/users – 修改用户信息 – PUT(修改/更新)
http://localhost/users/1 – 删除用户信息 – DELETE (删除)

描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如: users、books、accounts。上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范

2.REST风格写法一般步骤

  1. 设定http请求动作作(动词)

在这里插入图片描述

  1. 设定请求参数(路径变量)

在这里插入图片描述

3.REST风格快速开发

//@Controller

//@ResponseBody配置在类上可以简化配置,表示设置当前每个方法的返回值都作为响应体
//@ResponseBody

//使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RestController     
@RequestMapping("/books")
public class BookController {

//  使用@PostMapping简化Post请求方法对应的映射配置
//  @RequestMapping( method = RequestMethod.POST)
    @PostMapping        
    public String save(@RequestBody Book book){
        System.out.println("book save..." + book);
        return "{'module':'book save'}";
    }


//  使用@DeleteMapping简化DELETE请求方法对应的映射配置
//  @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")    
    public String delete(@PathVariable Integer id){
        System.out.println("book delete..." + id);
        return "{'module':'book delete'}";
    }
    
//  使用@PutMapping简化Put请求方法对应的映射配置
//  @RequestMapping(method = RequestMethod.PUT)
    @PutMapping        
    public String update(@RequestBody Book book){
        System.out.println("book update..."+book);
        return "{'module':'book update'}";
    }
    
//  使用@GetMapping简化GET请求方法对应的映射配置
//  @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)
    @GetMapping("/{id}")   
    public String getById(@PathVariable Integer id){
        System.out.println("book getById..."+id);
        return "{'module':'book getById'}";
    }

//  使用@GetMapping简化GET请求方法对应的映射配置
//  @RequestMapping(method = RequestMethod.GET)
    @GetMapping            
    public String getAll(){
        System.out.println("book getAll...");
        return "{'module':'book getAll'}";
    }
}

4.REST风格中的注解

  1. @RequestMapping

1.名称:@RequestMapping
2.类型:方法注解
3.位置:SpringMVC控制器方法定义上方
4.作用:设置当前控制器方法请求访问路径
5.属性:
value (默认) :请求访问路径
method: http请求动作,标准动作 (GET/POST/PUT/DELETE)
6.范例:

在这里插入图片描述

  1. @PathVariable

1.名称:@PathVariable
2.类型:形参注解
3.位置:SpringMVC控制器方法形参定义前面
4.作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
5.范例:

在这里插入图片描述

  1. @RequestBody、@RequestParam、@PathVariable 的区别与应用

区别
1.@RequestParam用于接收ur1地址传参或表单传参
2.@RequestBody用于接收ison数据
3.@PathVariable用于接收路径参数,使用(参数名称}描述路径参数

应用
1.后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
2.如果发送非ison格式数据,选用@RequestParam接收请求参数
3.采用RESTful进行开发,当参数数量较少时,例如1个,可以采用Pathvariable接收请求路径变量,通常用于传递id值

  1. @RestController

1.名称:@RestController
2.类型:类注解
3.位置:基于springMVC的RESTful开发控制器类定义上方
4.作用:设置当前控制器类为RESTful风格,等同于@Controller@ResponseBody
5.两个注解组合功能
6.范例:

在这里插入图片描述

  1. @GetMapping 、@PostMapping 、@PutMapping 、@DeleteMapping

1.名称:@GetMapping @PostMapping @PutMapping @DeleteMapping
2.类型:方法注解
3.位置:基于SpringMVC的RESTfu1开发控制器方法定义上方
4.作用:设置当前控制器方法请求访问路径与请求动作,每种对应下个请求动作
5.例如:@GetMapping对应GET请求
6.属性value (默认) :请求访问路径
7.范例:

在这里插入图片描述

5. 案例:基于REST风格页面数据交互

  1. 案例需求:点击新建按钮后台对应方法能运行和保存模拟数据后前台能显示

在这里插入图片描述

在这里插入图片描述
2. 编码环境准备

  • 创建maven模块,选择webapp开发模板(Archetype)

在这里插入图片描述

  • 右键打开模块设置,创建一个目录java,标记为Source源码,并将Language level等级设置成8

在这里插入图片描述

  • 在pom.xml中导入坐标
<!--servlet技术支持-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    
<!--springmvc技术支持-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    
<!--json转换技术支持-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
<!--tomcat服务器-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
  • SpringMvc 全局配置
@Configuration
@ComponentScan({"org.example.controller"})
@EnableWebMvc
public class SpringMvcConfig {
}
  • 容器初始化和中文乱码过滤
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[]{"/"};
    }

    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

  • 实体类book
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}
    
  • 相关模块控制器BookController
@RestController
public class BookController {

}

  • 文件结构参考

在这里插入图片描述

  1. 用REST风格编写book模块控制器类,编写保存和查询功能

不涉及数据库,用模拟数据代替

@RestController
@RequestMapping("/books")
public class BookController {

    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save ==> "+ book);
        return "{'module':'book save success'}";
    }

    @GetMapping
    public 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;
    }

}

  1. postman接口示例
  • 查全部

在这里插入图片描述

在这里插入图片描述

  • 保存图书

在这里插入图片描述
在这里插入图片描述

  1. 编写前端页面(详情见个人主页资源代码)
  • 前端页面文件结构示例

在这里插入图片描述

  1. 配置拦截器,放行tomcat负责的路径(前端)
  • 重启服务器,访问book.html

在这里插入图片描述

报错原因分析:SpringMVC拦截了所有请求

在这里插入图片描述

  • 配置放行路径
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
    @Override
    protected 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/");
    }
}

  • SpringMVC配置类扫描新配置的放行路径配置类 SpringMvcSupport
@Configuration
@ComponentScan({"org.example.controller","org.example.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
  • 刷新页面

在这里插入图片描述
7. 新增模拟数据前台能显示

在这里插入图片描述

  1. 前端页面通过异步提交访问后台控制器
  • 新建按钮

在这里插入图片描述

  • book.html中的js部分
    在这里插入图片描述

  • 点击新建按钮

在这里插入图片描述

在这里插入图片描述

  1. 新增模拟数据前台能读取
  • BookController中的查询方法手动添加模拟数据
    在这里插入图片描述
  • 重启服务器

在这里插入图片描述

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下作者,后续还会更新mybatis, springboot,maven高级,微信小程序,等前后端内容的学习笔记。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

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

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

相关文章

Redis高级篇 - 分布式缓存

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c…

iPad触屏笔哪个牌子好用?Apple Pencil的平替笔

从无纸化的广泛使用&#xff0c;电容笔成为无纸化中不可替代的一部分。但由于原装电容笔的昂贵&#xff0c;市面上的电容笔品牌众多&#xff0c;不知如何下手&#xff0c;今天给大家推荐几款好用又平价的Apple Pencil平替笔。顺便给不知道如何挑选电容笔的小伙伴科普一下电容笔…

车载网络测试 - CANCANFD - 基础篇_02

目录 七、与CAN总线相关的标准 1、ISO 11898,ISO16845 2、SAE J1939,ISO 11783,NMEA 2000,CANopen 3、ISO15765/ISO14229 4、ISO 17356/OSEK 5、CCP(CAN Calibration Protocol) 6、GMLAN,VWTP,FNOS,DCNet,MCNet 八、CAN总线的特点 九、CAN总线基本概念 七、与CAN总线相…

机器学习-4 决策树算法

决策树算法 算法概述分类算法与分类器决策树算法树模型决策树的原理决策树算法的关键决策树构造的基本思路 算法基本思想决策树的训练与测试三种经典的决策树生成算法基于信息增益的ID3算法基于信息增益率的C4.5算法C4.5算法C5.0算法 基于基尼系数的CART算法 算法流程算法关键问…

chatgpt赋能python:Python中的包

Python中的包 对于使用Python进行编程的开发者来说&#xff0c;包是一个非常重要的概念。包可以看作是一个包含了多个模块的文件夹&#xff0c;这些模块可以在代码中使用。通过使用Python中的包&#xff0c;开发者可以使代码更加模块化&#xff0c;提高代码的可维护性和可读性…

Emacs之git操作(一百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Apache Impala(1):Impala简介

1 Impala 基本介绍 impala 是 cloudera 提供的一款高效率的 sql 查询工具&#xff0c;提供实时的查询效果&#xff0c;官方测试性能比 hive 快 10 到 100 倍&#xff0c;其 sql 查询比 sparkSQL 还要更加快速&#xff0c;号称是当前大数据领域最快的查询 sql 工具&#xff0c…

小主机折腾记13

这个月折腾的事比较多&#xff0c;记个流水账 1.600g2mt加装wifi模块&#xff1b; 买了ngff转pcie的转接卡&#xff0c;发现竟然不能原生支持蓝牙&#xff0c;需要额外接一个4pin转9针usb的线&#xff0c;600g2mt是没有那种通用的usb9针口的…… 而内建蓝牙的转接卡网上也有卖&…

【项目】ROS下使用N100模块

本文主要记录如何使用WHEELTEC N100 模块。 之前的版本是CP2102串口芯片&#xff0c;而2022年5月之后的N100采用的是CH9102串口芯片。 一、修改串口号&#xff1a; 工具&#xff1a;链接&#xff1a;https://pan.baidu.com/s/13Pdq45_Z0ZRwuaNN0I84Cg 提取码&#xff1a;i6j…

《深入理解计算机系统(CSAPP)》第6章 存储器层次结构 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

【计算机网络详解】——应用层(学习笔记)

&#x1f4d6; 前言&#xff1a;应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。在本文中&#xff0c;我们以一些经典的网络应用为例来学习有关网络应用的原理、协议和实现方面的知识。 目录 &a…

华为OD机试真题B卷 Java 实现【快速寻找某字符】,附详细解题思路

一、题目描述 给定一个一个目标值 target和一个 元素升序的无重复数字字符串 &#xff0c;写一个函数搜索 字符串 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 二、输入描述 第一行输入一个目标值target…

在Centos Stream 9上Docker的实操教程(三) - Docker容器数据卷

在Centos Stream 9上Docker的实操教程 - Docker容器数据卷 问题场景Docker容器数据卷简单介绍数据卷使用操作实例安装redis验证配置文件生效验证数据是否丢失 结语 问题场景 Docker容器我们可以理解就是微型的linux系统&#xff0c;在使用容器的时候自然会产生一系列数据文件&…

基于SpringBoot+Vue的儿童书法机构管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 儿童书法机构的管理是…

代码随想录算法训练营第四十二天 | 二维dp数组01背包, 力扣 416. 分割等和子集

背包 解析 1.确定dp数组以及下标的含义 对于背包问题&#xff0c;有一种写法&#xff0c; 是使用二维数组&#xff0c;即dp[i][j] 表示从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少。 2.确定递推公式 有两个方向推出来dp[i][…

跨境电商app开发搭建多语言商城后的运营技巧,一件了解电子商城及运营

跨境电商APP包含&#xff1a;买家端手机H5版本, 电脑Pc网页版本, 安卓苹果App。 一、模式介绍 如需要探讨&#xff0c;请kan 名片。 无货源模式&#xff1a;电商平台上的卖家不需要自己拥有实体的库存&#xff0c;而是通过与供应链服务提供商合作&#xff0c;将订单和支付…

ai写作软件怎么写文章?这篇文章介绍三个好方法

在人工智能技术的迅速发展下&#xff0c;ai写作成为创作领域的一项炙手可热的新技术。随着越来越多的创作者开始借助ai写作工具&#xff0c;ai写作逐渐引起了广泛的关注。ai写作是指利用人工智能技术和自然语言处理算法&#xff0c;为创作者提供文章的初版。不过有很多小伙伴对…

Linux用户权限管理

目录 一 权限定义 二 权限表示法 2.1 数字表示法 2.2 文字表示法 三 更改权限 四 权限ACL配置 五 特殊权限 5.1特殊权限SUID 5.2 特殊权限SGID 5.3 特殊权限Sticky 5.4 linux改变拥有者 一 权限定义 通过ll命令查看&#xff0c;然后摘出来一条分析&#xff1a; d …

PHPMySQL基础(二):通过PHP对MySQL进行增、删、改、查

PHP&MySQL基础&#xff08;一&#xff09;:创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 前面创建了一个数据库和表&#xff0c;并且用 mysqli()实例化了一个连接对象$link 这篇记一下怎么用实例化对象去对表进行一个增删改查操作 目录 一、连接数据库&#xf…

AcWing第 105 场周赛

AcWing 5029. 极值数量 给定一个长度为 n&#xfffd; 的整数数组 a1,a2,…,an&#xfffd;1,&#xfffd;2,…,&#xfffd;&#xfffd;。 如果一个元素左右两边均有相邻元素&#xff08;也就是不位于数组的两端&#xff09;&#xff0c;且满足以下两个条件之一&#xff1a…