RESTful快速开发

news2024/11/27 20:17:35
(3)RESTful快速开发
  • (2)中的控制器仍然存在大量的冗余代码

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

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

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

  • 解决方案

    • 问题1:将每一个方法路径上的共同路径抽离出来,直接在该控制类的上方直接使用路径前缀@RequestMapper("/users")==》表示当前的类公用此路径

    @RequestMapping("/users")
    public class UserController {
        @RequestMapping(method = RequestMethod.POST)
        @ResponseBody
        public String save(@RequestBody User user) {
            ...
        }
        ...
    }
    • 问题2:根据每一个方法的@RequestMapping属性中的行为动作采取对应的mapping进行取代

    @PostMapping
    public String save(@RequestBody User user) {...}
    ​
    @DeleteMapping("/{id}")
    public String delete(@PathVariable int id) {...}
    ​
    @PutMapping
    public String update(@RequestBody User user) {...}
    ​
    @GetMapping
    public String findUserAll() {...}
    ​
    @GetMapping("/{id}")
    public String findUserById(@PathVariable int id) {...}
    • 问题3:将每一个方法的@ResponseBody抽离到控制类上==》表示该控制类的所有响应均是JSON数据格式

    @Controller
    @RequestMapping("/users")
    @ResponseBody
    public class UserController {
        ...
    }
  • @RestController在控制器类上定义==》@Controller和@ResponseBody的整合,简化书写

@RestController
@RequestMapping("/users")
public class UserController {
    ...
}
(4)RESTful案例
  • 案例需求分析
    • 需求一:图片列表查询,从后台返回数据,将数据展示在页面上

    • 需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印

  • 步骤分析

1.搭建项目导入jar包

2.编写Controller类,提供两个方法,一个用来做列表查询,一个用来做新增

3.在方法上使用RESTful进行路径设置

4.完成请求、参数的接收和结果的响应

5.使用PostMan进行测试

6.将前端页面拷贝到项目中

7.页面发送ajax请求

8.完成页面数据的展示

  • 环境准备
    • 1.创建Maven项目

    • 2.向pom.xml文件中添加springmvc相关依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.19</version>
        </dependency>
        <dependency>
        <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.5</version>
        </dependency>
    </dependencies>
    • 3.创建配置类

    @Configuration
    @ComponentScan("com.rest")
    @EnableWebMvc
    public class SpringMVCConfig {
    }
    ​
    public class ServletContainerInitConfig 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};
        }
    }
    • 4.创建图书实体类

    public class Book {
        private Integer id;
        private String type;
        private String name;
        private String description;
        //setter...getter...toString略
    }
    • 5.创建图书的控制器类

    @Controller
    public class BookController {}
    • 6.创建完成后的项目结构

  • 后台接口开发
    • 1.使用RESTful配置业务接口

    @RestController
    @RequestMapping("/books")
    public class BookController {
        @PostMapping
        public void saveBook(@RequestBody Book book) {
            System.out.println("Book save... book ==> " + book);
            //模拟数据库的数据
            ArrayList<Book> books = new ArrayList<Book>();
            books.add(book);
        }
        @DeleteMapping("/{id}")
        public void deleteBook(@PathVariable int id) {
            System.out.println("Book delete... id ==> " + id);
        }
        @PutMapping
        public void updateBook(@RequestBody Book book) {
            System.out.println("Book update... book ==> " + book);
        }
        @GetMapping
        public List<Book> getAllBook() {
            //模拟数据库的数据
            ArrayList<Book> books = new ArrayList<Book>();
            books.add(new Book(1, "IT", "计算机操作系统", "计算机基础课程"));
            books.add(new Book(2, "IT", "计算机网络", "计算机基础课程"));
            System.out.println("Book find... books ==> " + books);
            return books;
        }
    }
    • 2.测试增加图书信息接口

    • 3.测试删除图书信息接口

    • 4.测试修改图书信息接口

    • 5.测试查询所有图书

  • 将前端代码整合到项目结构中
    • 拷贝静态页面到webapp目录下

    • 访问pages目录下的books.html

    • 运行异常这是由于请求都被SpringMVC拦截处理了,发现控制器没有/pages/books.html这个访问路径对应的处理,因此需要单独处理页面这样的静态资源==》①使用配置类进行过滤静态请求

    @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/");
        }
    }
    • ②在SpringMVCConfig中扫描mvc支持

    @ComponentScan({"com.restfulDemo.controller","com.restfulDemo.config"})
    • 重新访问

  • 在页面中使用Ajax发送异步请求
    • 1.在后台使用静态代码块实现模拟数据库

    static ArrayList<Book> books = new ArrayList<Book>();
    static {
        books.add(new Book(1, "IT", "计算机操作系统", "计算机基础课程"));
        books.add(new Book(2, "IT", "计算机网络", "计算机基础课程"));
    }
    • 2.获取所有图书信息

    getAll() {
        axios.get("/SpringMVC_09_restfulDemo_war/books").then((res)=>{
            this.dataList = res.data;
        });
    }
  • 响应到页面上

    • 2.新增图书信息

    saveBook () {
        axios.post("/SpringMVC_09_restfulDemo_war/books",this.formData).then((res)=>{
    ​
        });
        this.dialogFormVisible = false;//关闭新增弹窗
        this.reload();//定时器刷新页面
    }

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

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

相关文章

万能门店小程序管理系统 doPageGetFormList SQL注入漏洞复现

0x01 产品简介 万能门店小程序管理系统是一款功能强大的工具,旨在为各行业商家提供线上线下融合的全方位解决方案。是一个集成了会员管理和会员营销两大核心功能的综合性平台。它支持多行业使用,通过后台一键切换版本,满足不同行业商家的个性化需求。该系统采用轻量后台,搭…

【作业九】RNN-SRN-Seq2Seq

点击查看作业内容 目录 1 实现SRN &#xff08;1&#xff09;使用numpy实现 &#xff08;2&#xff09;在&#xff08;1&#xff09;的基础上&#xff0c;增加激活函数tanh &#xff08;3&#xff09;使用nn.RNNCell实现 &#xff08;4&#xff09;使用nn.RNN实现 2 使用R…

Emgu (OpenCV)

Emgu Github Emgu 环境&#xff1a; Emgu CV 4.9.0 netframework 4.8 1、下载 libemgucv-windesktop-4.9.0.5494.exe 安装后&#xff0c;找到安装路径下的runtime文件夹复制到c#项目Debug目录下 安装目录 c# Debug目录

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…

澳洲房产市场数据清洗、聚类与可视化综合分析

本项目涉及数据清洗及分析时候的思路&#xff0c;如果仅在CSDN中看&#xff0c;可能会显得有些乱&#xff0c;建议去本人和鲸社区对应的项目中去查看&#xff0c;源代码和数据集都是免费下载的。 声明&#xff1a;本项目的成果可无偿分享&#xff0c;用于学习交流。但请勿用于…

IT服务团队建设与管理

在 IT 服务团队中&#xff0c;需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理&#xff1b;软件工程师专注于软件的开发、测试和维护&#xff1b;运维工程师则保障系统的稳定运行&#xff0c;包括监控、故障排除等。通过清晰地定义每个角色的职责&#xff0…

go-zero(八) 中间件的使用

go-zero 中间件 一、中间件介绍 中间件&#xff08;Middleware&#xff09;是一个在请求和响应处理之间插入的程序或者函数&#xff0c;它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。 1.中间件的核心概念 请求拦截&#xff1a;中间件能够在请求到达目标处理器之…

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…

【eNSP】动态路由协议RIP和OSPF

动态路由RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;和OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是两种常见的动态路由协议&#xff0c;它们各自具有不同的特点和使用场景。本篇会对这两种协…

差分 + 模拟,CF 815A - Karen and Game

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 815A - Karen and Game 二、解题报告 1、思路分析 一个经典的差分数组的…

vue3【实战】响应式的登录界面

效果预览 WEB 端效果 移动端效果 技术方案 vue3 vite Element Plus VueRouter UnoCSS TS vueUse AutoImport 技术要点 响应式设计 移动端&#xff1a;图片切换为绝对定位&#xff0c;下移一层&#xff0c;成为背景图片 <el-imageclass"w-screen h-screen lt-md…

加速科技精彩亮相中国国际半导体博览会IC China 2024

11月18日—20日&#xff0c;第二十一届中国国际半导体博览会&#xff08;IC China 2024&#xff09;在北京国家会议中心顺利举办&#xff0c;加速科技携重磅产品及全系测试解决方案精彩亮相&#xff0c;加速科技创始人兼董事长邬刚受邀在先进封装创新发展论坛与半导体产业前沿与…

php反序列化1_常见php序列化的CTF考题

声明&#xff1a; 以下多内容来自暗月师傅我是通过他的教程来学习记录的&#xff0c;如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考&#xff1a;php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…

RustDesk 搭建

RustDesk 服务端下载&#xff1a;https://github.com/rustdesk/rustdesk-server/releases RustDesk 客户端下载&#xff1a;https://github.com/rustdesk/rustdesk/releases RustDesk 官方部署教程&#xff1a;https://rustdesk.com/docs/zh-cn/ 1&#xff1a;RustDesk 概览# 1…

Qt读写Usb设备的数据

Qt读写Usb设备的数据 问题:要读取usb设备进行通讯&#xff0c;qt好像没有对应的库支持。解决&#xff1a;libusbwindow下载 :Linux下载: QtUsb 开源的第三方库库里面的函数说明&#xff1a;window版本&#xff1a;Linux中也提供的直接下载测试代码&#xff1a;库下载&#xff1…

模板初阶,STL简介(C++)

1.模板 1.1泛型编程 在之前的文章中讲过C支持函数重载&#xff0c;比如实现一个交换函数&#xff0c;可以是不同的数据类型&#xff0c;但是这样&#xff0c;需要增加大量函数&#xff0c;且可维护度比较低。 如&#xff1a; void Swap(int& left, int& right) {int …

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#xff0c;无法连接&#xff0c;需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

2024年11月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年11月22日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

技术文档的高质量翻译对俄罗斯汽车推广的影响

进入新市场需要的不仅仅是一个伟大的产品&#xff1b;它要求深入了解当地消费者的期望、法规和文化差异。对于希望在俄罗斯取得成功的国际汽车制造商来说&#xff0c;技术文件的质量是一个关键因素。手册、规范和服务指南在产品和用户之间形成了直接的桥梁&#xff0c;影响着客…