当前位置: 首页 > news >正文

【Spring MVC】Spring MVC基于注解的程序开发

目录

一、什么是Spring MVC

 二、Spring MVC项目的创建和使用

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

1.2、@RequestMapper的简单使用 

1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

三、获取参数

1、实现获取单个参数

2、实现获取对象

3、后端参数重命名(@RequestParam参数映射)

 4、@RequestParam参数必传设置

 5、接收JSON对象(@RequestBody)

6、获取URL中参数(@PathVariable)

 7、上传文件(@RequestPart)

8、获取Cookie/Session/header

四、返回数据

1、返回一个静态页面

 2、返回一个数据

 3、返回text/html

4、请求转发和请求重定向


一、什么是Spring MVC

官方的描述为Spring Web MVC是基于Servlet API的原始Web框架,从一开始就包含在Spring框架中。它的正式名称Spring Web MVC”来自它的源模块(Spring -webmvc)的名称,但它更常被称为“Spring MVC”。

理解Web框架

Web框架(Web framework)是用来进行Web应用开发的一个软件架构。主要用于动态网络开发,Web应用框架提供了一套开发和部署网站的方式。开发者基于框架实现自己的业务逻辑。使用Web框架很多的业务逻辑的功能不需要自己去完善,而是使用框架已有的功能就可以。

✨什么是MVC 

MVC是Model View Controller的缩写,它是软件工程中的一种软件件架构模式,他将一个项目分为三部分:View(试图),Controller(控制器),Model(模型)。MVC是一种思想

  • Model(模型):项目中用于处理程序数据逻辑的部分,负责在数据库中查找和存储数据。
  • View(试图):是项目中将得到的数据进行处理之后,显示给用户一个界面的部分。
  • Controller(控制器):是项目中处理用户交互的部分,负责读取用户的请求,向模型提价请求,读取模型的响应,将数据交给View部分。

✨MVC和Spring MVC的关系

MVC是一种思想,Spring MVC是对MVC思想的具体实现。

Spring MVC是一个实现了MVC模式,并继承了Servlwt API的Web框架。

 二、Spring MVC项目的创建和使用

Spring MVC项目的创建步骤和Spring Boot的创建步骤是相同的,我们之前创建的Spring Boot项目就相当于是一个Spring Web项目,我们在添加Spring Boot框架的时候,已经引入了Spring MVC。

下图中spring-boot-starter-web表示的就是Spring MVC框架。

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

@ResquestMapping是Spring Web应用程序中最常用到的注解之一,他是用来注册接口的的路由映射的。

路由映射:所谓的路由隐射指的就是,当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫做路由映射。

✨ @RequestMapping注解的参数

  • value:指定请求的实际访问地址,value属性是@RequestMapping注解的默认属性,如果只有唯一一个属性,则可以省略value字段,如果参数中有多个属性,则必须写上value属性名。
  • path:与value同义,他们在源码中相互引用,value和path都是用来作为映射使用的。
  • method:用来指定请求的类型,当在一个方法的注解@RequestMapping的参数中写道method = RequestMethod.GET表示这个方法只支持GET请求。
  • params:该属性指定,请求中必须包含params属性指定的参数时,才能执行该请求。
  • headers:该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求。
  • consumes:指定处理请求的提交内容类型(Content-Type),才能让该方法处理请求
  • produces:指定返回的内容类型,返回的内容类型必须时request请求头中所包含的类型。这个属性还可以指定返回值的编码。

1.2、@RequestMapper的简单使用 

  • @RequestMapping既可以修饰类,也可以修饰方法,当同时修饰类和方法时,类上的@ResquestMapping注解的参数value/path,表示的是URL中的一级路由,方法上的参数的value/path表示的是URL的二级路由。
  • @RequestMapper注解默认情况下支持GET和POST请求。

🍂下面我们创建一个类,来实现客户端和Spring程序的连接,使用postman模拟客户端发送请求。验证@RequsetMapper注解既可以修饰类也可以修饰方法和@RequestMapper注解默认支持GET和POST请求。

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/sayHi")public String sayHi(){return "你好 Spring MVC";}
}

 我们使用URL为127.0.0.1:8080/test/sayHi

1️⃣我们使用POST请求,可以收到响应。

 2️⃣我们使用GET方法发送请求,也可以收到响应

 🍂当然我们可以设置@RequestMapping注解的Method属性值为RequeatMethod.POST,表示这个方法只支持POST请求

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {//当这个注解中的参数有多个的时候,就需要添加属性名称@RequestMapping(value = "/sayHi",method = RequestMethod.POST)public String sayHi(){return "你好 Spring MVC";}
}

 

 🍂@RequestMapper支持设置多级目录

@RequestMapping("/sayHi/mvc")

 


1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

@GetMapping注解只能实现GET请求的连接,@POSTMapping注解只能实现POST请求的连接。

🍂@GetMapping注解

package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("sayhi2")public String sayHi2(){return "你好,世界";}
}

 

 🍂@PostMapping注解

package com.example.demo.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@PostMapping("sayhello")public String sayHi2(){return "你好,世界";}
}

 

 


三、获取参数

1、实现获取单个参数

1️⃣使用servlet的写法(getParameter)来实现获取单个参数


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/test2")
public class TestController2 {@RequestMapping("/getname")public String getName(HttpServletRequest request){return "Name:"+ request.getParameter("name");}
}

 2️⃣使用更简单的获取单个参数的方法

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test2")
public class TestController2 {@RequestMapping("/getname2")public String getName2(String name){return "Name: "+name;}
}

 


2、实现获取对象

上面获取单个参数的方式,当参数个数固定的时候可以使用,但是如果参数个数不确定,随时都需要添加参数的时候,我们这个时候可以使用获取对象的方式获取参数,前端没有对象的概念,传递的都是对象的属性,后端代码中需要创建一个(用户)类的对象,用来接收前端传过来的属性的值。

package com.example.demo.model;import lombok.Data;@Data
public class User {private int id;private String name;private String password;private int age;
}package com.example.demo.controller;import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/add")public User add(User user){return user;}
}

 当前端的属性和后端中类的属性对应不全的时候,如果后端没有相应的属性,那么前端的属性赋值不到后端的代码中,如果前端没有相应的后端代码中的属性,那么后端中类的属性的值就是默认值。


3、后端参数重命名(@RequestParam参数映射)

特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个n给后端,而后端使用的时name参数来接收的,这个时候就会出现参数接收不到的问题,我们可以使用@RequestParam注解来重命名前后端的参数。


import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/name")public String name(@RequestParam ("n") String name){return name;}
}

 4、@RequestParam参数必传设置

使用@RequestParam注解之后,那么这个属性就变成了必传的参数了,不传这个参数就会报错,原因是因为@RequestParam注解中有一个required属性等于true,表示这个参数为必传的,我们只需要设置这个属性为false即可解决必传的问题。

 

    @RequestMapping("/name")public String name(@RequestParam (value="n",required = false) String name){return name;}

 5、接收JSON对象(@RequestBody)

这里只需要使用@RequestBody就可以拿到前端传递的JSON对象

    @RequestMapping("/add_json")public User addByJson(@RequestBody User user){return user;}

 


6、获取URL中参数(@PathVariable)

之前我们是通过URL中的查询字符串的部分获取的参数,也就是name="xxx"&id=123的部分。但是有点网站不是通过这样的方式传递参数的,就像掘金一样。访问它的有些页面时URL是这样的https://juejin.cn/user/61228381386487。他没有通过查询字符串的方式传递。

1️⃣从前端获取一个参数

    @RequestMapping("/detial/{id}")public Integer detail(@PathVariable("id") Integer id){return id;}

 这里表示前端要传递的参数为id,所以这里需要使用一个{}将这个参数括起来

2️⃣表示从前端获取多参数

    @RequestMapping("/detial/{id}/{name}")public String detail(@PathVariable("id") Integer id,@PathVariable("name") String name){return "id: "+id+" "+"name: "+name;}

 7、上传文件(@RequestPart)

@RequestPart用于将multiparty/form-data类型的数据映射到控制器处理方法的参数中。

    @RequestMapping("/upload")public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {String path = "D:/img.png";file.transferTo(new File(path));return path;}
}

这里@RequestPart("file")表示从请求中获取名为"file"的文件,长传的文件将被存储在file对象中,我们可以是以哦那个file对象的方法类处理上传的文件。

 在D盘中获取到了这个图片文件,并将图片名字改为了img

但是这样编写的后端代码存在问题,就是客户端每次访问服务器程序,服务器返回的图片名字都是一样的,那么在D盘中,后面获取的图片会将之前获取的覆盖掉,这是不完善的,如果在客户端点击上传的图片不同,最终服务器将不同的图片名字改成一样的,两张不同的照片只能保存其中一个。

✨下面我们来解决这个问题

这里将路径中的文件名通过生成一个全球唯一id得到的,文件类型是截取原文件的。

    @RequestMapping("/upload")public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {//1、生成一个唯一的id(UUID就是全球唯一ID,他是由MAC地址+随机数+加密算法组成的,保证生成的id是全球唯一ID)String name = UUID.randomUUID().toString().replace("-","");//2、得到源文件的后缀名name += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));String path = "D:/"+name;//将文件保存在path路径中file.transferTo(new File(path));return path;}

可以看见每次获取的文件名称都是不一样的,也不会将之前获取的文件覆盖掉。

 


8、获取Cookie/Session/header

 通过@CookieValue获取Cookie

    @RequestMapping("/getcookie")public String getCookie(@CookieValue("java")String ck){return ck;}

 通过@CookieValue注解类获取Session

    @RequestMapping("/getsess")//这里的value指的是session的名字public String getSess(@SessionAttribute(value="username",required = false) String username){return username;}

通过@RequestHeader获取Header

// @RequestHeader 获取 header
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {return "User-Agent: " + userAgent;
}

四、返回数据

1、返回一个静态页面

在项目中创建一个静态的html页面。使用@Controller注解默认的是返回一个页面

package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class TestController3 {@RequestMapping("/hello")public String index(){return "hello.html";}}

 

 2、返回一个数据

使用@ResponseBody和@Controller注解搭配使用,让返回的值是一个数据,也可以使用组合注解@RestController注解

package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
public class TestController3 {@RequestMapping("/hello")public String index(){return "hello.html";}
}

 3、返回text/html

可以使用组合注解@RestController也可以使用@Controller和@ResponseBody搭配使用

@RestController
public class TestController3 {@RequestMapping("method")public String method(){return "<h1>hello,world!</h1>";}

4、请求转发和请求重定向

return不仅可以返回一个试图,还可以实现跳转,跳转的方式有两种:

  • forward是请求转发;
  • redirect是请求重定向。
// 请求重定向
@RequestMapping("/index1")
public String index1() {return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2() {return "forward:/index.html";
}

✨请求重定向和请求转发的区别

  • 请求转发是一种服务器行为,客户端只有一次请求,服务器接收到客户端的请求之后,会先将请求转发给目标地址,在将目标地址返回的结果转发给客户端。客户端对这一切毫无感知。这就像A找B借钱,B没有,B向C借到之后,将钱给了A,整个过程A就直借了一次钱。B向C借钱A不知道。
  • 请求重定向是指服务器端接收到客户端的请求之后,会给客户端返回一个临时相应头,这个响应头中记录了,客户端需要再次发送请求(重定向)的URL地址,客户端收到地址之后,会将请求发送到新的地址上,这就是请求重定向。就像A找B借钱,B没有,但是B知道C有,B对A说C有,让A 去C哪里借,然后A去找C去借,这个过程就是请求重定向。

相关文章:

【Spring MVC】Spring MVC基于注解的程序开发

目录 一、什么是Spring MVC 二、Spring MVC项目的创建和使用 1、实现客户端和服务器端之间的连接 1.1、RequsestMapping注解 1.2、RequestMapper的简单使用 1.3、使用GetMapping和POSTMapping注解来实现HTTP连接 三、获取参数 1、实现获取单个参数 2、实现获取对象 3…...

前端探索之旅

目录 简介:内容大纲:第一章 前端开发简介1.1 前端开发的定义和作用1.2 前端开发的职责1.3 前端开发的技能要求1.4 前端开发的发展前景总结&#xff1a; 第二章 HTML基础2.1 HTML基本结构2.2 常见HTML标签和元素 第三章 CSS基础3.1 CSS基本语法3.2 常见CSS选择器3.3 常见CSS属性…...

“冰箭卫士·IP发布会”首次亮相第14届海峡两岸(厦门)文博会

2023年8月6日,“冰箭卫士IP发布会”首次亮相海峡两岸文博会思明馆。此次发布会由厦门市文化创意产业协会、厦门理工&#xff08;集美区&#xff09;政产学研基地主办&#xff0c;厦门市文化创意产业协会IP设计研究院、厦门一笔之上文化发展有限公司、冰箭应急安全科技研究院承办…...

数学建模学习(9):模拟退火算法

模拟退火算法(Simulated Annealing, SA)的思想借 鉴于固体的退火原理&#xff0c;当固体的温度很高的时候&#xff0c;内能比 较大&#xff0c;固体的内部粒子处于快速无序运动&#xff0c;当温度慢慢降 低的过程中&#xff0c;固体的内能减小&#xff0c;粒子的慢慢趋于有序&a…...

带你认识储存以及数据库新技术演进

01经典案例 1.0 潜在问题 02存储&数据库简介 2.1 存储器层级架构 2.1 数据怎么从应用到存储介质 2.1 RAID技术 2.2 数据库 数据库分为 关系型数据库 和 非关系型数据库 2.2.2 非关系型 2.2.1 关系型 2.3 数据库 vs 经典存储-结构化数据管理 2.3.1 数据库 vs 经典存储-事务能…...

腾讯云服务器镜像操作系统大全_Linux_Windows清单

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像&#xff0c;公共镜像包含基础操作系统和腾讯云提供的初始化组件&#xff0c;公共镜像分为Windows和Linux两大类操作系统&#xff0c;如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…...

基于k8s job设计与实现CI/CD系统

方案一&#xff1a;Jenkinsk8sCICD 方案二&#xff1a;kanikok8s jobCICD CICD 基于K8s Job设计流水线 CI方案 工具镜像 云原生镜像打包工具 kaniko的使用 与Jenkins对比 可用性与易用性...

⌈算法进阶⌋图论::并查集——快速理解到熟练运用

目录 一、原理 1. 初始化Init 2. 查询 find 3. 合并 union 二、代码模板 三、练习 1、 990.等式方程的可满足性&#x1f7e2; 2、 1061. 按字典序排列最小的等效字符串&#x1f7e2; 3、721.账户合并 &#x1f7e1; 4、 839.相似字符串组&#x1f7e1; 5、 2812.找出最安全…...

【ROS】fsd_algorithm架构学习与源码分析(致敬)

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍fsd_algorithm架构学习与源码分析。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…...

PHP最简单自定义自己的框架定义常量自动生成目录(三)

1、框架入口增加模块定义&#xff0c;实现多模块功能 index.php 定义模块 <?php //定义当前请求模块 define("MODULE",index); require "./core/KJ.php"; 创建后台模块admin.php <?php define("MODULE",admin); require "./cor…...

栈和队列详解

目录 栈 栈的概念及结构&#xff1a; 栈的实现&#xff1a; 代码实现&#xff1a; Stack.h stack.c 队列&#xff1a; 概念及结构&#xff1a; 队列的实现&#xff1a; 代码实现&#xff1a; Queue.h Queue.c 拓展&#xff1a; 循环队列&#xff08;LeetCode题目链接&#xff0…...

数据结构 | 树的定义及实现

目录 一、树的术语及定义 二、树的实现 2.1 列表之列表 2.2 节点与引用 一、树的术语及定义 节点&#xff1a; 节点是树的基础部分。它可以有自己的名字&#xff0c;我们称作“键”。节点也可以带有附加信息&#xff0c;我们称作“有效载荷”。有效载荷信息对于很多树算法…...

Delphi7通过VB6之COM对象调用FreeBASIC写的DLL功能

VB6写ActiveX COM组件比较方便&#xff0c;不仅PowerBASIC与VB6兼容性好&#xff0c;Delphi7与VB6兼容性也不错&#xff0c;但二者与FreeBASIC兼容性在字符串处理上差距比较大&#xff0c;FreeBASIC是C化的语言&#xff0c;可直接使用C指令。下面还是以实现MKI/CVI, MKL/CVL, M…...

【Linux 网络】NAT技术——缓解IPv4地址不足

NAT技术 NAT 技术背景NAT IP转换过程NAPTNAT 技术的缺陷 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&#xff0c;是解决IP地址不足的主要手段&#xff0c;并且能够有效地避免来自网络外部的攻击&#xff0c;隐藏并保护网络内部的计算…...

Flink 两阶段提交(Two-Phase Commit)协议

Flink 两阶段提交&#xff08;Two-Phase Commit&#xff09;是指在 Apache Flink 流处理框架中&#xff0c;为了保证分布式事务的一致性而采用的一种协议。它通常用于在流处理应用中处理跨多个分布式数据源的事务性操作&#xff0c;确保所有参与者&#xff08;数据源或计算节点…...

【Docker晋升记】No.2 --- Docker工具安装使用、命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…...

[OnWork.Tools]系列 00-目录

OnWork.Tools系列文章目录 OnWork.Tools系列 01-简介_末叶的博客-CSDN博客OnWork.Tools系列 02-安装_末叶的博客-CSDN博客OnWork.Tools系列 03-软件设置_末叶的博客-CSDN博客OnWork.Tools系列 04-快捷启动_末叶的博客-CSDN博客OnWork.Tools系列 05-系统工具_末叶的博客-CSDN博…...

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 &#xff08;一&#xff09;Cadvisor Cadvisor 产品特点&#xff1a; &#xff08;二&#xff09;InfluxDB InfluxDB应用场景&#xff1a; InfluxDB主要功能&#xff1a; InfluxDB主要特点&#xff1a; &#xff08;三&#…...

AtcoderABC222场

A - Four DigitsA - Four Digits 题目大意 给定一个整数N&#xff0c;其范围在0到9999之间&#xff08;包含边界&#xff09;。在将N转换为四位数的字符串后&#xff0c;输出它。如果N的位数不足四位&#xff0c;则在前面添加必要数量的零。 思路分析 可以使用输出流的格式设…...

架构实践方法

一、识别复杂度 将主要的复杂度问题列出来&#xff0c;然后根据业务、技术、团队等综合情况进行排序&#xff0c;优先解决当前面临的最主要的复杂度问题。对于按照复杂度优先级解决的方式&#xff0c;存在一个普遍的担忧&#xff1a;如果按照优先级来解决复杂度&#xff0c;可…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...