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

news2025/6/7 15:05:21

隶属文章: 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测试

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

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

相关文章

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…

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…

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

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

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

极客时间-《搞定音频技术》-学习笔记 语音基础知识 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…

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

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

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 …

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署

目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下&#xff0c;安装完成 3.安装cuDVV环境变量的配置测试一下&#xff0c;安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下&#xff0c;下载pytorch6.验证是否安装成功7.在jupyter noteboo…

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构

区块链基础&#xff1a;从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场&#xff0c;或者一个国家的…

TCP小结

1. 核心特性 面向连接&#xff1a;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保通信双方状态同步。 TCP连接建立的3次握手 抓包&#xff1a; client发出连接请求&#xff1b; server回应client请求&#xff0c;并且同步发送syn连接&#xff1b; clien…

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

在 Python 开发中&#xff0c;创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml&#xff0c;并通过一个实际项目示例&#xff0c;展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

python入门(1)

第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中&#xff0c;默认的编码方式是ASCII编码方式&#xff0c;如果程序中用到了中文&#xff0c;直接输出结果很可能会…

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现

应用场景 该应用主要用于企业财务部门或个人处理大量电子发票&#xff0c;实现以下功能&#xff1a; 自动从 PDF 电子发票中提取关键信息&#xff08;如发票号码、日期、金额、销售方等&#xff09;将提取的信息整理并导出到 Excel 表格&#xff0c;方便进行财务统计和报销使…

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA&#xff01; 三、如何使用SmolVLA&#xff1f; 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型&#xff08;VLM&#xff09; 5.2 动作专家&#xff1a;流匹…