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

SpringMVC学习(一)——请求与响应处理

目录

一、SpringMVC简介

二、@RequestMapping:请求路径映射

三、@RestController

四、请求限定

五、请求处理

1.使用普通变量,收集请求参数

2.使用@RequestParam明确指定获取参数 

3.目标方法参数是一个pojo 

4.@RequestHeader:获取请求头信息       

5.@CookieValue注解:获取cookie信息

6.使用pojo级联封装复杂属性

7.@RequestBody:获取请求体的JSON数据

8.单/多文件上传

9.HttpEntity:获取整个请求

10.传入原生API

六、响应处理

1.返回JSON:自动将返回的对象转为JSON格式

2.文件下载


一、SpringMVC简介

        Spring MVC是一个基于Java的实现MVC(Model-View-Controller)设计模式的Web应用程序框架。它是Spring框架的一部分,专门用于构建Web应用程序。以下是Spring MVC的一些关键特性:

  1. 请求驱动:Spring MVC以请求为中心,所有的操作都是围绕请求进行的。

  2. 灵活的控制器:开发者可以定义自己的控制器来处理请求,控制器可以是一个普通的 Java类,里面包含一个或多个处理请求的方法。

  3. 视图解析器:Spring MVC提供了灵活的视图解析机制,可以根据返回值自动选择视图模板进行渲染。

  4. 数据绑定:Spring MVC提供了强大的数据绑定功能,可以将请求参数自动绑定到控制器方法的参数上。

  5. 模型和视图:控制器可以向视图传递模型数据,这些数据可以是简单的值,也可以是复杂的对象。

  6. 拦截器:Spring MVC支持拦截器,可以在请求处理的不同阶段执行自定义逻辑。

  7. 异常处理:Spring MVC提供了异常处理器,可以集中处理控制器方法抛出的异常。

  8. 国际化:Spring MVC支持国际化,可以根据不同地区的用户显示不同的内容。

  9. 集成测试:Spring MVC提供了测试支持,可以方便地进行集成测试。

  10. RESTful 支持:Spring MVC支持构建RESTful Web服务。

        Spring MVC通过注解(如@Controller、@RequestMapping、@RequestParam等)简化了配置和开发过程,使得开发者可以更专注于业务逻辑的实现。它与Spring框架的其他模块(如Spring Security、Spring Data JPA)紧密集成,提供了一个完整的企业级Web应用程序开发解决方案。

二、@RequestMapping:请求路径映射

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
@Controller
public class HelloController {@ResponseBody  // 把返回值放到响应体中@RequestMapping("/hello")public String hello(){return "hello 你好~~"; // 默认认为返回值是跳到一个页面}
}

  

精确路径必须全局唯一

路径位置通配符:多个都能匹配上,精确匹配优先

        * :匹配任意多个字符(0~n):不能匹配多个路径

        **:匹配任意多层路径

        ? :匹配任意单个字符(1)

精确程度:完全匹配 > ? > * > **

三、@RestController

        @RestController用于定义一个控制器类,该类中的所有方法默认返回的是数据而不是视图。
        作用:@RestController是@Controller和@ResponseBody的组合注解。它表明该类中的所有方法返回的数据直接写入HTTP响应体中,而不是返回一个视图。
        使用场景:通常用于构建RESTful Web 服务,返回JSON或XML格式的数据。

四、请求限定

@RestController
public class RequestMappingLimitController {/*** 限制请求方式*/@RequestMapping(value = "/test01", method = {RequestMethod.POST, RequestMethod.GET})public String test01() {return "test01";}/*** 限制请求参数*/@RequestMapping(value = "/test02", params = {"age=18", "username", "gender!=1"})public String test02() {return "test02";}/*** 限制请求头*/@RequestMapping(value = "/test03", headers = {"username=admin"})public String test03() {return "test03";}/*** 限制请求内容类型* application/json:表示浏览器必须使用json格式发送数据*/@RequestMapping(value = "/test04", consumes = "application/json")public String test04() {return "test04";}/*** 限制响应内容类型* text/html;charset=utf-8:表示浏览器必须使用html格式接收数据*/@RequestMapping(value = "/test05", produces = "text/html;charset=utf-8")public String test05() {return "<h1>test05<h1>";}
}

五、请求处理

1.使用普通变量,收集请求参数

@RequestMapping("/handle01")
public String handle01(Integer id,String name) {System.out.println(id);System.out.println(name);return "ok";
}

2.使用@RequestParam明确指定获取参数 

defaultValue:如果参数没有传递,则使用默认值
required:是否必须传递,默认为true
value:指定参数名
无论请求参数带到了请求体中,还是没有带到请求体中,都可以直接用@RequestParam或者同一个变量名获取到参数值。

@RequestMapping("/handle02")
public String handle02(@RequestParam("id") Integer id,@RequestParam(required = false, defaultValue = "admin") String name) {System.out.println(id);System.out.println(name);return "ok";
}

3.目标方法参数是一个pojo 

如果目标方法参数是一个pojo:SpringMVC会自动把请求参数和pojo属性对应起来
效果:1.pojo的所有属性值都是来自于请求参数
           2.请求参数必须和pojo属性名一致,否则无法对应
           3.如果请求参数没有和pojo属性对应上,封装为null,也可以给出默认值 

@RequestMapping("/handle03")
public String handle03(Person person) {System.out.println(person);return "ok";
}

运行结果: 

Person(id=12, name=李四)

4.@RequestHeader:获取请求头信息       

@RequestMapping("/handle04")
public String handle04(@RequestHeader("host") String host,@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept") String Accept) {System.out.println(host);System.out.println(userAgent);System.out.println(Accept);return "ok";
}

5.@CookieValue注解:获取cookie信息

@RequestMapping("/handle05")
public String handle05(@CookieValue String username) {System.out.println(username);return "ok";
}

  

6.使用pojo级联封装复杂属性

@Data
public class Person {private Integer id;private String name;private Address address;private String[] hobbies;
}@Data
public class Address {private String street;private String city;private String state;private String zipCode;
}
@RequestMapping("/handle06")
public String handle06(Person person) {System.out.println(person);return "ok";
}

运行结果:  

Person(id=101, name=admin, address=Address(street=平安大街, city=北京, state=东城区, zipCode=100101), hobbies=[唱, 跳, rap, 篮球])

7.@RequestBody:获取请求体的JSON数据

@RequestBody:获取请求体的JSON数据,自动转为对象

  • 如果是@RequestBody Person person:则得到一个对象
  • 如果是@RequestBody String str:则直接接收JSON字符串
@RequestMapping("/handle07")
public String handle07(@RequestBody Person person) {System.out.println(person);return "ok";
}

运行结果:

Person(id=101, name=admin, address=Address(street=平安大街, city=北京, state=东城区, zipCode=100101), hobbies=[唱, 跳, rap, 篮球])

8.单/多文件上传

@RequestParam取出文件项,封装为MultipartFile,就可以拿到文件内容

application.properties: 

# 每个单独上传的文件不能超过 50MB
spring.servlet.multipart.max-file-size=50MB
# 限制整个 multipart/form-data 请求的最大允许大小
spring.servlet.multipart.max-request-size=100MB
@RequestMapping("/handle08")
public String handle08(Person person,@RequestParam("headerImg") MultipartFile headerImgFile,@RequestParam("lifeImg") MultipartFile[] lifeImgFiles) throws IOException {System.out.println(person);System.out.println("原始文件名:" + headerImgFile.getOriginalFilename());System.out.println("获取表单字段的名称:" + headerImgFile.getName());System.out.println("文件大小:" + headerImgFile.getSize());System.out.println("文件流:" + headerImgFile.getInputStream());System.out.println("文件类型:" + headerImgFile.getContentType());// 文件保存到本地headerImgFile.transferTo(new File("D:\\img\\" + headerImgFile.getOriginalFilename()));System.out.println("文件数组:" + Arrays.toString(lifeImgFiles));if (lifeImgFiles.length > 0) {for (MultipartFile lifeImgFile : lifeImgFiles) {lifeImgFile.transferTo(new File("D:\\img\\" + lifeImgFile.getOriginalFilename()));}}return "ok";
}

运行结果:

Person(id=13, name=admin, address=null, hobbies=null)
原始文件名:girl.png
获取表单字段的名称:headerImg
文件大小:4360
文件流:java.io.FileInputStream@7d79526d
文件类型:image/png
文件数组:[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@d0bebd7, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@57e61fe3, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@7f3c2d62, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@48e1e2d2]

9.HttpEntity:获取整个请求

@RequestMapping("/handle09")
public String handle09(HttpEntity<Person> entity) {// 获取请求头信息System.out.println("请求头:" + entity.getHeaders());// 获取请求体信息System.out.println("请求体:" + entity.getBody());return "ok";
}

运行结果: 

请求头:[user-agent:"Apifox/1.0.0 (https://apifox.com)", accept:"*/*", host:"localhost:8080", accept-encoding:"gzip, deflate, br", connection:"keep-alive", content-length:"281", Content-Type:"application/json;charset=UTF-8"]
请求体:Person(id=101, name=admin, address=Address(street=平安大街, city=北京, state=东城区, zipCode=100101), hobbies=[唱, 跳, rap, 篮球])

10.传入原生API

@RequestMapping("/handle10")
public void handle10(HttpServletRequest req,HttpServletResponse resp,HttpMethod method) throws IOException {System.out.println("请求方法:" + method);String username = req.getParameter("username");System.out.println(username);resp.getWriter().write("ok " + username);
}

运行结果: 

请求方法:GET
admin

六、响应处理

1.返回JSON:自动将返回的对象转为JSON格式

@RequestMapping("/resp01")
public Person resp01() {Person person = new Person();person.setId(1);person.setName("张三");Address address = new Address();address.setStreet("北七家街道");address.setCity("北京市");address.setState("北京市");address.setZipCode("100000");person.setAddress(address);person.setHobbies(new String[]{"打游戏", "看电影"});return person;
}

2.文件下载

方式一:

@RequestMapping("/download")
public ResponseEntity<InputStreamResource> download() throws IOException {try (FileInputStream fileInputStream = new FileInputStream("G:\\64q\\student\\group9\\baseProj\\src\\main\\webapp\\imgs\\girl.png");) {// 一次性读取所有文件会溢出// byte[] bytes = fileInputStream.readAllBytes();// 解决文件名中文乱码问题String encode = URLEncoder.encode("头像.png", "UTF-8");// 解决文件过大OOM问题(内存溢出)InputStreamResource resource = new InputStreamResource(fileInputStream);return ResponseEntity// 创建一个状态码为 200 (OK) 的响应.ok()// 设置响应的内容类型为二进制流,适用于文件下载。.contentType(MediaType.APPLICATION_OCTET_STREAM)// 内容大小,fileInputStream.available()只是一个估计值,并不一定准确。.contentLength(fileInputStream.available())// 添加响应头,指示浏览器将此响应作为附件下载,并设置下载后的文件名为编码后的文件名。.header("Content-Disposition", "attachment; filename=" + encode)// 设置响应体为 InputStreamResource,即文件内容.body(resource);}
}

方式二:

@AutowiredHttpServletRequest request;@GetMapping("/test1")public ResponseEntity<byte[]> download(String name) throws IOException {//获取文件路径String realPath = request.getServletContext().getRealPath("/save/");//文件的全路径String allPath = realPath + name;//获取下载需要的文件流信息FileInputStream inputStream = new FileInputStream(allPath);//获取流的数组byte[] buffer = new byte[inputStream.available()];//读取inputStream.read(buffer);//文件下载的时候,显示的名字,需要改文件名了,再修改//设置响应的头信息,告诉浏览器,返回的是文件HttpHeaders httpHeaders = new HttpHeaders();//设置响应的头信息,访问文件名中文乱码httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(name,"utf-8"));ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(buffer,httpHeaders, HttpStatus.OK);return responseEntity;}

方式三: 

@AutowiredHttpServletResponse response;@GetMapping("/test2")public void  download2(String name) throws FileNotFoundException, UnsupportedEncodingException {//获取文件路径String realPath = request.getServletContext().getRealPath("/save/");//文件的全路径String allPath = realPath + name;//判断文件是否存在File file = new File(allPath);if (!file.exists()){throw new FileNotFoundException(name+"文件不存在");}//代码能执行到这一行,说明文件肯定存在//编码格式是utf-8的文件名String encodeFileName = URLEncoder.encode(name, StandardCharsets.UTF_8.toString());//设置头信息 headerresponse.setHeader("Content-Disposition","attachment;filename*=UTF-8''"+encodeFileName);//使用 try--with --resources 关闭流try(FileInputStream inputStream = new FileInputStream(file);OutputStream outputStream = response.getOutputStream()){IOUtils.copy(inputStream,outputStream);outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}

相关文章:

SpringMVC学习(一)——请求与响应处理

目录 一、SpringMVC简介 二、RequestMapping&#xff1a;请求路径映射 三、RestController 四、请求限定 五、请求处理 1.使用普通变量&#xff0c;收集请求参数 2.使用RequestParam明确指定获取参数 3.目标方法参数是一个pojo 4.RequestHeader&#xff1a;获取请求…...

大语言模型学习工具及资源总结和落地应用

当前&#xff0c;随着人工智能技术的迅猛发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在各个领域的应用日益广泛。以下是国内外常见的大语言模型工具、已经落地部署的应用以及学习相关的网站和资源的详细介绍。 一、国内外常见的大语言模型…...

深度学习使用Anaconda打开Jupyter Notebook编码

新手入门深度学习使用Anaconda打开Jupyter Notebook编码 1. 安装Anaconda 第一种是Anaconda官网下载安装包&#xff0c;但是很慢&#xff0c;不太建议 第二种使用国内清华大学镜像源下载 选择适合自己电脑的版本&#xff0c;支持windows&#xff0c;linux系统 下载完之后自行…...

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…...

Firewalld 防火墙详解:深入理解与实践指南

在现代网络环境中&#xff0c;防火墙是保护系统和网络不受未授权访问的关键工具。firewalld是Linux系统中广泛使用的动态防火墙管理工具&#xff0c;它提供了强大的功能和灵活的配置选项。本文将深入探讨firewalld防火墙的工作原理、配置和管理&#xff0c;以及如何在实际环境中…...

在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”

1. 异常描述 在linux系统中使用jdbc访问sqlite数据库时出现如下错误提示&#xff1a; 2. 异常分析 可能是当前使用版本的sqlite-jdbc-xxx.jar版本有bug。 3. 异常解决 我是从3.8.9.1版本换到了3.16.1版本就好了。...

华为管理变革之道:管理制度创新

目录 华为崛起两大因素&#xff1a;管理制度创新和组织文化。 管理是科学&#xff0c;150年来管理史上最伟大的创新是流程 为什么要变革&#xff1f; 向世界标杆学习&#xff0c;是变革第一方法论 体系之一&#xff1a;华为的DSTE战略管理体系&#xff08;解决&#xff1a…...

MySQL 临时表:使用技巧与最佳实践

MySQL 临时表&#xff1a;使用技巧与最佳实践 引言 在数据库管理系统中&#xff0c;临时表是一种常见的数据结构&#xff0c;它允许用户存储临时数据&#xff0c;这些数据只在当前会话或事务中有效。MySQL 作为一种广泛使用的数据库管理系统&#xff0c;也提供了对临时表的支…...

华为云语音交互SIS的使用案例(文字转语音-详细教程)

文章目录 题记一 、语音交互服务&#xff08;Speech Interaction Service&#xff0c;简称SIS&#xff09;二、功能介绍1、实时语音识别2、一句话识别3、录音文件识别4、语音合成 三、约束与限制四、使用1、API2、SDK 五、项目集成1、引入pom依赖2、初始化 Client1&#xff09;…...

【Rust自学】6.3. 控制流运算符-match

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 6.3.1. 什么是match match允许一个值与一系列模式进行匹配&#xff0c;并执行匹配的模式对应的代码。模式可以是字面值、变量名、通配符等…...

AIA - IMSIC之二(附IMSIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 ​​​​​​​通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…...

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…...

SQLAlchemy示例(连接数据库插入表数据)

背景需求 连接数据库&#xff0c;插入表中一些数据。 其用户是新建用户&#xff0c;所以只能插入&#xff0c;不能更新。 再次输入数据则使用更新数据语法&#xff0c;这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...

AG32 MCU 的电机控制方案

原创 AG32 AG32MCU cpld 2024年12月24日 17:23 浙江 AG32 MCU 的电机控制方案 在工业自动化、智能家居、新能源设备等众多领域&#xff0c;电机控制的精准性、稳定性和高效性至关重要。 AG32 MCU 凭借其高性能处理器、丰富的外设资源以及独特的 2K CPLD 资源&#xff0c;在电机…...

Linux:进程概念

1.冯诺依曼体系结构 结论&#xff1a; --- CPU不和外设直接打交道&#xff0c;和内存直接打交道。 --- 所有的外设&#xff0c;有数据需要收入&#xff0c;只能载入到内存中&#xff1b;内存写出&#xff0c;也一定是写道外设中。 --- 为什么程序要运行必须加载到内存&#xf…...

使用 Webpack 优雅的构建微前端应用❕

Module Federation 通常译作“模块联邦”&#xff0c;是 Webpack 5 新引入的一种远程模块动态加载、运行技术。MF 允许我们将原本单个巨大应用按我们理想的方式拆分成多个体积更小、职责更内聚的小应用形式&#xff0c;理想情况下各个应用能够实现独立部署、独立开发(不同应用甚…...

【Leetcode 热题 100】208. 实现 Trie (前缀树)

问题背景 T r i e Trie Trie 或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象。void insert(String word…...

从0开始在linux服务器上部署SpringBoot和Vue

目录 一、申请服务器的IP &#xff08;1&#xff09;阿里云申请IP &#xff08;2&#xff09;设置服务器的密码 &#xff08;3&#xff09;远程终端——MobaXterm 二、Docker &#xff08;1&#xff09;安装Docker &#xff08;2&#xff09;镜像加速 &#xff08;3&…...

41 stack类与queue类

目录 一、简介 &#xff08;一&#xff09;stack类 &#xff08;二&#xff09;queue类 二、使用与模拟实现 &#xff08;一&#xff09;stack类 1、使用 2、OJ题 &#xff08;1&#xff09;最小栈 &#xff08;2&#xff09;栈的弹出压入序列 &#xff08;3&#xf…...

代码随想录-笔记-其八

让我们开始&#xff1a;动态规划&#xff01; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution { public:int climbStairs(i…...

信号仿真高级工程师面试题

信号仿真高级工程师面试题可能涵盖多个方面,旨在全面评估应聘者的专业知识、技能水平、实践经验和问题解决能力。以下是一些可能的面试题及其简要解析: 一、专业知识与技能 描述你对信号仿真的理解 考察点:对信号仿真基本概念、原理及应用的掌握程度。参考答案:信号仿真是…...

FLTK - build fltk-1.1.10 on vs2019

文章目录 FLTK - build fltk-1.1.10 on vs2019概述笔记buildtest测试程序运行 END FLTK - build fltk-1.1.10 on vs2019 概述 看书上用到了fltk-1.1.10, 用vs2019试试能否正常编译使用? 笔记 build 从官网下载fltk-1.1.10-source.tar.bz2 用7zip解开 fltk-1.1.10-source.…...

FPGA远程升级 -- FLASH控制

简介 前文讲到如何实现XILINX芯片程序跳转&#xff0c;但升级程序是事先通过VIVADO工具将两个程序合成一个BIN文件实现升级的&#xff0c;并不能在线更新升级。要实现远程升级的能力需要对FPGA的FLASH进行在线写入升级程序。 FLASH介绍 本次设计FLASH选用的是S25FL128芯片&…...

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…...

【总结(三)】单片机重点知识总结记录(串口重定向+按键消抖+延时)

一.串口重定向 串口重定向代码如下 注意&#xff1a; 要添加头文件include "stdio.h"要勾选微库&#xff0c;即Use MicroLIB /**********重定向************/ //串口1 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff)…...

攻防世界 unserialize3

开启场景 题目为unserialize3&#xff0c;这个单词在php中代表反序列化&#xff0c;代码 __wakeup 也是php反序列化中常见的魔术方法&#xff0c;所以这个题基本就是和反序列化有关的题目。根据代码提示&#xff0c;编写一个Exploit运行&#xff0c;将对象xctf的信息序列化 得到…...

ISDP010_基于DDD架构实现收银用例主成功场景

信息系统开发实践 &#xff5c; 系列文章传送门 ISDP001_课程概述 ISDP002_Maven上_创建Maven项目 ISDP003_Maven下_Maven项目依赖配置 ISDP004_创建SpringBoot3项目 ISDP005_Spring组件与自动装配 ISDP006_逻辑架构设计 ISDP007_Springboot日志配置与单元测试 ISDP008_SpringB…...

如何注册华为云国际版账户:详细步骤指南

华为云作为全球知名的云计算服务提供商&#xff0c;提供了丰富的云服务和解决方案。无论是企业还是个人开发者&#xff0c;注册华为云国际版账户都是开启云计算之旅的第一步。我们九河云通过本文将为您详细介绍华为云国际版的注册流程。 第一步&#xff1a;访问华为云国际版官网…...

存储过程实现多个分类不同计算规则得到对应的分类、月份和款号

该存储过程 PRO_MON_MDCODE 实现多个分类不同计算规则得到对应的分类、月份和款号,其中线下分类的款最早出现时间会在20230101,最晚是当前月份后12月,电商的款取商品维表的23,24,25年商品年份的A款,其他业务分类逻辑(A-线上,B电商公司,C品牌公司)的款最早出现时间会在2…...

【LeetCode】906、超级回文数

【LeetCode】906、超级回文数 文章目录 一、通过数据量猜解法 枚举 数学 回文1.1 通过数据量猜解法 枚举 数学 回文1.2 多语言解法 二、打表法 一、通过数据量猜解法 枚举 数学 回文 1.1 通过数据量猜解法 枚举 数学 回文 减小数据规模: 先构成回文, 再平方, 再判断是否是范围…...

使 el-input 内部的内容紧贴左边

<el-inputv-model"form.invitor"placeholder"PC端的自动取当前账号的手机号"readonlyclass"no-border-input" />::v-deep(.no-border-input .el-input__inner) { border: none; box-shadow: none; padding-left: 0; /* 确保内容紧贴左边 *…...

【ES6复习笔记】模板字符串(3)

介绍 模板字符串是 ES6 引入的一种新的字符串声明方式&#xff0c;它使用反引号&#xff08;&#xff09;来定义字符串&#xff0c;而不是单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;。模板字符串可以包含变量、表达式和换行符&#xff0c;这使得它…...

Linux学习

Linux Linux目录结构 Linux只有一个顶级目录&#xff0c;称之为&#xff1a;根目录 /在Linux系统中表示 出现在开头的/表示&#xff1a;根目录 出现在后面的/表示&#xff1a;层次关系 Linux命令基础 什么是命令、命令行 命令&#xff1a;即Linux操作指令&#xff0c;是系…...

【PostgreSQL使用】最新功能逻辑复制槽的failover,大数据下高可用再添利器

逻辑复制的failover ​专栏内容&#xff1a; postgresql入门到进阶手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. ✅ &#x1f52…...

MongoDB 创建用户、User、Role 相关 操作

创建用户 # db.createUser() Creates a new user.详细 查看 db.createUser() - MongoDB Manual v8.0 设置用户 Role&#xff08;创建用户时也可以设置&#xff09; # db.grantRolesToUser() Grants a role and its privileges to a user. 详细 查看 db.grantRolesToUser(…...

在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)

一、概述 记录时间 [2024-12-26] 本文讲述如何在 Vue3 项目中使用计时器组件。具体包括开发环境的配置&#xff0c;ViteVue 项目的创建&#xff0c;Element Plus 插件的使用&#xff0c;以及计时器组件的创建和使用。 想要直接实现计时器组件&#xff0c;查看文章的第四部分。…...

Redis单线程快的原因

基于内存操作&#xff1a;Redis将数据存储在内存中&#xff0c;使得数据的读写速度极快&#xff0c;这是其性能优势的主要原因。单线程避免上下文切换&#xff1a;在多线程环境下&#xff0c;CPU核数有限&#xff0c;线程上下文切换会带来性能损耗。Redis采用单线程&#xff0c…...

基于SpringBoot的“在线BLOG网”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线BLOG网”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 在线BLOG网结构功能图 管理员登录功能界面 用户信息…...

重温设计模式--6、享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…...

springboot-starter版本升级es版本问题

一、背景说明 版本漏洞处理&#xff0c;springboot版本升级&#xff0c;es版本暂不升级&#xff0c;但是pom引用中es版本一直为7.17.15高版本&#xff0c;不想显示声明版本&#xff0c;定位具体问题&#xff0c;最后还是重新定义了版本进行处理。 二、异常情况 这里看4.4.18是…...

嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备

目录 一、概述 二、一张图说尽HA 三、HA的相关资料 四、米家集成划重点 五、总结 一、概述 小米Home Assistant 米家集成开源一周star近15k&#xff0c;迭代4个版本&#xff0c;12个贡献者 本文科普一下Home Assistant&#xff08;简称HA&#xff09;、米家集成&#xff…...

前端Python应用指南(四)Django实战:创建一个简单的博客系统

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计&#xff08;三&#xff09;Django vs Flask&#xff1a;哪种框架适…...

webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…...

快速入门Spring AI Alibaba

文章目录 前言一、环境准备二、获取API Key三、代码示例pomapplication.ymlcontroller 前言 Spring Cloud Alibaba AI 以 Spring AI 为基础&#xff0c;并在此基础上&#xff0c;基于 Spring AI 0.8.1 版本 API 完成同义系列大模型的接入实现阿里云同义系列大模型全面适配。 在…...

【mysql】MVCC及实现原理

【mysql】MVCC及实现原理 【一】介绍【1】什么是MVCC【2】什么是当前读和快照读【3】当前读&#xff0c;快照读和MVCC的关系【4】MVCC 能解决什么问题&#xff0c;好处&#xff08;1&#xff09;数据库并发场景有三种&#xff0c;分别为&#xff1a;&#xff08;2&#xff09;M…...

C++ —— 模板类与函数

C —— 模板类与函数 模板类可以用于函数的参数和返回值&#xff0c;有三种形式&#xff1a; 普通函数&#xff0c;参数和返回值是模板类的实例化版本。函数模板&#xff0c;参数和返回值是某种的模板类。函数模板&#xff0c;参数和返回值是任意类型&#xff08;支持普通类和…...

【笔记】下载mysql5.7

MySQL5.7安装超详细步骤(保姆级教程)_mysql5.7下载安装-CSDN博客 下载与安装 初次登录以及改密码 MySQL 5.7 安装教程&#xff08;全步骤图解教程&#xff09;_mysql5.7的安装教程-CSDN博客...

让 AMD GPU 在大语言模型推理中崭露头角:机遇与挑战

在当今科技飞速发展的时代&#xff0c;大语言模型&#xff08;LLM&#xff09;的兴起彻底改变了人工智能领域的格局。从智能客服到文本生成&#xff0c;从知识问答到代码编写辅助&#xff0c;大语言模型的应用无处不在&#xff0c;深刻影响着我们的生活和工作。然而&#xff0c…...

Linux运维常见命令

vi/vim快捷键使用 1)拷贝当前行 yy ,拷贝当前行向下的5行 5yy&#xff0c;并粘贴&#xff08;输入p&#xff09;。 2)删除当前行 dd ,删除当前行向下的5行5dd 3)在文件中查找某个单词 [命令行下 /关键字&#xff0c;回车查找 ,输入n就是查找下一个 ] 4)设置文件的行号&…...

前端真实面试题自用

一、写在前面 笔者&#xff0c;经过计算机学硕考研的失败后&#xff0c;想谋求一份前端工作实在是太难了。一方面&#xff0c;确实曾经学习过的东西很久没有拾起&#xff0c;另一方面&#xff0c;对于前端面经还是记忆不深刻&#xff0c;特地写此贴记录笔者在真实前端面试中遇…...