Spring Boot(快速上手)

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 {@Overridepublic 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 {@Overridepublic 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* */@Beanpublic 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;}@Overridepublic String toString() {return "UserChart{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", birthday='" + birthday + '\'' +'}';}
    }
    

八、目录结构

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

polarctf靶场[WEB]cookie欺骗、upload、签到

[web]cookie欺骗 考点&#xff1a;cookie值 工具&#xff1a;Burp Suite抓包 根据题目提示&#xff0c;cookie欺骗&#xff0c;所以要在cookie值寻找关键 进入网页之后&#xff0c;说只有admin用户才能得到flag&#xff0c;而我们此时只属于普通访客 我们查看cookie值&…

「Python程序设计」基本数据类型:字符串

​在python的程序设计过程中&#xff0c;字符串是需要经常处理的变量类型。字符串在程序中的存储方式&#xff0c;类似于一维数组&#xff0c;每个字符占据数组中的一个单元格。 字符串可以存储字符类型的变量&#xff0c;即使是数字类型&#xff0c;也可以通过字符串来进行存…

vue3+vite配置环境变量实现开发、测试、生产的区分

文章目录 一、为什么需要区分 (dev)、测试 (test) 和生产 (prod) 环境二、vue3的项目如何通过配置方式区分不同的环境1、创建不同环境的.env文件2、在不同的.env文件中配置相应的环境变量1&#xff09;.env.develoment2&#xff09;.env.test3&#xff09;.env.production 3、在…

Git之git stash高级用法(五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

Tomcat 部署与优化

目录 tomcat 简介 tomcat 构件 1. Web 容器 2. Servlet 容器 3.Jsp容器 tomcat 核心组件 Connector Container Service 子容器 总结 tomcat 部署 tomcat请求过程 tomcat部署 tomcat 优化 tomcat配置文件参数优化 JVM优化 tomcat 简介 提到Tomcat 就想到 java&a…

RISC-V vector(1) --- vector的引入与register说明

Vector相较于SIMD的优势 这两种实现方案&#xff0c;都是为了实现数据级并行性&#xff08;存在大量的数据可供程序同时计算&#xff09;&#xff1b; SIMD&#xff08;Single Instruction Multiple Data&#xff09; SIMD是将数据宽度和操作类型&#xff0c;都放在了指令中&a…

http应用层协议

一、万维网 用来存放各种资源的网络。 1、如何在万维网中表示一个资源 ? url ——统一资源定位符&#xff1b; 形式&#xff1a; <协议>://<主机>:<端口>/<路径>&#xff1b; <主机>:<端口>/<路径> //表示了资源所在的…

这个TOP 100 AI应用榜单,包含了所有你需要的使用场景(一)

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

【Unity3D小技巧】Unity3D中实现FPS数值显示功能实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 很简单也很使用的小技巧&#xff0c;就是在Unity…

【系统分析师】-综合知识-计算机系统基础

1、流水线的吞吐率是指流水线在单位时间里所完成的任务数或输出的结果数。设某流水线有 5 段&#xff0c;有 1 段的时间为 2ns &#xff0c;另外 4 段的每段时间为 1ns&#xff0c;利用此流水线完成 100 个任务的吞吐率约为&#xff08;16&#xff09;个/s 。 2、矢量图像通过使…

[NeurIPS 2024] Self-Refine: Iterative Refinement with Self-Feedback

Contents TL;DRReferences TL;DR 通过让 LLM 生成 feedback 不断 refine 自身的回答&#xff0c;可以提升回答效果&#xff0c;但也会带来不可忽视的推理开销 References Madaan, Aman, et al. “Self-refine: Iterative refinement with self-feedback.” Advances in Neura…

广州网站制作seo优化技巧

随着互联网的迅速发展&#xff0c;越来越多的企业意识到网站对于品牌推广和销售的重要性。而在众多网站中&#xff0c;如何让自己的站点脱颖而出&#xff0c;是每个网站管理员和SEO从业者必须面对的挑战。特别是对于广州这样一个经济繁荣、竞争激烈的城市&#xff0c;网站制作和…

基于R语言进行AMMI分析2

接续上文【基于R语言进行AMMI分析1】 1、AMMI()函数的结果解读 # 加载agricolae包 library(agricolae) # 加载数据 data(plrv) # 查看数据 head(plrv) model<-with(plrv,AMMI(Locality,Genotype,Rep,Yield,PCTRUE)) # 查看方差分析结果 model$ANOVA # 查看主成分的方差分析…

minio 后端大文件分片上传,合并,删除分片

背景 网上大多数minio大文件上传都是采用后台返回前端预上传链接&#xff0c;然后由前端去put请求直接和minio通信上传分片文件&#xff0c;然后调用后台合并分片逻辑来达到快申诉上传的目的&#xff0c;详情可以参考我的上两篇文章 最近有个项目域名是https的&#xff0c;但…

详解华为项目管理,附华为高级项目管理内训材料

&#xff08;一&#xff09;华为在项目管理中通过有效的沟通、灵活的组织结构、坚持不懈的努力、细致的管理和科学的考核体系&#xff0c;实现了持续的创新和发展。通过引进先进的管理模式&#xff0c;强调以客户需求为导向&#xff0c;华为不仅优化了技术管理和项目研发流程&a…

单片机原理及技术(八)—— 串行口的工作原理及应用

目录 一、串行通信基础 1.1 并行通信与串行通信 1.1.1 并行通信 1.1.2 串行通信 1.2 同步通信与异步通信 1.3 串行通信的传输模式 二、串行口的结构 2.1 串行口控制寄存器SCON 2.1.1 SM0、SM1 2.1.2 SM2 2.1.3 REN 2.1.4 TB8 2.1.5 RB8 2.1.6 TI 2.1.7 RI 2.2 …

数据结构: 树状数组

在OI赛事中&#xff0c;数据结构是非常重要的一个内容&#xff0c;更是有人说过&#xff0c;算法数据结构程序: A l g o r i t h m D a t a AlgorithmData AlgorithmData S t r u c t u r e P r o g r a m m i n g StructureProgramming StructureProgramming 接下来&#…

如何在 Ubuntu 系统中安装PyCharm集成开发环境?

在上一篇文章中&#xff0c;我们探讨了Jupyter notebook&#xff0c;今天再来看看另一款常用的Python 工具&#xff0c;Pycharm。 PyCharm也是我们日常开发和学习常用的Python 集成开发环境 (IDE)&#xff0c;由 JetBrains 开发。 PyCharm 带有一整套可以帮助用户在使用Pytho…

docker映射了端口,宿主机不生效

1、问题产生原因 docker run -d --name my-redis -p 6379:6379 -v /usr/redis.conf:/usr/local/etc/redis/redis.conf team-redis:3.2 redis-server /usr/local/etc/redis/redis.conf 这容器跑起来了&#xff0c;端口6379没用。搞的我一直怀疑哪里出错了&#xff0c;查看配置…

【网络安全】服务基础第一阶段——第二节:网络测试与用户

一、Windows网络测试工具 CMD&#xff08;命令提示符&#xff09;中&#xff0c;ping和tracert是两个非常有用的网络诊断工具 1.1.ping命令 ping命令是Windows和其他操作系统中用于测试主机之间网络连接是否可达的基本命令行工具。它通过发送ICMP&#xff08;Internet Contr…