Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述

记录时间 [2024-10-23]

本文是一个基于 Spring Boot 3 + MybatisPlus 的项目实战开发,主要涵盖以下几个方面:

  • 从零开始的项目创建
  • IDEA 中开发环境的热部署
  • MavenSwagger3MybatisPlus 等的配置
  • 路由映射知识
  • 静态资源访问
  • 文件上传功能实现
  • 拦截器的配置

通过此次开发练习,我们能对 MVC 架构有一个简单的了解,会使用 Spring Boot 框架进行 Java 项目的开发,感受前后端之间是如何传递信息的。可以说,这个项目相当于一个后端基础模板,在此基础上我们可以按照需求进一步开发,若搭配 Vue 进行前端开发,便可以搭建出一个简单的前后端分离系统。

考虑到篇幅的问题,将分成两篇文章写,此为上篇。


二、开发环境搭建

1. 开发工具

此项目需要使用的开发工具如下,各种工具通过官网安装,读者可进行参考:

  • Windows 11 - 笔记本的系统
  • JDK 17 - springboot3.0 以上最低支持的 jdk 版本,官网下载
  • Intellij IDEA 2021.2.2 - 编写 Java 代码的开发工具
  • MySQL 5.7.43 - 本地数据库
  • Navicat 16.0 - 数据库查看 / 测试工具
  • Postman - API 接口测试工具
  • Notepad++ - 文本修改工具,会标记代码颜色

2. 配置 JDK

Java 开发环境(JDK)搭建,参考文章 - Java 开发环境搭建

(使用 IDEA 开发不需要配置系统环境变量,下载解压就行)


3. 配置 Maven

参考文章 - Maven 在 IDEA 中的配置与使用


三、创建 springboot3.0 项目

Spring Boot 项目可以通过官网创建,IDEA 集成了 Spring 官网创建项目的方式,因此,使用 IDEA 创建 Spring Boot 项目在本质上也是通过官网提供的服务 URL 创建的。

1. 新建项目 Spring Initializr

创建路径:File ==> New ==> New Project

使用 IDEA 创建 Spring Initializr 项目,开发语言选择 Java,以 Maven 的方式管理项目。

SDKJava 版本选择刚才下载的 17 版本,同时选择以 jar 包的形式对项目进行打包。

然后点击 Next 继续操作。

在这里插入图片描述


2. 添加 Web 依赖

在这里我们选择 Spring Boot 的版本在 3.0 以上。

与 2.0 版本相比,3.0 版本是一次较大的升级,造成了很多不兼容更新。例如最低兼容的 Java 版本为 17,底层也切换到了 Spring 6,Swagger 的配置也有很大的不同。

然后,勾选 Web 依赖,Spring Boot 项目会内置 Tomcat,自动完成一些 xml 的相关配置。

最后点击 Finish,完成创建。

在这里插入图片描述


3. 编码设置

设置项目的编码为 UTF-8,以防出现中文乱码的情况。

直接搜索 File Encodings 进行查找。

在这里插入图片描述


4. 开发环境热部署

在实际的项目开发调试过程中,我们会频繁地修改后台类文件,导致项目需要重新编译重新启动,整个过程非常麻烦,影响开发效率。

解决办法:设置 Spring Boot 开发环境热部署。

当 IDEA 监测到主程序中的内容发生改变后,会自动对项目进行编译和重启,此方法可以带来些许便利。

  • 使用 Spring Boot 提供的组件:spring-boot-devtools
  • 在 IDEA 中进行相应的设置

添加 Maven 依赖

在 pom.xml 文件中添加 dev-tools 依赖

<!-- 使用 optional=true 表示依赖不会传递,即该项目依赖 devtools;其他项目如果引入此项目生成的 JAR 包,则不会包含 devtools -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>

修改配置文件

在 application.properties 中配置 dev-tools

# 设置热部署生效
spring.devtools.restart.enabled=true# 设置重启目录
spring.devtools.restart.additional-paths=src/main/java# 设置 classpath 目录下的 WEB-INF 文件夹内容修改不重启
# spring.devtools.restart.exclude=static/**

修改 IDEA 的设置

修改路径:File ==> Settings ==> Build ==> Compiler

勾选 Build project automatically,点击 Apply 进行应用,使其能自动编译构建项目。

在这里插入图片描述


同时勾选上 auto-make,点击 Apply 进行应用,确保热部署配置成功。

修改路径:File ==> Settings ==> Advanced Settings ==> Compiler

在这里插入图片描述


5. 运行主程序

找到 Spring Boot 项目的主程序入口,后缀名为 xxxApplication,点击运行即可启动整个项目。

在这里插入图片描述


四、接收 / 处理 HTTP 请求

1. 控制器 @RestController

Spring Boot 中提供了两种注解来标识控制器的类负责接收和处理 HTTP 请求,分别是 @Controller@RestController

  • @Controller:返回页面和数据;
  • @RestController:只返回数据,默认情况下,该注解会将返回的对象数据转换成 JSON 格式

在前后端分离模式中,一般由前端发送 HTTP 请求给后端,后端响应请求并返回数据,故使用 @RestController 注解。

com.example.demo 目录下新建 package controller,这个包下面放的是控制器类添加上相应的注解后,可以接收和处理 HTTP 请求。


2. 路由映射 @RequestMapping

路由映射指的是后端(服务端)规定前端以何种方式发送请求。后端的控制类中的一个方法对应一种请求方式

或者说是后端给前端规定了一条路径,通过这条路径,前端发送的消息才能被后端接收到。

这条路径会写在注解 @RequestMapping 中。

  • @RequestMapping 可以写在控制类或者具体的方法中,也可以两个地方都写,整体的路径就是两个拼接起来。如请求 hello1 方法的整体路由为 http://localhost:后端端口号/hello/hello1
  • 当注解中只有一个路径参数时,可以省略变量名 value,但如果还有其他的参数,就不可以省略。
// 以下是一个控制类
@RestController
@RequestMapping("/hello")
public class HelloController {@RequestMapping (value = "/hello1")public String hello1() {return "hello "}
}

  • HTTP 请求的类型多样,如 GetPost 等,在注解中可以规定请求的类型。如果后端规定了请求的类型,那么前端要发送相应类型的请求
  • 后端有两种方式规定请求的类型。
    • 第一种,修改注解,如 Get 请求,就把注解修改成 @GetMapping,以此类推还有 @PostMapping@PutMapping 等。
    • 第二种,在注解中用 method 参数进行标识。
// 以下是一个控制类
@RestController
@RequestMapping("/hello")
public class HelloController {// 这是一个 get 请求@RequestMapping (value = "/hello1",method = RequestMethod.GET)public String hello1() {return "hello "}// 这是一个 post 请求@PostMapping("/hello2")public String hello2() {return "login OK";}}

3. 测试工具 Postman

浏览器只能发送简单的 Get 请求,其他请求可以通过测试工具 Postman 进行测试。

在这里插入图片描述


4. 参数传递

前端在发送请求时,可以在请求中添加一些参数,这些参数会一起发送给后端。

后端通过某种方式可以获取这些参数。

方式一(Query Params)

  • 前端直接把参数写在请求路径上,格式为 参数名=参数内容,如果有多个参数,则使用 & 字符进行拼接。如 http://localhost:8080/hello?nickname=zhangsan&phone=123
  • 后端可以在方法中添加参数类型,来接收参数,如 hello(String nickname, String phone)
  • 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容。
  • 这里的参数传递不是必须的,如果前端没传参数,但是后端设置了接收,则参数的内容为默认的(String 类型为 null)。
// 测试用 http://localhost:8080/hello
// 测试用 http://localhost:8080/hello?nickname=zhangsan&phone=123
@GetMapping("/hello")
public String hello(String nickname, String phone) {// 参数传递// 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容System.out.println(phone);return "hello " + nickname;
}

  • 当请求中的参数名称与方法中的参数名称不一致时,后端不会自动识别参数内容,需要添加参数映射
  • 参数映射使用注解 @RequestParam 来实现,作用是把这两个参数名称对应起来。如请求中的参数名称为 nickname,方法中的参数名称为 name,则需要映射 @RequestParam(value = "nickname") String name
  • 默认情况下,用了参数映射,则这个参数必须传递。解决方式是更改 required = false
// 参数映射
// 当加了参数映射,参数必须传递,否则报错 (除非加参数 required = false)
// 不加映射,值可为空
@RequestMapping (value = "/hello1",method = RequestMethod.GET)
public String hello1(@RequestParam(value = "nickname",required = false) String name) {// 参数传递// 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容// 不一致时,添加参数映射System.out.println("hello1....");return "hello " + name;
}


参考测试

先确定路由映射的路径,方法,需要传递的参数。

在这里插入图片描述


方式二(动态获取)

  • 这种方式一般搭配 RESTful API 使用。
  • 将请求 URL 中的模板变量映射到方法参数上,@GetMapping 中写请求路径,需要传递的参数用大括号包裹,如 /user/{id},这表示前端要传递的参数是 id = 10,前端的写法是 http://localhost:8080/user/10
  • 后端想要获取这个参数值,需要在对应的参数前加注解 @PathVariable
// 动态方式获取 {id},需要添加注解 @PathVariable
@GetMapping("/user/{id}")
public String getUserById(@PathVariable int id) {return "根据 ID 获取用户信息:" + id;
}

参考测试

先确定路由映射的路径,方法,需要传递的参数。

在这里插入图片描述


方式三(请求体 Body + 封装类)

  • 当请求传递的参数数量较多时,可以将参数封装到实体类中。
  • 在 Spring Boot 项目中编写一个 User 实体类,里面有两个参数 usernamepassword,给它们生成 Getter / Setter + toString() 方法。
// 用于封装参数的实体类
public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

  • 前端要传递的参数就是 User 类中的这两个参数 usernamepassword,注意名字不要写错
  • 后端会自动把这些参数封装到 user 对象中去。
// 把对象封装到类里,注意参数名称相同
@PostMapping("/hello2")
public String hello2(User user) {System.out.println(user.toString());return "login OK" + user.getUsername();
}

  • 如果前端用 JSON 格式请求,则对象前需要加上请求体 @RequestBody
  • 注意 JSON 格式的参数是有数据类型的,如,用双引号表示的是字符串类 "zhangsan",对应 User 类中的参数类型 String
// 如果前端用 JSON 格式请求,则对象前需要加上请求体 @RequestBody
@PostMapping("/hello3")
public String hello3(@RequestBody User user) {System.out.println(user.toString());return "login OK" + user.getUsername();
}


参考测试

先确定路由映射的路径,方法,需要传递的参数。

在这里插入图片描述


前端用 JSON 格式请求

在这里插入图片描述


方式四(通配符)

  • 浅看一下
// 通配符请求
// * 一个目录  http://localhost:8080/text/*
// ** 多个目录 http://localhost:8080/text/**/****
@GetMapping("/text/**")
public String text() {return "通配符请求";
}

参考资料

参考学习视频 - SpringBoot + Vue 全栈开发:https://www.bilibili.com/video/BV1nV4y1s7ZN/

参考文章 - Java 开发环境搭建:https://blog.csdn.net/Sareur_1879/article/details/137963848

参考文章 - Maven 在 IDEA 中的配置与使用:https://blog.csdn.net/Sareur_1879/article/details/143091933

参考文章 - Spring Boot 项目是两种创建方式:https://blog.csdn.net/Sareur_1879/article/details/139201323

Maven 官网:https://maven.apache.org/download.cgi

MVN 仓库:https://mvnrepository.com/

Spring Boot 官网:https://spring.io/projects/spring-boot

Oracle 官网:https://www.oracle.com

IDEA 官网:https://www.jetbrains.com.cn/idea/

Postman 官网:https://www.postman.com/

Notepad++ 下载地址:https://notepad-plus.en.softonic.com/

WinRAR 下载地址:https://www.winrar.com.cn/

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

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

相关文章

Qt之QCamera的简单使用

文章目录 一、相机操作相关示例1.摄像头操作内容使用示例2.摄像头信息展示使用示例3.摄像头设置切换、预览操作示例 二、相机使用个人操作理解1.相机类支持信息获取2.相机类曝光、焦点、图像处理控制信息获取3.快速启动相机设置&#xff08;各个设备处于理想状态&#xff09; 三…

地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员&#xff08;感谢吴超同学&#xff09;的及时技术支持&#xff0c;整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来&#xff1a; 首先下载使用docker镜像&#xff1a; https://developer.d-robotics.cc/forumDetail/228559182180396619 …

linux驱动—注册总线分析

成功地在直接注册了一个总线&#xff0c;并且在总线目录下创建了属性文件&#xff0c;什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe&#xff0c;uevent目录和属性呢? /sys,目录下的目录都对应一个kobject&#xff0c;…

如何成为录屏高手?2024年全新录屏工具梳理,你选对了吗?

如何录屏&#xff1f;录屏现在对我们来说太重要了&#xff0c;不管是做教学视频、演示文稿&#xff0c;还是录游戏或者教别人怎么用软件&#xff0c;都离不开录屏工具。但是市面上录屏软件一大堆&#xff0c;挑个适合自己的真不容易。今天&#xff0c;我就来给你介绍几款特别火…

知识图谱解码:AI 如何构建知识网络

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

凸轮应用实例(带进料装置的伺服压机控制)

凸轮表凸轮关系曲线建立 博途S7-1500T PLC曲柄连杆模型仿真(电子凸轮完整配置+SCL源代码)-CSDN博客文章浏览阅读4次。这篇博客介绍了曲柄连杆机构的位移与曲柄转动角度关系,通过MATLAB进行计算和Simulink验证,并提供博途SCL源代码。文章链接提供了详细的曲柄连杆数学模型分析…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available&#xff08;基本可用&#xff09;2_Soft State&#xff08;软状态&#xff09;3_Eventually Consistent&#xff08;最终一致性&#xff09;4_总结 1、理论基础 在计算机…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性&#xff1a; 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码&#xff08;js引用&#xff09;3.2 访问页面4 导入js function4.1 编写lib.rs文件&#xff0c;内容…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案&#xff1a; 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

centeros7 编译ffmpeg

使用yum安装的路似乎已经堵住了&#xff0c;请求的镜像全是404或503 1.打开终端并使用yum安装EPEL存储库(Extra Packages for Enterprise Linux)&#xff1a;sudo yum install epel-release2.接下来&#xff0c;使用以下命令来安装FFmpeg&#xff1a;sudo yum install ffmpeg …

有关spring,springboot项目的知识点

文章目录 1.Spring基本介绍1.1Spring官网1.2Spring的发展 2.SpringBoot2.1SpringBoot快速入门2.1.1创建SpringBoot工程,并勾选web开发相关依赖2.1.2定义HelloController类,并添加方法helllo,且添加注解2.1.3运行测试 3.HTTP协议3.1HTTP协议的概念3.1.1HTTP的特点 3.2HTTP-请求协…

YOLOv8_ ByteTrack目标跟踪、模型部署

YOLOv8目前支持BoT-SORT和ByteTrack两种多目标跟踪算法&#xff0c;默认的目标跟踪算法为BoT-SORT 如果要使用ByteTrack跟踪算法&#xff0c;可以添加命令行参数trackerbytetrack.yaml 一、 VisDrone2019数据集 VisDrone&#xff1a;无人机目标检测和追踪基准数据集。&#x…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程&#xff0c;使得大模型能够处理。token可以是单词、字符、子词或符号&#xff0c;取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式&#xff0c;并降低计算和内存成本。分词还可以通过影响token的…

10-1.idea中的项目结构,辅助快捷键,模块的操作

idea中的项目结构和辅助快捷键 IDEA中项目结构 首先是创建项目&#xff0c;新建的项目中有子项目&#xff0c;我们可以创建模块 然后在模块中我们可以创建包&#xff0c;在包中的SRC中写我们的源代码&#xff0c;也就是类。 VScode写Java项目 如何你电脑比较卡的话&#…

Java中自增自减,赋值,逻辑,三元运算符

自增自减运算符 在某个变量前面或者后面加一--在某个变量前面或者后面减一 可以看见&#xff0c;当a输出时&#xff0c;a是没有变化的&#xff0c;说明如果是在变量后就是先使用再增加&#xff0c;而b输出时&#xff0c;b增加了1&#xff0c;说明如果是在变量前面就是先增加再…

【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)

下载软件 相关版本信息 elasticsearch&#xff1a;8.8.1kibana&#xff1a;8.8.1logstash&#xff1a;8.8.1filebeat&#xff1a;8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…

配置nginx服务通过ip访问多网站

文章目录 第一种方法第二种方法 先关闭防火墙 # systemctl stop firewalld # setenforce 0第一种方法 #mntui 第二种方法 # vim /etc/nginx/conf.d/test_ip.conf # cat /etc/nginx/conf.d/test_ip.conf server {listen 192.168.234.100:80;#server_nameroot /test/100;loca…

PostgreSQL使用clickhouse_fdw访问ClickHouse

Postgres postgres版本&#xff1a;16&#xff08;测试可用&#xff09;docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…