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

Springboot - Web

Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式,通过默认配置、自动化配置等特性,使得开发者能够更快捷地构建和部署基于 Spring 的应用。
在这里插入图片描述

Spring Boot Web 是 Spring Boot 的一个子模块,它专注于 Web 应用的构建。它简化了创建 Web 应用的过程,包括 RESTful 服务、Web 层的支持、嵌入式服务器等功能。Spring Boot Web 是 Spring Boot 中处理 Web 相关应用的一个功能模块,通常包含 Spring MVC、嵌入式 Tomcat、Jetty 或 Undertow 服务器等。

Spring Boot 是一个完整的框架,而 Spring Boot Web 是其中一个子模块,专注于 Web 开发。

文章目录

  • 一、创建SpringBoot 工程
  • 二、 HTTP协议
    • 2.1 请求协议
    • 2.2 响应协议
      • 2.2.1 状态码 描述
  • 三、分层解耦
    • 3.1 三层架构
      • 1. 表示层
      • 2. 业务逻辑层
      • 3. 数据访问层
      • 组件之间的协作
      • 完整流程示例:
    • 3.2 各层中的职责和关系
      • 各层的职责和关系:
      • 工作流程:
    • 3.3 IOC(控制反转)和DI(依赖注入)
  • 四、自写一个案例
    • 4.1 数据库结构
    • 4.2 服务端代码
      • 4.2.0 在测试阶段的问题发现
      • 4.2.1 POJO
      • 4.2.2 Mapper
      • 4.2.3 Controller
      • 4.2.4 Service
      • 4.2.5 Apipost调试

一、创建SpringBoot 工程

在这里插入图片描述

在这里插入图片描述

package com.itdt.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {System.out.println("sout Hello World");return "return Hello World";}
}

在这里插入图片描述
在其中内嵌了tomcat服务器
在这里插入图片描述
查看依赖
在这里插入图片描述

二、 HTTP协议

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。它是Web的基础,用于在Web浏览器和Web服务器之间传输数据。

2.1 请求协议

  1. 请求行(Request Line):包括请求方法(GET、POST 等)、请求的URL和使用的HTTP协议版本。
  2. 请求头部(Headers):包含了各种标识信息,如Accept、User-Agent、Content-Type 等。
  3. 请求体(Body):对于 POST 请求,请求体中包含了实际要发送给服务器的数据。对于 GET 请求,通常为空

image-20241224114002773

<!DOCTYPE html>
<html>
<head><title>Test Hello Controller</title>
</head>
<body><form action="http://localhost:8081/hello" method="POST"><label for="name">Name:</label><input type="text" id="name" name="name"><button type="submit">Submit</button></form>
</body>
</html>
  1. GET请求数据格式

    • GET请求将数据附加在URL之后,以?分隔URL和传输数据。

    • 参数之间使用&连接,由键值对组成,如key1=value1&key2=value2

    • GET请求适合传输少量数据,因为数据会暴露在URL中,有长度限制。

      (1)从服务器获取数据,且数据量较小且不敏感时,可以使用GET请求。

      (2)向服务器请求资源,如获取网页、图片等。

      (3)通过URL直接传递参数,方便在浏览器中进行测试和调试。

  2. POST请求数据格式

    • POST请求的数据在请求体中,不会暴露在URL中。
    • 请求头中会包含Content-Type: application/x-www-form-urlencoded来指示数据格式。
    • 参数同样以键值对的形式传输,但不会显示在URL中。
    • POST请求适合传输大量数据或敏感信息,如表单提交等。
  • 例如GET:

GET请求的

  • 例如POST:(POST请求,将请求的参数放入请求体中)

    `Accept`: 指定客户端能够接收的内容类型,如`text/html`、`application/json`等。
    `Content-Type`: 指定请求体中的数据类型,如`application/json`、`application/x-www-form-urlencoded`等。
    `User-Agent`: 包含了客户端的应用程序、操作系统、版本等信息,用于标识客户端身份。
    `Host`: 指定请求的目标主机和端口号。
    `Cookie`: 包含了客户端的Cookie信息,用于在客户端和服务器之间保持状态。`Referer`: 指定了当前请求的来源页面URL。
    `Origin`: 指定了发起请求的源。
    

post请求的、、

2.2 响应协议

image-20241224135445071

2.2.1 状态码 描述

状态码英文描述中文描述
1xxInformational信息性状态码。服务器收到请求,需要请求者继续操作
100Continue客户端应继续其请求
101Switching Protocols服务器根据客户端的请求切换协议
2xxSuccess成功状态码。请求成功被服务器接收和理解
200OK请求已成功处理
201Created请求已经成功,并且服务器创建了新资源
202Accepted已接受。请求已接受,但尚未处理
203Non-Authoritative Information非权威信息。服务器已成功处理请求,但返回的信息可能来自另一来源
204No Content服务器成功处理请求,但未返回任何内容
205Reset Content重置内容。服务器成功处理请求,需要重置视图
206Partial Content服务器成功处理了部分GET请求
3xxRedirection重定向状态码。需要客户端采取进一步操作以完成请求
300Multiple Choices请求的资源存在多种选择,服务器返回列表供选择
301Moved Permanently请求的资源已被永久移动到新位置
302Found找到。请求的资源临时从不同位置响应
303See Other查看其他。请求的资源存在另一个URI,应使用GET、POST方法获取
304Not Modified资源未被修改,客户端可使用缓存数据
305Use Proxy使用代理。请求必须通过指定的代理才能访问
307Temporary Redirect临时重定向。请求的资源临时从不同位置响应
4xxClient Error客户端错误状态码。请求包含语法错误或无法完成请求
400Bad Request错误请求。服务器无法理解请求的语法
401Unauthorized未授权。请求要求用户的身份认证
403Forbidden禁止访问。服务器理解请求,但拒绝执行
404Not Found未找到。服务器无法找到请求的资源
405Method Not Allowed方法不允许。请求中指定的方法不被允许
406Not Acceptable不可接受。服务器无法根据请求的内容特性完成请求
407Proxy Authentication Required需要代理身份验证。客户端必须先使用代理认证
408Request Timeout服务器等待请求时发生超时
409Conflict请求导致服务器上的冲突
410Gone消失。请求的资源不再可用
411Length Required需要长度。缺少Content-Length头信息
412Precondition Failed请求头中指定的前提条件无法满足
413Payload Too Large请求的负载过大,服务器拒绝处理
414URI Too Long请求的URI长度超过服务器能处理的长度
415Unsupported Media Type不支持的媒体类型。请求的格式不受支持
416Range Not Satisfiable范围不符合要求。服务器无法满足请求的Range头信息
417Expectation Failed服务器无法满足请求中Expect请求头信息
418I’m a teapot我是茶壶。服务器拒绝尝试用茶壶煮咖啡
421Misdirected Request误导的请求。服务器无法生成适用于请求的响应
422Unprocessable Entity无法处理的实体。请求格式正确,但无法处理请求
423Locked已锁定。资源被锁定,当前操作无法完成
424Failed Dependency依赖关系失败。请求失败,因为请求的先决条件失败
425Too Early服务器不愿意处理请求,因为可能导致重放
426Upgrade Required需要升级。客户端应切换到TLS/1.0
428Precondition Required需要前提条件。请求失败,因为缺少必需的前提条件
429Too Many Requests请求过多。客户端发送的请求过多
431Request Header Fields Too Large请求头字段太大。服务器无法处理请求,因为请求头字段太大
451Unavailable For Legal Reasons由于法律原因不可用。资源因法律原因不可用
5xxServer Error服务器错误状态码。服务器无法完成请求
500Internal Server Error服务器内部错误。服务器遇到意外情况,无法完成请求
501Not Implemented未实现。服务器不支持请求的功能
502Bad Gateway错误网关。服务器作为网关或代理,从上游服务器接收到无效响应
503Service Unavailable服务不可用。服务器当前无法处理请求
504Gateway Timeout网关超时。服务器作为网关或代理,但未及时从上游服务器收到响应
505HTTP Version Not SupportedHTTP版本不支持。服务器不支持请求中所用的HTTP版本
507Insufficient Storage存储空间不足。服务器无法存储完成请求所必须的内
510Not Extended未扩展。客户端需要对请求进一步扩展
511Network Authentication Required需要网络身份验证。客户端需要进行身份验证才能获得网络访问权限

三、分层解耦

image-20241224195413883

  • 耦合是指不同模块(或类、组件)之间的依赖关系。它衡量的是模块之间的紧密程度。低耦合意味着模块之间的依赖关系较少,模块之间的变化不会相互影响,这通常是设计中的目标。高耦合则意味着模块之间的依赖关系过多,任何一个模块的变化都会影响到其他模块,增加了维护和修改的难度。
  • 内聚是指一个模块内部的各个元素之间的紧密程度。它衡量的是模块内部元素的相关性,或者说是模块内部各个功能的联系度。高内聚意味着模块内部的功能高度相关,模块内部的代码是为了实现一个单一的、明确的功能而组织的。低内聚则意味着模块内部的功能没有明确的目标,模块中的各个元素职责分散,缺乏相关性。

3.1 三层架构

在软件开发中,三层架构(Three-Tier Architecture)是一种常见的设计模式,用于将应用程序的不同职责分离,以提高系统的可维护性、可扩展性和重用性。三层架构通常分为 表示层业务逻辑层数据访问层

1. 表示层

  • 职责:表示层负责处理用户的输入和输出。它是与用户交互的部分,通常通过 Web 页面(前端)来展示信息,接收用户的请求并返回响应。
  • 组件:通常包含 Controller(或 RestController),它负责接收 HTTP 请求并将其委派给业务逻辑层(Service)。Controller 会根据用户的请求调用相应的服务,并返回响应结果。
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.getUserById(id);return ResponseEntity.ok(user);}
}

2. 业务逻辑层

  • 职责:业务逻辑层负责处理应用程序的核心业务逻辑,它充当了表示层和数据访问层之间的中介。所有复杂的计算、规则判断和数据转换等任务都在这一层进行。业务逻辑层通常包含接口和其实现类(如 ServiceServiceImpl),它们负责调用数据访问层(Mapper)来进行数据库操作,并处理返回结果。
  • 组件Service(接口)和 ServiceImpl(实现类),Service 定义了业务操作的接口,ServiceImpl 提供实际的业务逻辑实现。
  • 技术:Spring Service、业务逻辑编写等。
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic User getUserById(Long id) {return userMapper.findById(id);}
}

3. 数据访问层

  • 职责:数据访问层负责与数据库进行交互,执行 CRUD 操作(创建、读取、更新、删除)等。它直接与数据库进行通信,封装了所有的 SQL 操作。数据访问层通常由 MapperDAO(Data Access Object)类组成。Mapper 是 MyBatis 中的接口,而 DAO 在其他框架中通常代表数据访问的类。
  • 组件MapperDAO,这些类负责数据持久化操作,定义数据库查询语句,并将数据库结果返回给业务逻辑层。
  • 技术:MyBatis、JPA(Hibernate)、JDBC、Spring Data JPA 等。
@Mapper
public interface UserMapper {User findById(Long id);
}

组件之间的协作

  1. 表示层 (Controller) 接收用户请求,调用业务逻辑层 (Service) 进行处理。
  2. 业务逻辑层 (ServiceImpl) 通过调用数据访问层 (Mapper) 来获取或更新数据。
  3. 数据访问层 (Mapper) 负责与数据库进行交互,执行 SQL 操作。
  4. 处理结果返回到 表示层 (Controller),最终响应给用户。
层级主要职责主要组件(类)主要技术
表示层处理用户请求和响应Controller、RestControllerSpring MVC、JSP、Thymeleaf
业务逻辑层处理业务逻辑Service、ServiceImplSpring Service
数据访问层与数据库交互,执行数据操作Mapper、DAOMyBatis、JPA、JDBC

完整流程示例:

  1. 前端发起请求:用户通过 Web 浏览器或其他客户端发起请求(如 GET 或 POST)。
  2. Controller 处理请求Controller 接收请求,调用相应的业务逻辑层 (Service) 来处理业务。
  3. Service 进行业务逻辑处理ServiceImpl 处理复杂的业务逻辑,并可能需要通过 Mapper 与数据库进行交互。
  4. Mapper 查询数据库Mapper 执行 SQL 查询,获取数据并返回。
  5. 业务层处理数据ServiceImpl 对数据库返回的数据进行处理和转换。
  6. Controller 返回响应Controller 将处理结果(通常是数据)返回给前端。

3.2 各层中的职责和关系

+-----------+        +-----------+        +----------------+        +-------------+        +-------------+
| Controller| -----> |   Service | -----> |   ServiceImpl  | -----> |   Mapper    | -----> |     POJO    |
+-----------+        +-----------+        +----------------+        +-------------+        +-------------+↑                     ↑                      ↑                      ↑                    ↑(调用接口)         (调用实现)          (调用数据库操作)         (持久化数据)          (封装数据)

各层的职责和关系:

  1. Controller: – 负责接收请求,调用 Service 层的接口。

    • 职责:接收前端请求,调用 Service 层进行处理,并返回处理结果给前端。
    • 与其他组件的关系Controller 接收到前端请求后,调用 Service 接口中的方法进行业务处理,最终返回处理结果。
  2. Service (业务层接口): – 定义业务逻辑的接口。

    • 职责:定义业务逻辑的抽象接口。Service 层提供了一系列业务方法,用于业务操作的声明,但不包含具体实现。
    • 与其他组件的关系Service 层由 ServiceImpl 实现,Controller 调用 Service 接口提供的业务方法。Service 只定义接口,不涉及具体的业务实现细节。
  3. ServiceImpl (服务实现类): – 实现业务逻辑,调用 Mapper 层的数据库操作。

    • 职责ServiceImplService 接口的具体实现,负责处理具体的业务逻辑。它可以调用 Mapper 层进行数据库操作,并封装业务操作。
    • 与其他组件的关系ServiceImpl 调用 Mapper 进行数据库操作,获取或更新数据,并将结果返回给 Controller。它的作用是将数据库访问与业务逻辑分开。
  4. Mapper (数据访问层): – 负责数据库的操作,将数据存取到 POJO 中。

    • 职责Mapper 是与数据库交互的层,通常定义了数据库的查询、插入、更新和删除操作。实现通常MyBatis
  5. POJO (数据模型): – 表示数据模型,封装数据。

    • 职责:POJO 是普通的 Java 对象,通常用于表示数据库中的一行记录或者某些数据结构。它封装了数据,并为这些数据提供 getter 和 setter 方法。
    • 与其他组件的关系:POJO 作为数据模型,通常用于与数据库交互,它由 Mapper 来操作,ServiceImpl 会将 POJO 作为处理结果传递给 Controller

工作流程:

  1. 用户请求:用户通过前端发起请求,Controller 接收请求。
  2. 调用 Service 接口Controller 调用 Service 接口定义的方法来执行业务操作。
  3. 业务实现ServiceImpl 作为 Service 接口的实现,负责具体的业务逻辑,并调用 Mapper 进行数据操作。
  4. 数据库操作Mapper 执行数据库操作,将数据从数据库加载到 POJO 中,或者将 POJO 中的数据保存到数据库。
  5. 返回结果ServiceImpl 将结果(通常是 POJO 对象或集合)返回给 ControllerController 将处理结果返回给前端。

3.3 IOC(控制反转)和DI(依赖注入)

  • IOC(控制反转)是一种设计原则,它将控制权从应用程序代码中转移出来,由框架或容器来管理对象之间的依赖关系。在IOC中,对象的创建、组装和管理都由框架来完成,而不是由程序员手动管理。

    控制反转:指将对象的控制权交给IOC容器,由IOC容器来创建和管理这些对象,IOC里的这些对象也被称为Bean对象。

    将Dao 及 Service层的实现类,交给IOC容器管理;为Controller 及 Service注入运行时所依赖的对象。

    声明bean的注解有:@Controller、@Service、@Repository、@Component

  • DI(依赖注入)是IOC的一种实现方式,它指的是通过外部注入的方式来提供一个对象所依赖的其他对象。依赖注入可以通过构造函数、属性或方法来实现,目的是减少类之间的耦合度,使代码更易于维护和测试。

    DI:IOC容器要为应用程序提供运行时所依赖的资源。资源,指的是对象。

    @Autowired注解,默认是按照类型进行注入的。

    如果存在多个相同类型的bean,将会报出如下错误:方案一:@Primary、方案二:@Qualifier、方案三:@Resource

    @Resource 与 @Autowired区别 ?
    @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
    @Autowired默认是按照类型注入,而@Resource默认是按照名称注入

总的来说,IOC是一种设计原则,而DI是实现这一原则的具体方式之一。通过使用IOC和DI,可以使代码更加灵活、可扩展和易于测试。

四、自写一个案例

4.1 数据库结构

create table users
(id         int auto_incrementprimary key,username   varchar(50)                            not null comment '用户名',password   varchar(255) default '12345678'        not null comment '加密后的密码',email      varchar(100)                           not null comment '用户邮箱',phone      varchar(11)                            not null,user_type  int                                    not null comment '用户类型(''landlord'', ''tenant'', ''buyer'', ''seller'')',created_at timestamp    default CURRENT_TIMESTAMP not null comment '创建时间',updated_at timestamp    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',avatar_url varchar(255)                           null comment '用户头像URL',gender     int                                    null comment '用户性别(男、女)'
)comment '用户表,存储所有用户信息';

下面是模拟数据

image-20241224230427418

4.2 服务端代码

  • POM 安装分页查询分页插件PageHelper,JAXBJava类映射到XML表示形式

    创建项目

image-20241224215438168

我的application.yml

spring:application:name: GraduationProdatasource:url:  填写你的实际urldriver-class-name: com.mysql.cj.jdbc.Driverusername:填写你的实际usernamepassword: 填写你的实际passwordservlet:multipart:#最大单个文件大小max-file-size: 10MB#最大请求大小(包括所有文件和表单数据)max-request-size: 100MB#Mybatis的相关配置
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#开启驼峰命名映射开关map-underscore-to-camel-case: true#配置事务管理日志级别
logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugserver:port: 8081

4.2.0 在测试阶段的问题发现

image-20241225000128644

这是由于pom.xml,把下面的这个删去,然后在右侧的maven配置中clean一下重新刷maven,最终重新build一下代码即可

image-20241225000315108

4.2.1 POJO

package com.example.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;import java.sql.Timestamp;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer id;private String username;private String password;private String email;private String phone;private Integer userType;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Timestamp createdAt;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Timestamp updatedAt;private String avatarUrl;private Integer gender;
}

统一相应结果

public class Result {private Integer code; //编码:1成功,0为失败private String msg; //错误信息private Object data; //数据public static Result success() {Result result = new Result();result.code = 1;result.msg = "success";return result;}public static Result success(Object object) {Result result = new Result();result.data = object;result.code = 1;result.msg = "success";return result;}public static Result error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}}

4.2.2 Mapper

package com.example.mapper;import com.example.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserMapper {@Select("select * from user where id = #{id}")User getUserById(Integer id);void save(User user);
}

在resoucrs资源下,新建一个同级的包,切记是以‘/'分割的

image-20250103205506529

在其中同名的xml写(此为复杂情况使用mybatis)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!--    批量分隔符-->
<!-- UserMapper.xml -->
<insert id="save" parameterType="com.example.pojo.User">INSERT INTO user (username, password, email, phone, user_type, created_at, updated_at, avatar_url, gender) VALUES (#{username}, #{password}, #{email}, #{phone}, #{userType}, #{createdAt}, #{updatedAt}, #{avatarUrl}, #{gender})
</insert></mapper>

image-20250103205705415

4.2.3 Controller

package com.example.controller;import com.example.pojo.Result;
import com.example.pojo.User;
import com.example.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@Slf4j
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;
//    查询指定用户@GetMapping("/{id}")public Result getUserById(@PathVariable Integer id) {log.info("正在查询id为{}的用户", id);User user = userService.getUserById(id);return Result.success(user);}@PostMappingpublic Result save(@RequestBody User user) {log.info("用户{}注册", user);userService.save(user);return Result.success();}}

4.2.4 Service

package com.example.service;import com.example.pojo.User;public interface UserService {void save(User user);User getUserById(Integer id);
}

其实现类

package com.example.service.impl;import java.time.LocalDateTime;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void save(User user) {user.setCreatedAt(LocalDateTime.now());user.setUpdatedAt(LocalDateTime.now());userMapper.save(user);}@Overridepublic User getUserById(Integer id) {return userMapper.getUserById(id);}}

4.2.5 Apipost调试

image-20250103205908908

还有json格式的新增用户

image-20250103210021510

相关文章:

Springboot - Web

Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式&#xff0c;通过默认配置、自动化配置等特性&#xff0c;使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块&#xff0c;它专注于…...

【C】​动态内存管理

所谓动态内存管理&#xff0c;就是使得内存可以动态开辟&#xff0c;想使用的时候就开辟空间&#xff0c;使用完之后可以销毁&#xff0c;将内存的使用权还给操作系统&#xff0c;那么动态开辟内存有什么用呢&#xff1f; 假设有这么一种情况&#xff0c;你在一家公司中工作&am…...

lec5-传输层原理与技术

lec5-传输层原理与技术 1. 传输层概述 1.1. 关键职责 flow control&#xff0c;流量控制reliability&#xff0c;可靠性 1.2. TCP与UDP对比 面向连接 / 不能连接对数据校验 / 不校验数据丢失重传 / 不会重传有确认机制 / 没有确认滑动窗口流量控制 / 不会流量控制 1.3. 关…...

【C语言】_指针运算

目录 1. 指针-整数 2. 指针-指针 2.1 指针-指针含义 2.2 指针-指针运算应用&#xff1a;实现my_strlen函数 3. 指针的关系运算&#xff08;大小比较&#xff09; 1. 指针-整数 联系关于指针变量类型关于指针类型和指针-整数相关知识&#xff1a; 原文链接如下&#xff1…...

“AI智慧教学系统:开启个性化教育新时代

大家好&#xff0c;我是老王&#xff0c;一个在产品圈摸爬滚打多年的资深产品经理。今天&#xff0c;我想和大家聊聊一个最近特别火的概念——AI智慧教学系统。这东西听起来好像很高大上&#xff0c;但其实和我们每个人都息息相关&#xff0c;因为它关系到我们下一代的教育。 一…...

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…...

CSS 学习之正确看待 CSS 世界里的 margin 合并

一、什么是 margin 合并 块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距&#xff0c;这样的现象称为“margin 合并”。从此定义上&#xff0c;我们可以捕获两点重要的信息。 块级元素&#xff0c;但不包括浮动和绝对定位元素&#xff0c;尽…...

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下&#xff0c;概率性出现读保护问题&#xff0c;量产时候可以通过离线烧录工具避免。代码中开了读保护&#xff0c;但是没有通过can/uart/lin/gpio控制等方式进行关闭&#xff0c;导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…...

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…...

unity团结云下载项目

今天开plastic scm发现它云服务好像停了哈&#xff0c;在hub里下载云端项目也不会出现在项目列表里&#xff0c;之前也有发邮件说让提前迁移到团结云。打开云仓库会弹这个&#xff0c;大概就是plastic scm无法解析域名地址吧 研究了一下团结云咋使&#xff0c;官方手册看半天也…...

Jmeter进阶篇(31)解决java.net.BindException: Address already in use: connect报错

📚前言 近期雪雪妹妹在使用Jmeter执行压测的时候,发现了一个非常让她头疼的问题,她使用20并发跑,正确率可以达到100%,但是一旦使用200并发,就会出现大量的报错,报错内容如下: java.net.BindException: Address already in use: connectat java.net.DualStackPlainSo…...

商米电子秤服务插件

概述 SunmiScaleUTS封装商米电子秤服务模块&#xff0c;支持商米旗下S2, S2CC, S2L CC等设备&#xff0c;设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …...

华为ensp-BGP路由过滤

学习新思想&#xff0c;争做新青年&#xff0c;今天学习的是BGP路由过滤 实验目的&#xff1a; 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容&#xff1a; 本实…...

Sigrity System SI SerialLink模式进行Pcie3协议仿真分析操作指导-pcie3_client_single_post

Sigrity System SI SerialLink模式进行Pcie3协议仿真分析操作指导-pcie3_client_single_post Sigrity System SI SerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以…...

Python提取目标Json键值:包含子嵌套列表和字典

目标&#xff1a;取json中所有的Name、Age字典 思路&#xff1a;递归处理字典中直接包含子字典的情况&#xff0c; import jsondef find_targ_dicts(data,key1,key2):result {}if isinstance(data, dict):if key1 in data and key2 in data: # 第一层字典中包含key1和key2re…...

分享6个对象数组去重的方法

大家好&#xff0c;关于对象数组去重的业务场景&#xff0c;想必大家都遇到过类似的需求吧&#xff0c;针对这样的需求&#xff0c;你是怎么做的呢。 下面我就先和大家讨论下基于对象的某个属性如何去重。 方法一&#xff1a;使用 .filter() 和 .findIndex() 相结合的方法 使…...

Formality:官方Tutorial(一)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文是对Synopsys Formality User Guide Tutorial中第一个实验的翻译&#xff08;有删改&#xff09;&#xff0c;Lab文件可以从以下链接获取。 Formality官方Tu…...

力扣28找出字符串中第一个匹配项的下标

class Solution:def strStr(self, haystack: str, needle: str) -> int:# 特殊情况处理if not needle:return 0# 获取 haystack 和 needle 的长度a len(needle)b len(haystack)# 遍历 haystack&#xff0c;检查每个子字符串是否与 needle 匹配for i in range(b - a 1):if…...

【JAVA】java中将一个list进行拆解重新组装

一、使用场景 1、当需要对一个list中的元素属性进行重新赋值&#xff0c;比如一个list中存储了订单数据&#xff0c;我们需要改变list中每个订单的id&#xff0c;然后再重新输出订单list if(CollectionUtils.isNotEmpty(orderList)){ orderList.forEach(p->{ …...

在 Windows 上使用 SSH 密钥访问 Linux 服务器

本章目录: 前言1. 准备工作2. 生成 SSH 密钥对步骤 1&#xff1a;打开命令行步骤 2&#xff1a;运行 ssh-keygen 命令步骤 3&#xff1a;选择密钥保存位置步骤 4&#xff1a;设置密钥密码&#xff08;可选&#xff09;步骤 5&#xff1a;生成密钥对 3. 查看生成的密钥文件4. 将…...

小白0基础centos8安装docker

总述&#xff1a;博主作为0基础小白将详细记录第一次从centos8的下载到安装docker的过程&#xff0c;包括中间出现的问题和解决方案 1Centos8下载 参见博文CentOS 8 的安装&#xff08;官方安装、清华大学开源软件镜像站、阿里云镜像、网易镜像下的安装步骤&#xff09;_cent…...

机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告

逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告 目录 逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告1 逻辑回归算法1.1 概念理解1.2 算法导入1.3 算法优缺点 2 LogisticRegression理解2.1查看参数定义2.2 参数理解2.3 方法2.4基本格式 3 数据标准…...

openGauss连接是报org.opengauss.util.PSQLException: 尝试连线已失败

安装好高斯数据库后然后用java连接时报如下错误: 解决方法: 在openGauss数据库的安装路径下/opt/opengauss/data/single_node&#xff08;这个路径根据自己实际情况变化&#xff09;有个pg_hba.conf文件&#xff0c;修改里面host内容如下&#xff0c;我这里设置的是所有ip都能…...

详细的一条SQL语句的执行流程

SQL 语句的执行流程会因数据库管理系统的不同而略有差异&#xff0c;但一般来说&#xff0c;主要包括以下几个阶段&#xff1a; 查询解析 词法分析&#xff1a;数据库系统首先将输入的 SQL 语句按字符流进行扫描&#xff0c;依据词法规则把它分割成一个个的单词&#xff0c;如…...

适用于小白的程序报错提问 AI 模板

#工作记录 程序报错提问 AI 模板 1、你现在将扮演python专家&#xff0c;请保持连续对话&#xff0c;请基于你的专业知识修改代码并回答&#xff01; 2、可以向我询问任何有利于你分析问题的信息。 3、你修改的程序代码&#xff0c;运行后报错&#xff0c;报错信息我放在最后…...

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…...

OFDM学习-(二)长短序列和PPDU整体数据处理流程

OFDM学习 &#xff08;二&#xff09;长短序列和PPDU整体数据处理流程 OFDM学习前言一、短序列短序列的作用 二、长序列三、PLCP/SIGNAL/DATA数据处理流程三、fpga实现STS模块LTS模块训练序列模块仿真波形 总结 前言 根据框图可以知道发射机这部分信号在DA转换之前&#xff0c…...

.NET周刊【12月第4期 2024-12-22】

国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大…...

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…...

鸿蒙开发:实现键值数据库存储

前言 鸿蒙当中数据持久化存储&#xff0c;为我们提供了多种的实现方式&#xff0c;比如用户首选项方式&#xff0c;关系型数据库方式&#xff0c;键值型数据库方式&#xff0c;文件存储方式等等&#xff0c;对于数据量比较的小的&#xff0c;我们直接选择轻量级的用户首选项方式…...