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

Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据

隶属文章: Java高级 | (二十二)Java常用类库-CSDN博客

系列文章: Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客

                   Java高级 | 【实验二】Springboot 控制器类+相关注解知识-CSDN博客

                   Java高级 | 【实验三】Springboot 静态资源访问-CSDN博客

目录

一、搭建项目

1.1 创建项目

1.2 创建实体类

1.3 创建控制类

1.4 解决在前后端分离项目中的跨域问题

1.5 主类扫描控制器类

二、Spring Boot接收前端参数方式

2.1 接收非JSON数据

1. 名称一致

①postman工具测试

②通过Axios发送请求

2、名称不一致

①postman工具测试

 ②通过Axios发送请求

3、接收前端传数组参数

①postman工具测试

②通过Axios发送请求

4、接收实体(对象)参数

①postman工具测试

②通过Axios发送请求

5、前端参数与后端方法处理参数不一致的情况(RESTful风格)

①postman工具测试

②通过Axios发送请求

6、通过HttpServletRequest对象获取前端数据

①postman工具测试

②通过Axios发送请求

2.2 接收JSON数据

1、接收单个实体

①postman工具测试

②通过Axios发送请求

2、接收多个实体(一个实体嵌套另外一个实体)

在UserController类中添加add7()请求处理方法

①postman工具测试

②通过Axios发送请求

3、接收多个实体(一个实体嵌套另外一个实体集合)

①postman工具测试

②通过Axios发送请求

4、接收Map集合参数

①postman工具测试

②通过Axios发送请求

三、Spring Boot返回Json数据

3.1 Json简介

3.2 spring boot注解

3.3 实验验证

3.3.1对象转换为json

1、单个实体转换json并返回

①postman工具测试

2、多个实体转换json并返回

①postman工具测试

3、map集合转换json并返回

①postman工具测试

3.3.2字符串转换为json

1、引入依赖

2、编写控制器

3、postman测试

3.3.3封装统一的JSON返回数据结构

1、新建包和相关类

2、控制器类中编写处理自定义返回数据的方法

3、postman测试


在前后端项目交互中,前端传递的数据可以通过HTTP请求发送到后端。

一、搭建项目

1.1 创建项目

说明:如果没有安装Lombok工具,请自行安装。

接下来的部分工程文件目录

1.2 创建实体类

在java包下创建一个名为“pojo”的包。并在该包中创建User和Car类

package pojo;import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.Date;
@Data
@Component
public class User {private Integer id;private String name;private Integer age;private Boolean isMarried;private Date birth;private Car car;
}
package pojo;import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
public class Car {private String name;private Double price;
}

1.3 创建控制类

在java包下创建一个名为“controller”的包。并在该包中创建UserController类。

package controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("users")
@RestController
public class UserController {}

1.4 解决在前后端分离项目中的跨域问题

在controller包中创建一个名为CrossOriginConfig的java类。

通过实现WebMvcConfigurer接口,并重写addCorsMappings(CorsRegistry registry)方法来实现。

1.5 主类扫描控制器类

GetDatafromfrontApplication类中加入注解,使得该类启动时能扫描到我们自己创建的控制器类。

package com.example.getdatafromfront;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {"controller"})
@SpringBootApplication
public class GetDatafromfrontApplication {public static void main(String[] args) {SpringApplication.run(GetDatafromfrontApplication.class, args);}
}

二、Spring Boot接收前端参数方式

2.1 接收非JSON数据

@RequestParam主要用于在Spring MVC后台控制层获取参数,它有三个常用参数。

参数名

描述

defaultValue

表示设置默认值

required

表示该参数是否必传

value

值表示接收传入的参数的key

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出URL模板中的变量作为参数。

1名称一致

前端请求参数的key需和后端控制层处理请求的方法参数名称一致。

在UserController类中添加add1()请求处理方法

说明:spring boot能够接收两个参数:usernamepassword

前端参数名必须为:usernamepassword。

GET和POST请求都支持

前端的get请求格式为:

http://localhost:8080/users/add1?username=xxx&password=xxxxx

postman工具测试

通过Axios发送请求

创建param01.html页面,通过Axios发送请求。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '王小虎',password: '123456'}},mounted() {axios.get('http://localhost:8080/ users/add1', {params: {username: this.username,password: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script></body>
</html>

2、名称不一致

前端请求参数的key后端控制层处理请求的方法参数 名称不一致

在UserController类中添加add2()请求处理方法,该方法使用@RequestParam注解来解决前后端参数不一致。

package controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("users")
@RestController
public class UserController {@RequestMapping("add1")public void add1(String username, String password) {System.out.println("username=" + username + ", password=" + password);}@RequestMapping("add2")public void add2(@RequestParam("name") String username, @RequestParam("pwd") String password) {System.out.println("username=" + username + ", password=" + password);}
}

该方法对GET和POST请求都支持。

前端请求格式:http://localhost:8080/users/add2?name=xxx&pwd=xxx

postman工具测试

 通过Axios发送请求

创建param02.html页面,通过Axios发送请求。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '张小三',password: '654321'}},mounted() {axios.get('http://localhost:8080/users/add2', {params: {name: this.username,pwd: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

3、接收前端传数组参数

在UserController类中添加delete1()请求处理方法。

//处理前端数组参数@DeleteMapping("batch_delete1")public void delete1(@RequestParam(name = "ids") List<Integer> ids) {for (Integer id : ids) {System.out.println(id);}}
postman工具测试

通过Axios发送请求

创建param03.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {ids: [3, 3, 5]}},mounted() {axios.delete('http://localhost:8080/users/batch_delete1', {params: {ids: this.ids.join(',')}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

4、接收实体(对象)参数

(1)前端请求参数的key需和后端控制层处理请求方法的参数pojo实体类的属性名称一致

在UserController类中添加add3()请求处理方法。

 //把前端数据封装到一个对象中@RequestMapping("add3")public void add3(Car car) {System.out.println(car);}
postman工具测试

通过Axios发送请求

创建param04.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
</div>
<script>const app = {data() {return {name: '问界M9',price: 550000}},mounted() {axios.get('http://localhost:8080/users/add3', {params: {name: this.name,price: this.price}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

5、前端参数与后端方法处理参数不一致的情况(RESTful风格)

在UserController类中添加add4()请求处理方法。

@RequestMapping("add4/{username}/{pwd}")public void add4(@PathVariable String username, @PathVariable("pwd") String password) {System.out.println("username=" + username + ", password=" + password);}

使用@PathVariable注解将请求URL中的模板变量映射到功能处理方法的参数上,如果模板变量名称和方法的参数名称不同需要在@PathVariable注解上显示的指定映射关系。

postman工具测试

通过Axios发送请求

创建param05.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">前后端参数传递</div>
<script>const app = {data() {return {username: 'Jack',password: '123456'}},mounted() {axios.post(`http://localhost:8080/users/add4/${this.username}/${this.password}`).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

6、通过HttpServletRequest对象获取前端数据

在UserController类中添加add5()请求处理方法。

 @RequestMapping("add5")public void add5(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username=" + username + ", password=" + password);}

通过HttpServletRequest对象获取数据,前端请求参数的key需和getParameter(String name)方法传递的参数名称一致

postman工具测试

通过Axios发送请求

创建param06.html页面,通过Axios发送请求.

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '章小花',password: '123456'}},mounted() {axios.post('http://localhost:8080/users/add5', null, {params: {username: this.username,password: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

2.2 接收JSON数据

 @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

如果前端通过application/json类型提交JSON格式的数据给后端控制层处理请求的方法,方法的参数必须使用@RequestBody注解进行修饰,才能接收来自前端提交的JSON数据。

1、接收单个实体

在UserController类中添加add6()请求处理方法。

@RequestMapping("add6")public Car add6(@RequestBody Car car){System.out.println(car);return car;}
postman工具测试

通过Axios发送请求

创建param07.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {car: {name: '奔驰',price: 20000}}},mounted() {axios.post('http://localhost:8080/users/add6', this.car).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

2、接收多个实体(一个实体嵌套另外一个实体)

在pojo包下创建Cat实体类,在pojo包下的Person实体类中声明Cat类型的属性

package pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat {private Integer id;private String breed;private String name;
}
package pojo;import lombok.Data;
import lombok.ToString;@Data
@ToString
public class Person {private Integer id;private String username;private String password;private Cat cat;
}
在UserController类中添加add7()请求处理方法
@RequestMapping("add7")public Person add7(@RequestBody Person person) {System.out.println(person);return person;}
postman工具测试
{"id": 1,"username": "Jack","password": "123456","cat": {"id": 1,"breed": "波斯","name": "花花"}
}

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {user: {id: 1,username: '张三',password: '123456',cat: {id: 1,breed: '波斯',name: '花花'}}}},mounted() {axios.post('http://localhost:8080/users/add7', this.user).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.response.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

3、接收多个实体(一个实体嵌套另外一个实体集合)

  • 创建课程实体(Course):在pojo包下创建Course实体类,Student类,一个学生可以选修多门课程。
  • 创建学生实体(Student)
package pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Course {private Integer id;private String courseName;private String lecturer;
}
package pojo;import lombok.Data;
import lombok.ToString;import java.util.List;@Data
@ToString
public class Student {private Integer id;private String username;private List<Course> courses;
}

在UserController类中添加add8()请求处理方法

@RequestMapping("add8")public Student add8(@RequestBody Student student) {System.out.println(student);return student;}
postman工具测试

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>前后端参数传递</title><!-- 使用单一Vue版本 --><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {student: {id: 1,username: 'tom',courses: [{id: 1,courseName: "Java",lecturer: "李晓洪教授"},{id: 2,courseName: "Python",lecturer: "张晓东讲师"}]}}},mounted() {axios.post('http://localhost:8080/users/add8', this.student).then(response => {console.log('请求成功', response.data);}).catch(error => {console.error('请求失败', error.response?.data || error.message);});}}Vue.createApp(app).mount('#app');
</script>
</body>
</html>

4、接收Map集合参数

在UserController类中添加add9()请求处理方法

@RequestMapping("add9")public Map<String, Object> add9(@RequestBody Map<String, Object> map) {String username = (String) map.get("username");System.out.println("username : " + username);List<Map<String, Object>> courseMapList = (List<Map<String, Object>>) map.get("courses");for (Map<String, Object> courseMap : courseMapList) {Set<Map.Entry<String, Object>> courseSet = courseMap.entrySet();for (Map.Entry<String, Object> entry : courseSet) {String key = entry.getKey();Object value = entry.getValue();System.out.println(key + " : " + value);}}return map;}
postman工具测试

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>前后端参数传递</title><!-- 使用单一Vue版本 --><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {user: {id: 1,username: 'tom',courses: [{id: 1,courseName: "Java",lecturer: "黄晓明副教授"},{id: 2,courseName: "Python",lecturer: "张晓东教授"},{id: 3,courseName: "数据结构与算法",lecturer: "潘晓婷教授"}]}}},mounted() {axios.post('http://localhost:8080/users/add9', this.user).then(response => {console.log('请求成功', response.data);}).catch(error => {console.error('请求失败', error.response?.data || error.message);});}}Vue.createApp(app).mount('#app');
</script>
</body>
</html>

三、Spring Boot返回Json数据

 通常在项目开发中,接口与接口之间,前后端之间的数据传输都是使用的JSON格式

3.1 Json简介

  • json是一种纯字符数据,不属于编程语言json的语法与js中object的语法几乎一致
  • json数据中的键值对可以使用编程语言中所谓的关键字
  • json的数据可以用花括号{}或中括号[]包裹,对应js中的object和array,例如:
{"name":"admin","age":18}或者["SpringBoot",3.1415,"json"]
  • json数据以键值对形式存在,多个键值对之间用逗号,隔开,但数据结束后,不允许出现没有意义的逗号,键值对的键和值之间用冒号连接,键值对的键部分,必须用双引号包裹,单引号都不行;键值对的值部分,不允许出现函数function,undefined,NaN,但是可以有null

3.2 spring boot注解

@RestController = @controller + @ResponseBody,而@ResponseBody注解的作用就是将返回的数据转换JSON格式。因此在SpringBoot中 使用@RestController 注解即可将返回的数据结构转换成 JSON 格式。

3.3 实验验证

3.3.1对象转换为json

1、单个实体转换json并返回

在UserController类中添加getCourse()请求处理方法。

@RequestMapping("/course")public Course getCourse(){return new Course(1001,"web开发技术","李华教授");}
postman工具测试

2、多个实体转换json并返回

在UserController类中添加getCourseList()请求处理方法。

@RequestMapping("/list")
public List<Course> getCourseList() {List<Course> courseList = new ArrayList<>();Course course1 = new Course(1001, "c程序设计", "黄忠教授");Course course2 = new Course(1002, "Java程序设计", "张菲教授");courseList.add(course1);courseList.add(course2);return courseList;
}
postman工具测试

3、map集合转换json并返回

在UserController类中添加getMap()请求处理方法。

@RequestMapping("/map")public Map<String, Object> getMap() {Map<String, Object> courseMap = new HashMap<>();Course course = new Course(1001, "c程序设计", "黄忠教授");courseMap.put("课程信息", course);courseMap.put("课程学分", 3);courseMap.put("课程性质", "专业选修课");courseMap.put("课程学时", 48);return courseMap;}
postman工具测试

3.3.2字符串转换为json

如何将String类型转换成json格式?

我们知道@Controller如果遇到字符串会去寻找view的路径映射,而@RestController如果遇到字符串就会直接返回字符串。因此,@RestController无法将字符串直接转换成json。

1、引入依赖

这里我们引入fastjso,在pom.xml中加入如下依赖

<!--  引入--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>

2、编写控制器

在UserController类中添加getStringToJson()请求处理方法。

 @RequestMapping("/string-json")public String getStringToJson(){String str = "{'result': 'success','msg': '登陆成功'}";JSONObject jsonObject =  JSON.parseObject(str);System.out.println(jsonObject);//提取json部分内容System.out.println(jsonObject.getString("cases"));return jsonObject .toJSONString();}
3、postman测试

3.3.3封装统一的JSON返回数据结构

       在项目开发中,我们不仅需要封装数据,还需要在返回的JSON数据中添加一些其他信息,比如返回状态码code,返回信息msg等,这些信息有助于调用者进行一些简单的逻辑判断。因此,我们需要封装一个统一的JSON返回数据结构。

封装的JSON数据类型的不确定,所以我们在定义统一的JSON结构时,需要利用泛型。

1、新建包和相关类

创建common包和CommonConst、R类

package common;/**
定义Json数据返回的一些常量*/
public class CommonConst {public static final String SUCCESS_RESULT = "获取信息成功";public static final String ERROR_RESULT = "获取信息成功";
}
package common;import lombok.Data;
@Data
public class R<T> {/*** 编码:1成功,0和其它数字为失败*/private Integer code;/*** 信息返回*/private String msg;/*** 信息返回数据*/private T data;public static <T> R<T> success(T object) {R<T> r = new R<T>();r.data = object;r.code = 1;r.msg = CommonConst.SUCCESS_RESULT;return r;}public static <T> R<T> error(String msg) {R r = new R();r.msg = msg;r.code = 0;return r;}
}
2、控制器类中编写处理自定义返回数据的方法

在UserController类中添加getStringToJson()请求处理方法。

 @RequestMapping("/map-json")public R<Map<String, Object>> getMapJson() {Map<String, Object> courseMap = new HashMap<>();Course course = new Course(1001, "c程序设计", "黄忠教授");courseMap.put("课程信息", course);courseMap.put("课程学分", 3);courseMap.put("课程性质", "专业选修课");courseMap.put("课程学时", 48);return R.success(courseMap);}
3、postman测试

相关文章:

Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据

隶属文章&#xff1a; Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a; Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot …...

云数据库选型指南:关系型 vs NoSQL vs NewSQL的企业决策

在云时代&#xff0c;数据库选型直接关系到企业应用性能和成本效益。本文深入分析三大数据库类型&#xff0c;助您做出明智决策。 目录概览 关系型数据库&#xff1a;经典之选NoSQL数据库&#xff1a;灵活应对非结构化数据NewSQL数据库&#xff1a;融合的优势三大数据库对比分…...

Prj08--8088单板机C语言8255读取按键码

1.验证结果 2.代码片 key_codeinp(PORT_8255_C)&0x0f;tiny_sprintf(buffer,"Key_code 0X%x \r\n",key_code);uart_str_send(buffer); 3.完整代码 #include "tiny_stdarg.h" // 使用自定义可变参数实现#define ADR_273 0x0200 #define ADR_244 0x…...

蜜獾算法(HBA,Honey Badger Algorithm)

2021年由Hashim等人提出&#xff08;论文&#xff1a;Honey Badger Algorithm: A New Metaheuristic Algorithm for Solving Optimization Problems&#xff09;。模拟蜜獾在自然界中的智能捕食行为&#xff0c;属于群体智能优化算法&#xff08;与粒子群PSO、遗传算法GA同属一…...

Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互

在工业自动化领域&#xff0c;Modbus协议是一种广泛应用的串行通信协议&#xff0c;它定义了主站和从站之间的通信规则和数据格式。罗克韦尔PLC是一种可编程的逻辑控制器&#xff0c;通过Modbus协议实现与其他设备之间的数据交互。然而&#xff0c;随着以太网技术的普及和发展&…...

飞算JavaAI 炫技赛重磅回归!用智能编码攻克老项目重构难题

深夜还在排查十年前Hibernate框架埋下的N1查询隐患&#xff1f;跨语言迁移时发现SpringMVC控制器里的业务逻辑像一团乱麻&#xff1f;当企业数字化进入深水区&#xff0c;百万行代码的老系统就像一座随时可能崩塌的"技术债冰山"。近日&#xff0c;飞算科技发布JavaAI…...

青少年编程与数学 02-020 C#程序设计基础 15课题、异常处理

青少年编程与数学 02-020 C#程序设计基础 15课题、异常处理 一、异常1. 异常的分类2. 异常的作用小结 二、异常处理1. 异常处理的定义2. 异常处理的主要组成部分3. 异常处理的作用小结 三、C#异常处理1. 异常的基本概念2. 异常处理的关键字3. 异常处理的流程4. 自定义异常5. 异…...

Electron打包前端和后端为exe

文章目录 什么是Electron&#xff1f; 安装electron过程 其他git项目地址比较好的文章electron的替代品安装报错 npm ERR! request to https://registry.npm.taobao.org/electron failed, reason: certificate has expired安装提示 npm WARN deprecated boolean3.2.0: Package …...

unix/linux,sudo,一个强大且灵活的工具,允许一个被授权的用户以另一个用户(通常是root,即超级用户)的身份来执行命令

sudo:不仅仅是“用管理员权限运行” sudo 这个词,来源于 SuperUser DO (或者 Substitute User DO,后者的含义更为广阔和准确)。它是一个强大且灵活的工具,允许一个被授权的用户以另一个用户(通常是root,即超级用户)的身份来执行命令。 1. Unix/Linux 的权限哲学:最小…...

JavaScript 二维数组初始化:为什么 fill([]) 是个大坑?

JavaScript 二维数组初始化&#xff1a;为什么 fill([]) 是个大坑&#xff1f; 今天刷leetcode的时候&#xff0c;遇到一个神奇的bug。 当我修改数组中的一个元素&#xff0c;却意外影响了其他所有元素&#xff1f;&#xff1f;&#xff1f;。 问题重现&#xff1a;诡异的数组…...

项目任务,修改svip用户的存储空间。

修改存储空间 3GB->5GB&#xff0c;这是项目任务&#xff0c;首先有人任务就要去思考实现思路&#xff0c;首先存储空间&#xff0c;也就是说不只是前端样式3GB改一下就可以了&#xff0c;那用户实际还是3GB&#xff0c;所以我们去网站看后端谁返回给我们了3GB&#xff0c;我…...

TypeScript 全面学习指南 (2025最新版)

TypeScript 全面学习指南 目录 TypeScript 简介环境搭建与工具基础类型变量声明接口&#xff08;Interfaces&#xff09;类&#xff08;Classes&#xff09;函数&#xff08;Functions&#xff09;泛型&#xff08;Generics&#xff09;枚举&#xff08;Enums&#xff09;类型…...

【redis】过期策略 懒惰删除

过期删除&#xff1a; redis会将所有设置过期时间的key以及过期时间存储在字典里。 redis采取两个策略实现删除过期key&#xff1a; 1、定时删除&#xff1a;定期扫描字典&#xff0c;采用贪心的策略&#xff0c;从字典随机抽20个key&#xff0c;删除其中已经过期的key&#x…...

Docker或Docker-Compose时间时区配置

Docker或Docker-Compose配置时区&#xff0c;主要是为了使用容器内的时间和物理机操作系统的时间保持一致。以下是集中配置Docker或Docker-Compose环境时间时区的方式。 Dockerfile&#xff08;Docker&#xff09;中配置时区 在Dockerfile中&#xff0c;可以通过如下方式添加…...

如何在IDE中通过Spark操作Hive

在IDE中通过Spark操作Hive是一项常见的任务&#xff0c;特别是在大数据处理和分析的场景中。本文将详细介绍如何在集成开发环境&#xff08;IDE&#xff09;中使用Apache Spark与Hive进行交互&#xff0c;包括必要的设置、代码示例以及详细解释。 环境准备 在开始之前&#x…...

ToolsSet之:XML工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Text菜单下的XML Tool工具是一个Xml工…...

keepalived定制日志bug

keepalived定制日志bug 源码安装apt安装endl 源码安装 在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf [rootubuntu24-13:~]# vim /etc/rsyslog.d/keepalived.conf [rootubuntu24-13:~]# cat /etc/rsyslog.d/keepalived.conf local6.* /var/log/keepa…...

ElasticSearch+Gin+Gorm简单示例

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…...

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)

数据库系统概论&#xff08;十三&#xff09;详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么&#xff1f;2.插入单条数据&#xff08;插入元组&#xff09;场景 1&#xff1a;指定部分列插入场景 2&#xff1a;不指定列名&#xff08;插入所有列&#xff09;场景 3&…...

JVMTI 在安卓逆向工程中的应用

JVMTI 在安卓逆向工程中的应用 JVMTI 在安卓逆向工程中扮演着重要角色&#xff0c;尤其是在分析和修改 Java 层应用行为时。以下是其核心应用场景、实现方式及典型工具&#xff1a; 一、核心应用场景 1. 动态代码注入与 hook 通过 JVMTI 可以在运行时修改或拦截 Java 方法&…...

极客时间-《搞定音频技术》-学习笔记

极客时间-《搞定音频技术》-学习笔记 语音基础知识 https://www.zhangzhenhu.com/audio/feature.html 序章-0 作者说这个语音技术啊&#xff0c;未来肯定前景大好啊&#xff0c;大家都来学习&#xff0c;然后给出了课程的脑图 音频基础 什么是声音 声音的三要素是指响度、…...

网络攻防技术十三:网络防火墙

文章目录 一、网络防火墙概述1、网络型防火墙&#xff08;网络防火墙&#xff09;2、Web应用防火墙3、数据库防火墙4、主机防火墙&#xff08;个人防火墙&#xff09;5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙&#xff08;状态检测/动…...

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件

代码&#xff1a;express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库&#xff1b; 启动 Sqlite3 时默认开启 WAL 模式&#xff0c;避免读写互锁&#xff0c;支持并发读&#xff1b; 利用 Conf 实现主进程与 Ex…...

CppCon 2015 学习:A C++14 Approach to Dates and Times

Big Picture — 日期库简介 扩展 标准库 这个库是对 C 标准库中 <chrono> 的自然延伸&#xff0c;专注于处理“日历”相关的功能&#xff08;比如年月日、闰年、节假日等&#xff09;&#xff0c;而不仅仅是时间点和时长。极简设计 它是**单头文件&#xff08;header-on…...

基于CNN的OFDM-IM信号检测系统设计与实现

基于CNN的OFDM-IM信号检测系统设计与实现 摘要 本文详细研究了基于卷积神经网络(CNN)的正交频分复用索引调制(OFDM-IM)信号检测方法。通过在不同信噪比(SNR)和信道条件下进行系统仿真,对比分析了CNN检测器与传统最大似然(ML)检测器的误码率(BER)性能和计算复杂度。实验结果表…...

macos常见且应该避免被覆盖的系统环境变量(避免用 USERNAME 作为你的自定义变量名)

文章目录 macos避免用 USERNAME 作为你的自定义变量名macos常见且应该避免被覆盖的系统环境变量 macos避免用 USERNAME 作为你的自定义变量名 问题&#xff1a; 你执行了&#xff1a;export USERNAME“admin” 然后执行&#xff1a;echo ${USERNAME} 输出却是&#xff1a;xxx …...

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…...

深入理解CSS常规流布局

引言 在网页设计中&#xff0c;理解元素如何排列和相互作用至关重要。CSS提供了三种主要的布局方式&#xff1a;常规流、浮动和定位。本文将重点探讨最基础也是最常用的常规流布局&#xff08;Normal Flow&#xff09;&#xff0c;帮助开发者掌握页面布局的核心机制。 什么是…...

DOCKER使用记录

1、拉取镜像 直接使用docker pull <image>&#xff0c;大概率会出现下面的报错信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …...

MYSQL中常见的函数和使用

字符串函数 CONCAT(str1,str2,...,strN) &#xff1a;用于将多个字符串连接成一个字符串。例如&#xff0c;SELECT CONCAT(SQL, , 函数) &#xff0c;结果为 “SQL 函数”。 LOWER(str) &#xff1a;将字符串中的所有字母转换为小写。例如&#xff0c;SELECT LOWER(MySQL Fun…...