Spring Boot(快速上手)

news2024/9/23 7:27:36

Spring Boot

零、环境配置

1. 创建项目

在这里插入图片描述

在这里插入图片描述

2. 热部署

添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

配置application.properties文件:

# 热部署生效
spring.devtools.restart.enabled=true
# 设置重启目录
spring.devtools.restart.additional-paths=src/main/java
# 设置classpath目录下的 WEB-INF 文件夹内容修改为不重启
spring.devtools.restart.exclude=static/**

打开设置,快捷方式CTRL + ALT + S,进行如下设置:

在这里插入图片描述

一、控制器

在Spring Boot中,控制器(Controller)是处理HTTP请求和返回响应的组件。控制器是Spring MVC框架的一部分,用于实现模型-视图-控制器(MVC)设计模式中的控制器层。

SpringBoot提供了两种注解来表示此类负责接受和处理 HTTP 请求:@Controller@RestController,如果请求的是页面和数据,使用@Controller;如果只是请求数据,则可以使用@RestController

默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。

@RestController的使用方法

@RestController		// 注解,表示该类是一个RestController控制器
public class HelloController{
    @RequestMapping("/user")	// 映射路由
    public User getUser(){
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123");
        return user;
    }
}
// 运行代码后,在浏览器中输入"localhost:8080/user"即可查看返回结果。

通常情况下,所写的控制器放在controller文件夹下。

二、路由

注解 @RequsetMapping主要负责 URL 的路由映射,可以添加在Controller 类或者具体的方法上。如果添加 Controller 类上,则这个 Controller 中的所有路由映射都会加上此映射规则,如果添加在某个方法上,则只会对当前方法生效。

常用属性参数:

  • valuepath
    • 用途:定义请求的URL路径。
    • 说明:value@RequestMapping的属性,可以指定一个或多个URL路径。path@RequestMapping的别名,与value功能相同,但只能指定一个路径。
  • method
    • 用途:限制请求的HTTP方法(如GET、POST、PUT、DELETE等)。
    • 说明:可以指定一个或多个HTTP方法,只有匹配这些方法的请求才会被映射到相应的处理方法。
  • params
    • 用途:根据请求参数的存在与否来决定是否映射请求。
    • 说明:可以指定一个或多个参数条件,只有当这些参数在请求中出现时,请求才会被映射。
  • headers
    • 用途:根据请求头的存在与否来决定是否映射请求。
    • 说明:可以指定一个或多个请求头条件,只有当这些请求头在请求中出现时,请求才会被映射。
  • consumes
    • 用途:指定可接受的请求体的媒体类型(如application/jsontext/plain等)。
    • 说明:只有当请求的Content-Type与指定的媒体类型匹配时,请求才会被映射。
  • produces
    • 用途:指定控制器方法可以产生的媒体类型。
    • 说明:这通常用于设置响应的Content-Type,告诉客户端期望接收的媒体类型。
  • name
    • 用途:为映射定义一个名称,方便在其他注解中引用。
    • 说明:在大型应用中,使用名称可以简化映射的引用,提高代码的可维护性。

参数传递:

  • @RequestParam:用于将HTTP请求的查询字符串参数或请求体参数绑定到控制器方法的参数上。如果参数名称一致,可以省略。
  • @PathVariable:用于提取URL中的动态路径变量,并将这些变量传递给控制器方法的参数。
  • @RequestBody:用于接收请求体中的参数,通常用于处理JSON、XML等非表单编码的数据。

实例:

import org.springframework.web.bind.annotation.*;
import xxx.start.entity.User;

@RestController
public class ParamsController {
    @RequestMapping(value = "/getTest1", method = RequestMethod.GET)
    public String getTest1(){
        return "GET请求";
    }

    @RequestMapping(value = "/getTest2", method = RequestMethod.GET)
    // 默认情况,方法的参数名要与网址传参的名称一致。
    public String getTest2(String name, String phone){
        System.out.println("name" + name);
        System.out.println("phone" + phone);
        return "GET请求";
    }

    @RequestMapping(value = "/getTest3", method = RequestMethod.GET)
    // 传参的名称不对应,因此需要使用@RequestParam()进行指定,指定value的话,这样的话参数就必须进行传递,如果这个参数可传可不传就需要required参数
    public String getTest3(@RequestParam(value = "name", required = false) String name){
        System.out.println("name" + name);
        return "GET请求";
    }

    // POST请求
    @RequestMapping(value = "/postTest1", method = RequestMethod.POST)
    public String postTest1(){
        return "POST请求";
    }

    @RequestMapping(value = "/postTest2", method = RequestMethod.POST)
    public String postTest2(String username, String password){
        System.out.println("username" + username);
        System.out.println("password" + password);
        return "POST请求";
    }

    @RequestMapping(value = "/postTest3", method = RequestMethod.POST)
    public String postTest3(User user){  // 这里直接使用User类进行接受,需要将User中的属性名称与传参名称保持一致!
        System.out.println(user);
        return "POST请求";
    }

    @RequestMapping(value = "/postTest4", method = RequestMethod.POST)
    public String postTest4(@RequestBody User user){  // 处理请求体中的参数
        System.out.println(user);
        return "POST请求";
    }

    @RequestMapping(value = "/test/**")  // 正则表达式,**可以表示多层而*只能表示一层
    public String test(){
        return "通配符请求";
    }
}

GET方法通常情况是地址传参,如:http://localhost:8080/getTest2?name=张三&phone=123456,这样即将数据传递到了路由getTest2的方法中。

三、文件上传

SpringBoot 工程嵌入的 tomcat 限制了请求的文件大小,每个文件的配置最大为1MB,单次请求的文件总数不能大于10MB,如要更改默认配置,需要在 application.properties 文件中添加如下两个配置:

# 上传的单个文件的大小
spring.servlet.multipart.max-file-size=10MB
# 上传的多个文件的大小
spring.servlet.multipart.max-request-size=100MB

实例:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

@RestController
public class FileUploadController {
    @PostMapping("/upload")
    public String up(String name, MultipartFile photo, HttpServletRequest request) throws IOException {
        System.out.println(name);
        // 获取图片原始名称
        System.out.println(photo.getOriginalFilename());
        // 获取文件类型
        System.out.println(photo.getContentType());
        // "user.dir"表当前工作目录的绝对路径
        System.out.println(System.getProperty("user.dir"));

        // 获取web服务器对应的路径,这里获取的是/upload文件夹的路径
        String path = request.getServletContext().getRealPath("/upload/");
        System.out.println(path);
        saveFile(photo, path);
        return "上传成功";
    }

    public void saveFile(MultipartFile photo, String path)throws IOException{
        // 判断存储的目录是否存在
        File dir = new File(path);
        if(!dir.exists()){
            // 如果不存在就创建目录
            dir.mkdir();
        }
        File file = new File(path + photo.getOriginalFilename());
        photo.transferTo(file);   // 写入到磁盘文件中
    }
}

四、拦截器(Interceptor)

SpringBoot定义了HardlerInterceptor接口来实现自定义拦截器的功能。HandlerInterceptor接口定义了preHandlepostHandleafterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作。

  • preHandle:在控制器(Controller)方法执行之前被调用。
  • postHandle:它在请求的控制器方法执行之后、渲染视图之前被调用。
  • afterCompletion:请求处理流程的最后阶段被调用。

拦截器的使用分为两个步骤:1. 定义,2. 注册。

拦截器在定义时,将文件放置在interceptor文件夹中,使用时将文件放在config文件夹中。

定义拦截器:

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 注册一个拦截器
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 根据条件来判断是否进行拦截。
        if("条件"){
            System.out.println("通过");
            return true;
        }else{
            System.out.println("不通过");
            return false;
        }
    }
}

注册:

  • addPathPatterns:定义拦截的地址,添加的一个拦截器没有 addPathPattern 任何一个 URL 则默认拦截所有请求。
  • excludePathPatterns:定义排除某些地址不被拦截,如果没有 excludePathPatterns 任何一个请求,则默认不放过任何一个请求。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import xxx.start.interceptor.LoginInterceptor;

// 配置类,可以供springboot来读,这里是添加一个拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
    }
}

五、RESTFUL

RESTFUL 是目前流行的互联网软件服务架构设计风格。要求客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作:

  • GET用于获取资源
  • POST用于新建资源(也可以用于更新资源)
  • PUT用于更新资源
  • DELETE用于删除资源。

RESTFUL 的特点:资源的表现形式是JSON或者HTML,客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都包含必须的信息。

HTTP 状态码:

  • 1xx:信息,通过传输协议级信息。
  • 2xx:成功,表示客户端的请求已成功接受。
  • 3xx:重定向,表示客户端必须执行一些其他操作才能完成其请求。
  • 4xx:客户端错误,此类错误状态码指向客户端。
  • 5xx:服务器错误,服务器负责这些错误状态码。

Spring Boot 实现 RESTFul API:

  • SpringBoot 提供的 spring-boot-starter-web 组件完全支持开发RESTFUL API,提供了与REST操作方式(GET、POST、PUT、DELETE对应的注解)
注解功能
@GetMapping处理 GET 请求,获取资源
@PostMapping处理 POST 请求,新增资源
@PutMapping处理 PUT 请求,更新资源
@DeleteMapping处理 DELETE 请求,删除资源
@PatchMapping处理 PATCH 请求,用于更新部分资源

实例:

import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import xxx.start.entity.User;

@RestController
public class UserController {
    @ApiOperation("根据ID获取用户信息")  // swagger的注解
    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable int id){
        System.out.println(id);
        return "根据ID获取用户信息";
    }

    @PostMapping("/user")
    public String save(User user){
        return "添加用户";
    }

    @PutMapping("/user")
    public String update(User user){
        return "更新用户";
    }

    @DeleteMapping("/user/{id}")
    public String deleteById(@PathVariable int id){
        System.out.println(id);
        return "根据ID删除用户";
    }
}

六、Swagger

Swagger 是一个开源的 API 设计和文档工具,由 Tony Tam 于 2010 年创建,它可以帮助开发人员更快、更简单地设计、构建、文档化和测试 RESTful API。Swagger 可以自动生成交互式 API 文档、客户端 SDK、服务器 stub 代码等,从而使开发人员更加容易地开发、测试和部署 API 。

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTFul风格的web服务,是非常流行的API表达工具。Swagger能够自动生成完善的RESTFul API文档,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API

使用方法:

  1. 在项目中(pom.xml)引入 springfox-swagger2 和 springfox-swagger-ui 依赖即可。

    <!--        添加swagger2相关功能-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!--        添加swagger-ui相关功能-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    
  2. 配置Swagger,需要在config目录中编写配置文件:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @Configuration    // 告诉Spring容器,这个类是一个配置类
    @EnableSwagger2    // 启用Swagger2功能
    public class SwaggerConfig {
        /*
        * 配置Swagger2相关的bean
        * */
        @Bean
        public Docket createRestApi(){
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("xxx"))
                    .paths(PathSelectors.any()).build();
        }
    
        // 此处主要是API文档页面显示信息
        private ApiInfo apiInfo(){
            return new ApiInfoBuilder()
                    .title("演示项目API")  // 标题
                    .description("演示项目") // 描述
                    .version("1.0")  // 版本
                    .build();
        }
    }
    

注意事项:

  • Spring Boot 2.6.x 之后与 Swagger 有版本冲突问题,需要在 application.properties 中加入以下配置:

    # 解决 swagger 版本与 springboot 版本不匹配的问题
    spring.mvc.pathmatch.matching-strategy=ant_path_matcher
    

使用 Swagger2 进行接口测试:

  • 启动项目之后,访问http://127.0.0.1:8080/swagger-ui.html即可打开自动生成的可视化测试页面。

七、MyBatis-Plus

友情链接:MyBatis-Plus 官方学习网址

MyBatis是一款优秀的数据持久ORM框架,被广泛地应用于系统,MyBatis 能够非常灵活地实现动态 SQL,可以使用 XML 或 注解 来配置和映射原生信息,能够轻松地将 JAVA 的 POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,它在 MyBatis 的基础上只做增强不做改变,旨在简化开发和提高效率

使用方法:

  1. pom.xml中添加依赖:

    <!-- MyBatisPlus依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.2</version>
    </dependency>
    <!-- mysql驱动依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!-- 数据库链接池用于向数据库申请多个连接,提高数据库的连接效率 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.20</version>
    </dependency>
    
  2. application.properties文件中配置数据库相关信息:

    # 连接数据库
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    #关闭mybatis-plus的自动驼峰命名法
    mybatis-plus.configuration.map-underscore-to-camel-case=false
    
  3. 添加 @MapperScan 注解,在 StartApplication 文件(项目启动文件)中添加:

    package xxx.start;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("xxx/start/mapper")    // 使mapper包中的代码生效,mapper存放映射文件。
    public class StartApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(StartApplication.class, args);
        }
    
    }
    
  4. 创建 mapper 文件夹,用于存放 mapper 类,在 mapper 文件夹中操作表的文件,文件名通常为:表名 + Mapper

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    import xxx.start.entity.UserChart;
    
    import java.util.List;
    //@Repository
    @Mapper
    public interface UserMapper extends BaseMapper<UserChart> {   // 使用mybatisplus可以根据userchart表自动找到userchart表
    }
    
  5. 使用 UserMapper 类,创建 UserMapperController 类:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import xxx.start.entity.UserChart;
    import xxx.start.mapper.UserMapper;
    
    import java.util.List;
    
    // 数据库操作
    @RestController
    public class UserMappingController {
    
        @Autowired(required = false)   // 会将mapper实例化出来的对象注入到userMapper中
        private UserMapper userMapper;
    
        @GetMapping("/usermap")
        public List query(){
            // 直接使用BaseMapper中自带的方法,selectList的值是查询条件,如果为 null 则表示查询全部。
            List<UserChart> list = userMapper.selectList(null);
            System.out.println(list);
            return list;   // 返回给前端的数据
        }
    
        @PostMapping("/usermap")
        public String save(UserChart userChart){
            int i = userMapper.insert(userChart);
            if(i > 0){
                return "插入成功";
            }else {
                return "插入失败";
            }
        }
    }
    
  6. UserChart 文件,是一个映射文件,用于映射数据库对应的表,放置到entity文件夹(自建文件夹)中:

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    
    @TableName("userchart")
    // 另行说明表名为: userchart
    public class UserChart {
        @TableId(type= IdType.AUTO)
        // 表明id是自增的
        public int id;
        public String username;
        public String password;
        @TableField(value = "birth", exist = true)
        // value表示对应数据库表中的具体字段,如果属性与字段不一致需要另行设置,exist表示该属性是否为字段,默认为true。
        public String birthday;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "UserChart{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", birthday='" + birthday + '\'' +
                    '}';
        }
    }
    

八、目录结构

在这里插入图片描述

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

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

相关文章

Linux下进程间的通信--消息队列

System V IPC的概念 System V IPC&#xff08;System V Interprocess Communication&#xff09;是Unix和类Unix操作系统中一套传统的进程间通信机制&#xff0c;它包括三种主要的通信方式&#xff1a;消息队列、信号量和共享内存。这些机制提供了一种在不同进程之间交换数据和…

llamaindex+Internlm2 RAG实践 #书生谱语大模型实战营#

1.打卡任务&#xff1a; 本次的打卡任务是llamaindexInternlm2 RAG实践&#xff0c;我们需要基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模…

Axure设计之下拉单选框教程(中继器)

在Axure RP中&#xff0c;使用中继器&#xff08;Repeater&#xff09;可以实现许多复杂而动态的用户界面组件&#xff0c;比如下拉单选框。本文将详细介绍如何通过中继器创建一个美观且功能丰富的下拉单选框。 一、案例预览 预览地址&#xff1a;https://1zvcwx.axshare.com …

如何使用ssm实现基于JAVA的网上药品售卖系统

TOC ssm133基于JAVA的网上药品售卖系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

什么是堡垒机

堡垒机&#xff0c;即在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为&#xff0c;以便集中报警、及时处理及审计定…

鹏城杯 2022 取证writeup

简单取证 我们进去首先使用imageinfo pslist screenshot clipboard filescan 等等插件查看相关信息。 这里找到一个password姑且先留着 然后使用filescan找到了一个jpg文件 我们先dump下来 vol -f file.raw --profileWinXPSP2x86 dumpfiles -Q 0x000000000207e3d8 -D . 然…

Generating Query Recommendations via LLMs 【阅读笔记】

背景 主要去进行query的相关搜索补充&#xff1b; 例如 我们引入生成查询推荐&#xff08;GQR&#xff09;系统。 GQR以大语言模型为基础&#xff0c;利用大语言模型的提示能力&#xff0c;通过提示中提供的几个例子&#xff08;检索或手工&#xff09;来理解推荐任务。 方案…

主机监控与审计系统是什么?这个功能让您的效率翻倍!

天下之事&#xff0c;皆需明察秋毫&#xff0c;方能运筹帷幄&#xff0c;决胜千里。 于信息之海&#xff0c;主机者&#xff0c;犹若疆土之基石&#xff0c;承载着数据之重&#xff0c;运行着系统之脉。 然&#xff0c;世事如棋局局新&#xff0c;网络之域&#xff0c;暗流涌…

惠海H6432 dcdc升压恒压支持IC 3.7V 7.4V升压9V12V15V24V3A大电流 摄影灯光电源

1. 产品描述 H6432是一款电流模式B00ST异步升压恒压控制驱动芯片&#xff0c;适用于2.7-24V输入电压范 围的升压恒压电源应用领域&#xff0c;启动电压低至2. 5V。芯片根据负载的大小自动切换PWM&#xff0c;PFM和BURST模式以提高各个负载端的电源系统效率。芯片通过EN脚实现…

kali2022重置密码

在如下系统选择界面&#xff0c;按‘E’&#xff0c; 进入到编辑界面&#xff0c;将“ro quiet”修改为“rw init/bin/bash”。修改完成后ctrl X保存编辑并继续引导ctrlx进行引导&#xff0c;passwd修改密码&#xff0c;成功后重启&#xff0c;用root和新密码登录。

Adversarial Diffusion Distillation

sd turbohttps://static1.squarespace.com/static/6213c340453c3f502425776e/t/65663480a92fba51d0e1023f/1701197769659/adversarial_diffusion_distillation.pdf#page5.83https://github.com/Stability-AI/generative-models 问题引入 1-4 steps fast diffusion model samp…

软件测试最全面试题,了解一下

一、前言 近期有不少同学&#xff0c;朋友问我什么是软件测试&#xff0c;它是干什么的&#xff0c;我适不适合做、这行发展前景、工资怎么样等等等…在这里我把问题总结一下&#xff0c;整理一篇文章出来。 我也看过很多贴吧、论坛&#xff0c;在入行之前对这块都是迷茫的&a…

os 虚拟内存

虚拟内存不仅能隔离进程&#xff0c;还能提高内存利用率&#xff0c;请解释虚拟内存如何提高内存利用率&#xff1f;&#xff1f;&#xff1f; 虚拟内存&#xff08;Virtual Memory&#xff09;通过以下几个机制来提高内存利用率&#xff1a; 1. 内存分页&#xff08;Paging&…

20240824给飞凌OK3588-C的核心板刷Ubuntu22.04并安装iperf3测试网速

20240824给飞凌OK3588-C的核心板刷Ubuntu22.04并安装iperf3测试网速 2024/8/24 9:24 缘起&#xff0c;通过千兆交换机接入外网&#xff0c;开机之后发现以太网异常&#xff0c;多上电几次就会发现以太网也能用。 缘由&#xff1a;由于自制的飞凌的OK3588-C的核心板的底板对空间…

五子棋理解C++思想

双人五子棋项目目录&#xff1a; class Game { public:Game();void init();bool waitPlayerPutChess(Player* player, int& oldi, int& oldj);void draw();void play();bool isOver(int playerId);public:int whoWin -1; // 谁赢了&#xff08;0&#xff1a;白棋&a…

【题解】【模拟】—— [CSP-J 2023] 一元二次方程

【题解】【模拟】—— [CSP-J 2023] 一元二次方程 [CSP-J 2023] 一元二次方程题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 1.题意解析2.AC代码 [CSP-J 2023] 一元二次方程 戳我查看题目&#xff08;洛谷&#xff09; 题目背景 众所周知&#xff0c;对…

共享文件操作记录如何查看?这种方法帮你轻松实现

查看共享文件操作记录&#xff0c;可以通过以下几种方法实现&#xff1a; 一、利用操作系统的文件访问记录功能 在Windows操作系统中&#xff0c;可以利用“事件查看器”来查看共享文件的访问记录。事件查看器是Windows内置的一个工具&#xff0c;用于记录系统中发生的各种事…

50个必知的ChatGPT学术论文指令:提升研究效率,强烈推荐收藏!

随着AI技术的发展&#xff0c;AI已经成为学术创作的强大工具。如果你还不了解如何利用AI润色你的论文&#xff0c;那么这篇文章将为你提供极大的帮助。我们精心整理了50个顶级ChatGPT学术论文指令&#xff0c;强烈建议你加以利用&#xff01; 这些指令非常实用&#xff0c;能显…

线性表的顺序表示—插入操作

线性表的顺序表示—插入操作 插入代码 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define InitSize 15 // 初始化扩容长度 #define MaxSize 100typedef struct {int data[MaxSize]; // 申请空间&#xff08;静态&#xff09;int lengt…

探索ISP自动曝光技术:工作原理与应用(一)

在现代数码相机和智能手机中&#xff0c;图像信号处理器&#xff08;ISP&#xff09;是负责将传感器捕捉到的原始数据转换成高质量图像的重要组件。而在ISP的众多功能中&#xff0c;自动曝光&#xff08;Auto Exposure, AE&#xff09;是确保拍摄出清晰、明亮且细节丰富照片的关…