2023.11.20 关于 Spring MVC 详解

目录

MVC

工作流程

Spring MVC 

掌握三个功能

创建 Spring MVC 项目 

推荐安装插件 EditStarters

安装步骤

使用方法

实现连接功能

基础注解

 @RequestMapping

指定 GET 和 POST 方法类型

@ResponseBody

获取参数 

传递 单个 或 多个参数

参数重命名 @RequestParam

接收 JSON 对象 @RequestBody

获取 URL 中参数 @PathVariable

上传文件 @RequestPart

获取 Cookie 数据

传统方式

 使用 @CookieValue 注解方式

读取 Session 数据

传统方式

 使用 @SessionAttribute 注解方式

返回静态页面

返回 JSON 对象


MVC

  • MVC 是一种 软件设计模式
  • 将应用代码组织成三个互相交织的部分:模型、视图、控制器

模型(Model)

  • 业务流程 或 状态的处理以及业务规则的制定者
  • 与数据库交互的逻辑

视图(View)

  • 视图代码用户交互界面
  • 对于Web应用来说,可以大致概括为 HTML 页面
  • 视图是用户接口和交互

控制器(Controller)

  • 控制器可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求
  • 是视图和数据库之间的中介

工作流程

  1. 客户端向服务器发起 HTTP 请求
  2. 控制器(Controller)接收 HTTP 请求并向 模型(Model)请求信息
  3. 模型(Model)对象 在数据库中进行相应数据的存取,完成后将响应信息返回给 控制器(Controller)
  4. 控制器(Controller)收到响应信息后,又将其交给 视图(View)渲染结果,展示给用户,即通过 视图(View)将 HTTP 响应传递给用户

Spring MVC 

  • MVC 是一种思想,Spring MVC 是对 MVC 思想的实现
  • Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架
  • 常说的 SSM 项目就等于 Spring Boot + Spring MVC + MyBatis

掌握三个功能

连接功能

  • 将用户(浏览器)和 Java 程序连接起来
  • 即可以访问一个能够调用 Spring 程序的地址

获取参数功能

  • 用户访问时会带一些参数,如 query string
  • 在程序中能够获得该参数

输出数据功能

  • 根据请求计算响应,将响应结果返回给用户

创建 Spring MVC 项目 

 建议点击下方链接 详细了解创建过程

Spring Boot 的创建及使用


  • 创建 Spring MVC 项目的关键为 添加 Spring Web 依赖
  • 该依赖包含了 MVC


推荐安装插件 EditStarters

  • 该插件可以方便地设置 Spring Boot 项目的依赖

安装步骤

注意:

  • 安装完该插件后最好重启 IDEA

使用方法

  • 在 pom.xml 页面中,按快捷键 Alt + Insert,点击 Edit Starters

  • 选择需要添加依赖


实现连接功能

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller //让 Spring 项目启动时,将这个注解下的类加载到容器中
@ResponseBody //使其返回的响应是数据,而非页面
@RequestMapping("/test") //注册路由
public class TestController {@RequestMapping("/hi") //注册路由public String sayHi() {return "hi Spring MVC!";}
}

运行结果:

  • 在浏览器的 URL 输入框中 输入相对应的 URL

基础注解

 @RequestMapping

  • 可以用来修饰 类 或 方法
  • 用来将 HTTP 请求路径映射到对应的处理方法上

实例理解

指定 GET 和 POST 方法类型

  • GET 请求的三种写法
// 写法一
@RequestMapping("/index")
// 写法二
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法三
@GetMapping("/index")
  • POST 请求的两种写法

// 写法一
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法二
@PostMapping("/index")


@ResponseBody

  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端
  • @ResponseBody 可以用来修饰方法 或 类,修饰类表示类中所有的方法都遵循上条规定,而不是返回 静态页面

阅读下面文章之前 建议点击下方链接了解 Postman 的使用

Postman 的使用

根据链接文章目录寻找对应 Postman 内容


获取参数 

  • Spring MVC 中可以直接通过方法中的参数来传参
  • 注意以下两点

参数名称匹配

  • 在 Spring MVC 中,当有多个参数进行参数匹配时,是按照参数的名称进行匹配的,而不是参数的位置
  • 这意味着,无论你在方法中如何排列参数,只要参数的名称与前端传递的参数名称相匹配,就可以正确的获取到参数值

包装类类型参数

  • 在Spring MVC 中,建议方法的参数使用包装类类型,而非基础类类型
  • 如果方法的参数为基础类型(int、double 等),当前端忘记传递参数时,程序会报 500 错误
  • 因为基础类型不能为 null
  • 而如果参数类型为包装类类型(Integer、Double等),即使前端忘记传递参数,参数值也只会为 null,不会引发报错

传递 单个 或 多个参数

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/message")public void getUserMessage(String name,String age) {System.out.println("name" + name);System.out.println("age" + age);}
}
  • 上述代码中的方法参数与 URL 中 query string 的 key 值相对应

测试结果

  • 此处我们使用 Postman 来构造 HTTP 请求 来访问 getUserMessage 方法

  • 点击 send 发送构造好的 HTTP 请求,随后观察控制台的打印


参数重命名 @RequestParam

  • @RequestParam 注解有三个属性

value

  • 请求参数名(必须配置)
  • 如果想重命名参数,可以在 value 属性中指定新的参数名

required

  • 默认为 true,即 请求中必须包含该参数,如果未包含将直接抛出异常
  • 设置为 false ,表示该参数为 非必传参数

defaultValue

  • 表示参数的默认值
  • 如果设置了 defaultValue,则无论是否配置了 required,required 都将被自动设置为 false

实例理解

  • 当前端传递的参数 key 为 t1
  • 此时后端便可以用 @RequestParam 注解 来重命名后端的参数名为 startTime
  • 即用 startTime 来接收前端传来的 参数名为 t1 的值
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/time")public void getTime(@RequestParam(value = "t1", required = false) String startTime,@RequestParam(value = "t2", required = true, defaultValue = "2023.12.30") String endTime) {System.out.println("起始时间:" + startTime);System.out.println("结束时间:" + endTime);}
}
  • 该段代码将 t1 重命名为 startTime,将 t2 重命名为 endTime
  • 此时 startTime 被设置为 非必传参数
  • endTime 的 required 被设置为 true ,表示前端发送的请求中必须包含 t2 字段
  • 但是 endTime 又被设置了 defaultValue,表示其默认值为 "2023.12.30" 
  • 所以即使 endTime 的 required 被设置为了 true,但是又因为 defaultValue 的设置,从而导致 endTime 的 required 又被自动设置为了 false

验证结果:

  • 运行结果正如我们所期望的一样
  • 虽然请求中未包含 t2 字段,但并未抛出异常,正常接收到了 请求中的参数值

接收 JSON 对象 @RequestBody

实例理解

  • 此时前端想发送的请求如下图所示

  • 首先我们先创建一个 User 实例类,与请求的 JSON 相对应
import lombok.Data;
import org.springframework.stereotype.Component;@Component
@Data
public class User {private int id;private String name;private int age;
}
  • 然后我们再使用 @RequestBody 来接收 JSON 对象,并打印出来
import com.example.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/message")public void getUserMessage(@RequestBody User user) {System.out.println(user.toString());}
}

运行结果:


获取 URL 中参数 @PathVariable

实例理解

  • 此时前端想发送的请求如下图所示

  • 我们使用 @POSTMapping 注解来接收 URL 中的参数值
import com.example.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@PostMapping("/urlValue/{name}/{age}")public String getUrlValue(@PathVariable(value = "name") String name,@PathVariable(value = "age",required = false) String age) {return "name:" + name + ", age:" + age;}
}

注意:

  • 此处的参数 name 为必传参数,age 为非必传参数

运行结果:

  • 一般来说清晰、有意义的URL结构可以提高你的网站在搜索引擎中的排名
  • 使用路径变量(如 "/user/{id}") ,而不是查询字符串(如 "/user?id=123")可以使URL 看起来更加整洁和易于理解,这有可能帮助提高 SEO 效果
  • SEO 全称为 Serch Engine Optimization,译为 搜索引擎优化
  • SEO 是一种利用引擎的规则提高网站在有关搜索引擎内的自然排名
  • 目的是让其在行业占据领先地位,获得品牌效益

上传文件 @RequestPart

实例理解

  • 此时前端通过 from 表单将文件传给后端
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@Controller
@ResponseBody
@RequestMapping("/file")
public class FileController {@RequestMapping("/up-file")public String upFile(@RequestPart("myfile")MultipartFile file) throws IOException {String path = "E://photo.jpg";
//        将传来的文件存放到对应的目录下file.transferTo(new File(path));return "文件保存到 " + path;}
}
  • 通过 Postman 来构造 from 表单来给后端传输文件

获取 Cookie 数据

  •  Spring MVC 基于 Servlet 实现
  • 所以获取 Cooike 数据也是通过 HttpServletResponse 的 getCookie 方法

传统方式

实例理解

  • 此处通过打印日志信息,来方便结果的观察
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;@Controller
@ResponseBody
@RequestMapping("/cookie")
@Slf4j
public class CookieController {@RequestMapping("/get-cookie")public String getCookie(HttpServletRequest request) {Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {log.error("key:" + cookie.getName() + ",value" + cookie.getValue());}return "get Cookie Success!";}
}
  • 在浏览器中自定义测试 cookie 

  • 在浏览器的 URL 地址框中输入相对应地址

  • 在控制台中观察 Spring MVC 拿到的 cookie 信息


 使用 @CookieValue 注解方式

实例理解

  • 通过使用 @Cookievalue 注解来直接获取 cookie 所对应 name 为 "xiaolin" 的 value 值
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
@RequestMapping("/easy-cookie")
public class EasyCookieController {@RequestMapping("/easy-get")public String easyGetCookie(@CookieValue("xiaolin") String value) {return "cookie: " + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址

读取 Session 数据

  •  Spring MVC 基于 Servlet 实现
  • 所以读取 Session 数据也是通过 HttpServletResponse 的 getSession 方法

  • 首先为了能够读取到 Session 数据,我们得先自己设置 session 对象的属性

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
@ResponseBody
@RequestMapping("session")
public class SessionController {@RequestMapping("set-session")public String setSession(HttpServletRequest request) {HttpSession session = request.getSession(true);session.setAttribute("MasterMao","hello");return "set Session Success";}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来通过该请求调用到 setSession 方法

传统方式

实例理解

  • 此处使用 getSession 来读取 Session 数据
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
@ResponseBody
@RequestMapping("session")
public class SessionController {@RequestMapping("read-session")public String readSession(HttpServletRequest request) {HttpSession session = request.getSession(false);String value = (String) session.getAttribute("MasterMao");if (value == null) {return "session error!";}return "get Session Success! value = " + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取到 Session 数据


 使用 @SessionAttribute 注解方式

实例理解

  • 通过使用 @SessionAttribute 注解来直接获取 session 属性名为 "MasterMao" 所对应的属性
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;@Controller
@RequestMapping("easy-session")
@ResponseBody
public class EasySessionController {@RequestMapping("easy-read")public String easyReadSession(@SessionAttribute(value = "MasterMao", required = false) String value) {return "easy read session success! value =" + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取到 Session 数据

返回静态页面

  • Spring MVC 默认情况下返回的是 View 视图(xxx.html)
  • 而上文中我们通过添加 @ResponseBody 注解,修改成了 后端返回给前端的是数据,而非页面
  • 此时我们不加 @ResponseBody 注解,就让后端返回一个静态页面给前端

实例理解

  • 首先我们需在对应目录下创建一个前端页面,如下图所示

  • 然后编写 index.html 页面内容
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>测试页面</title>
</head>
<body><h3>Hello Spring MVC!</h3>
</body>
</html>
  • 后端编写如下代码,返回 index.html 页面给前端
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/html")
public class IndexController {@RequestMapping("/index")public String respIndex() {
//        编写业务逻辑代码return "/index.html";}
}
  • 启动程序,在浏览器中输入对应的 URL 地址

注意:

  • 当程序启动后,浏览器可直接直接访问 static 目录下的前端页面

  • 一个 URL 地址为 localhost:8080/html/index
  • 该地址表示向程序中发送请求,根据 URL 的路径对应到程序中相应的控制器方法上
  • 此处对应的控制器方法为 respIndex 方法,然后执行该方法中业务逻辑,处理该请求
  • 又由于 Spring MVC 默认情况下返回的是页面,此处我们也未添加 @ResponseBody 注解
  • 即 respIndex 方法返回的字符串,被 Spring MVC 转变为相对应的页面,返回给了前端
  • 另一个 URL 地址为 localhost:8080/index.html
  • 该 URL 地址直接指向静态 HTML 文件
  • 即服务器将直接返回 index.html 文件的内容,不经过任何控制器方法

返回 JSON 对象

  • 在 SpringMVC 中返回 HashMap 对象,实际上就是返回 JSON 对象给前端

实例理解

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;@Controller
@RequestMapping("/json")
@ResponseBody
public class JsonController {@RequestMapping("/get-json")public HashMap<String,Integer> respJson() {HashMap<String,Integer> map = new HashMap<>();map.put("xiaolin", 1);map.put("maolin", 2);map.put("xiaomei", 3);return map;}
}

运行结果:

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

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

相关文章

5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)

代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法&#xff08;Moth-Flame Optimization&#xff0c;MFO&#xff09;是一种新型元启发式优化算法&#xff0c;该算法是受飞蛾围绕火焰飞行启发而提出的&#xff0c;具有搜索速度快、寻优能力强的…

事件溯源(Event Sourcing)和命令查询责任分离(CQRS)经验

这篇文章是实现一个基于 CQRS 和事件溯源原则的应用程序&#xff0c;描述这个过程的方式&#xff0c;我相信分享我面临的挑战和问题可能对一些人有用。特别是如果你正在开始自己的旅程。 业务背景 项目的背景与空中交通管理&#xff08;ATM&#xff09;领域相关。我们为一个 …

动手学深度学习——循环神经网络的简洁实现(代码详解)

文章目录 循环神经网络的简洁实现1. 定义模型2. 训练与预测 循环神经网络的简洁实现 # 使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, …

【Linux】文件操作

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;文件是什么&#xff1f;&am…

Python3.11+Pyside6开发电影下载程序

VideoSave是一款使用Python3.11Pyside6编写的提供下载电影/电视剧的软件&#xff0c;支持注册、登录、搜索、下载、查看日志等功能&#xff0c;提供了Window、Mac系统安装包。 先上效果图 提供功能 节省寻找资源的时间 ⌚️模糊搜索指定影片 &#x1f434;查看影片下载日志 &…

观光奶牛 (01分数规划、负环)

01分数规划问题&#xff1a;类似于观光奶牛这个题中的&#xff0c;求的路径上的点权值和与边权值和的商最大最小。 当前问题的推到如下&#xff1a; 该问题其实可以用二分图来解决&#xff0c; 在不断的二分答案中获取符合条件的最大值。然后问题就转化为如何是否存在和为mid的…

程序员如何“升级打怪”?我用了这几个“歪瓜”!

不会吧&#xff1f;不会吧&#xff1f;计算机本命专业出身、以及半路出家的&#xff0c;混了几年了&#xff0c;还在新手村&#xff1f;对得起这几年摸的鱼&#xff1f; 思考一下&#xff1a;如何从小白一跃为大师&#xff0c;从此走上人生巅峰、迎娶白富美&#xff1f;变强只…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

3.基于多能互补的热电联供微网优化运行复现(matlab代码)

0.代码链接 基于多能互补的热电联供微电网/综合能源系统优化运行&#xff08;Matlab程序Yalmip&#xff0b;Cplex求解&#xff09;_工业综合能源系统资源-CSDN文库 2. 主要内容&#xff1a;代码主要做的是多能互补的热电联供型微网优化运行模型&#xff0c;在需求侧对负荷类型…

Android Studio 引入Xui框架-简单应用

Android Studio Flamingo | 2022.2.1 Patch 2 Android 11开发、Gradle Version 8.0、 jdk17 源代码&#xff1a;GitHub - xuexiangjys/XUI: &#x1f48d;A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架&#xff…

WordPress网站迁移实战经验

前几日,网站服务器到期,换了服务商,就把我的WordPress的网站迁移到本地电脑了。方便以后文章迁移。 本次迁移网站主要经历以下几个步骤。 1.域名转出。 2.备份数据库及网站文件下载。 3.重新搭建WordPress网站。 4.网站文件及数据库导入。 下面详细介绍下每个步骤的操作…

【狂神说Java】redis

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;【狂神说Java】 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c…

pipeline传参给job

场景&#xff1a;pipeline实现自动部署&#xff0c;job实现自动测试&#xff0c;但是只有部署dddd环境时&#xff0c;才调自动测试的job&#xff0c;所以需要在调自动测试job时&#xff0c;把参数传给测试job 上一个任务会显示下一步调谁 ------------------------------------…

解决:ERR This instance has cluster support disabled

问题描述 在使用Redisson做分布式锁&#xff0c;连接redis时&#xff0c;提示以下错误&#xff1a; 问题定位 通过指令&#xff1a; cluster nodes查看&#xff0c;发现 出现这种提示的原因&#xff0c;是因为此Redis实例已经禁用了集群(默认状态下是禁用状态)。 解决 …

Flowable工作流高级篇

文章目录 一、任务分配和流程变量1.任务分配1.1 固定分配1.2 表达式分配1.2.1 值表达式1.2.2 方法表达式 1.3 监听器分配 2.流程变量2.1 全局变量2.2 局部变量2.3 案例讲解 二、候选人和候选人组1.候选人1.1 定义流程图1.2 部署和启动流程实例1.3 任务的查询1.4 任务的拾取1.5 …

Linux进程通信——消息队列

概念 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点 1.消息队列是面向记录的&#xff0c;其中的消息具有特定的格式以及特定的优先级。&#xff08;消息队列是结构体&#xff09; 2.消息队列独立于发送与接…

如何制作动态表情包?一个方法快学起来

在当代的通讯工具中&#xff0c;动态表情包已经是人们日常交流不可缺少的一部分了。但是&#xff0c;很多时候网络上常见的动态表情包不能够很好表达出我们的需求时应该怎么办呢&#xff1f;这时候&#xff0c;我们可以使用gif动图制作&#xff08;https://www.gif.cn/&#xf…

用VS编译ROS包

扩展安装 在扩展中搜索并安装ROS、C、python、CMake和CMake Tools。 打开工作空间 文件→打开文件夹 新建功能包 右键src文件夹&#xff0c;选择新建功能包&#xff08;通常是最后一条命令&#xff09; 编译 如果需要新建终端的话&#xff0c;就点击下图中的加号 创建la…

14. UART串口通信

14. UART串口通信 1. UART1.1 UART 通信格式1.2 UART 电平标准1.3 I.MX6U UART 简介1.3.1 控制寄存器1 UARTx_UCR1(x1~8)1.3.2 控制寄存器2 UARTx_UCR21.3.3 控制寄存器3 UARTx_UCR31.3.4 状态寄存器2 UARTx_USR21.3.4 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR1.3.5 UARTx_URXD…

【原创】CentOS7.9解决mdadm组raid阵列后resync非常慢的问题

前言 前几日我买了4块16TB的硬盘使用mdadm组了一个raid10阵列&#xff0c;具体如何搭建的可以看我之前的博客。 【报错记录】疯狂踩坑之RockyLinux创建Raid1镜像分区&#xff0c;Raid分区在重启后消失了&#xff01;外加华硕主板使用Raid模式后&#xff0c;硬盘在系统中无法找…