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 请求协议
- 请求行(Request Line):包括请求方法(GET、POST 等)、请求的URL和使用的HTTP协议版本。
- 请求头部(Headers):包含了各种标识信息,如Accept、User-Agent、Content-Type 等。
- 请求体(Body):对于 POST 请求,请求体中包含了实际要发送给服务器的数据。对于 GET 请求,通常为空
<!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>
-
GET请求数据格式:
-
GET请求将数据附加在URL之后,以
?
分隔URL和传输数据。 -
参数之间使用
&
连接,由键值对组成,如key1=value1&key2=value2
。 -
GET请求适合传输少量数据,因为数据会暴露在URL中,有长度限制。
(1)从服务器获取数据,且数据量较小且不敏感时,可以使用GET请求。
(2)向服务器请求资源,如获取网页、图片等。
(3)通过URL直接传递参数,方便在浏览器中进行测试和调试。
-
-
POST请求数据格式:
- POST请求的数据在请求体中,不会暴露在URL中。
- 请求头中会包含
Content-Type: application/x-www-form-urlencoded
来指示数据格式。 - 参数同样以键值对的形式传输,但不会显示在URL中。
- POST请求适合传输大量数据或敏感信息,如表单提交等。
- 例如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`: 指定了发起请求的源。
、、
2.2 响应协议
2.2.1 状态码 描述
状态码 | 英文描述 | 中文描述 |
---|---|---|
1xx | Informational | 信息性状态码。服务器收到请求,需要请求者继续操作 |
100 | Continue | 客户端应继续其请求 |
101 | Switching Protocols | 服务器根据客户端的请求切换协议 |
2xx | Success | 成功状态码。请求成功被服务器接收和理解 |
200 | OK | 请求已成功处理 |
201 | Created | 请求已经成功,并且服务器创建了新资源 |
202 | Accepted | 已接受。请求已接受,但尚未处理 |
203 | Non-Authoritative Information | 非权威信息。服务器已成功处理请求,但返回的信息可能来自另一来源 |
204 | No Content | 服务器成功处理请求,但未返回任何内容 |
205 | Reset Content | 重置内容。服务器成功处理请求,需要重置视图 |
206 | Partial Content | 服务器成功处理了部分GET请求 |
3xx | Redirection | 重定向状态码。需要客户端采取进一步操作以完成请求 |
300 | Multiple Choices | 请求的资源存在多种选择,服务器返回列表供选择 |
301 | Moved Permanently | 请求的资源已被永久移动到新位置 |
302 | Found | 找到。请求的资源临时从不同位置响应 |
303 | See Other | 查看其他。请求的资源存在另一个URI,应使用GET、POST方法获取 |
304 | Not Modified | 资源未被修改,客户端可使用缓存数据 |
305 | Use Proxy | 使用代理。请求必须通过指定的代理才能访问 |
307 | Temporary Redirect | 临时重定向。请求的资源临时从不同位置响应 |
4xx | Client Error | 客户端错误状态码。请求包含语法错误或无法完成请求 |
400 | Bad Request | 错误请求。服务器无法理解请求的语法 |
401 | Unauthorized | 未授权。请求要求用户的身份认证 |
403 | Forbidden | 禁止访问。服务器理解请求,但拒绝执行 |
404 | Not Found | 未找到。服务器无法找到请求的资源 |
405 | Method Not Allowed | 方法不允许。请求中指定的方法不被允许 |
406 | Not Acceptable | 不可接受。服务器无法根据请求的内容特性完成请求 |
407 | Proxy Authentication Required | 需要代理身份验证。客户端必须先使用代理认证 |
408 | Request Timeout | 服务器等待请求时发生超时 |
409 | Conflict | 请求导致服务器上的冲突 |
410 | Gone | 消失。请求的资源不再可用 |
411 | Length Required | 需要长度。缺少Content-Length头信息 |
412 | Precondition Failed | 请求头中指定的前提条件无法满足 |
413 | Payload Too Large | 请求的负载过大,服务器拒绝处理 |
414 | URI Too Long | 请求的URI长度超过服务器能处理的长度 |
415 | Unsupported Media Type | 不支持的媒体类型。请求的格式不受支持 |
416 | Range Not Satisfiable | 范围不符合要求。服务器无法满足请求的Range头信息 |
417 | Expectation Failed | 服务器无法满足请求中Expect请求头信息 |
418 | I’m a teapot | 我是茶壶。服务器拒绝尝试用茶壶煮咖啡 |
421 | Misdirected Request | 误导的请求。服务器无法生成适用于请求的响应 |
422 | Unprocessable Entity | 无法处理的实体。请求格式正确,但无法处理请求 |
423 | Locked | 已锁定。资源被锁定,当前操作无法完成 |
424 | Failed Dependency | 依赖关系失败。请求失败,因为请求的先决条件失败 |
425 | Too Early | 服务器不愿意处理请求,因为可能导致重放 |
426 | Upgrade Required | 需要升级。客户端应切换到TLS/1.0 |
428 | Precondition Required | 需要前提条件。请求失败,因为缺少必需的前提条件 |
429 | Too Many Requests | 请求过多。客户端发送的请求过多 |
431 | Request Header Fields Too Large | 请求头字段太大。服务器无法处理请求,因为请求头字段太大 |
451 | Unavailable For Legal Reasons | 由于法律原因不可用。资源因法律原因不可用 |
5xx | Server Error | 服务器错误状态码。服务器无法完成请求 |
500 | Internal Server Error | 服务器内部错误。服务器遇到意外情况,无法完成请求 |
501 | Not Implemented | 未实现。服务器不支持请求的功能 |
502 | Bad Gateway | 错误网关。服务器作为网关或代理,从上游服务器接收到无效响应 |
503 | Service Unavailable | 服务不可用。服务器当前无法处理请求 |
504 | Gateway Timeout | 网关超时。服务器作为网关或代理,但未及时从上游服务器收到响应 |
505 | HTTP Version Not Supported | HTTP版本不支持。服务器不支持请求中所用的HTTP版本 |
507 | Insufficient Storage | 存储空间不足。服务器无法存储完成请求所必须的内 |
510 | Not Extended | 未扩展。客户端需要对请求进一步扩展 |
511 | Network Authentication Required | 需要网络身份验证。客户端需要进行身份验证才能获得网络访问权限 |
三、分层解耦
- 耦合是指不同模块(或类、组件)之间的依赖关系。它衡量的是模块之间的紧密程度。低耦合意味着模块之间的依赖关系较少,模块之间的变化不会相互影响,这通常是设计中的目标。高耦合则意味着模块之间的依赖关系过多,任何一个模块的变化都会影响到其他模块,增加了维护和修改的难度。
- 内聚是指一个模块内部的各个元素之间的紧密程度。它衡量的是模块内部元素的相关性,或者说是模块内部各个功能的联系度。高内聚意味着模块内部的功能高度相关,模块内部的代码是为了实现一个单一的、明确的功能而组织的。低内聚则意味着模块内部的功能没有明确的目标,模块中的各个元素职责分散,缺乏相关性。
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. 业务逻辑层
- 职责:业务逻辑层负责处理应用程序的核心业务逻辑,它充当了表示层和数据访问层之间的中介。所有复杂的计算、规则判断和数据转换等任务都在这一层进行。业务逻辑层通常包含接口和其实现类(如
Service
和ServiceImpl
),它们负责调用数据访问层(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 操作。数据访问层通常由
Mapper
或DAO
(Data Access Object)类组成。Mapper
是 MyBatis 中的接口,而DAO
在其他框架中通常代表数据访问的类。 - 组件:
Mapper
或DAO
,这些类负责数据持久化操作,定义数据库查询语句,并将数据库结果返回给业务逻辑层。 - 技术:MyBatis、JPA(Hibernate)、JDBC、Spring Data JPA 等。
@Mapper
public interface UserMapper {User findById(Long id);
}
组件之间的协作
- 表示层 (
Controller
) 接收用户请求,调用业务逻辑层 (Service
) 进行处理。 - 业务逻辑层 (
ServiceImpl
) 通过调用数据访问层 (Mapper
) 来获取或更新数据。 - 数据访问层 (
Mapper
) 负责与数据库进行交互,执行 SQL 操作。 - 处理结果返回到 表示层 (
Controller
),最终响应给用户。
层级 | 主要职责 | 主要组件(类) | 主要技术 |
---|---|---|---|
表示层 | 处理用户请求和响应 | Controller、RestController | Spring MVC、JSP、Thymeleaf |
业务逻辑层 | 处理业务逻辑 | Service、ServiceImpl | Spring Service |
数据访问层 | 与数据库交互,执行数据操作 | Mapper、DAO | MyBatis、JPA、JDBC |
完整流程示例:
- 前端发起请求:用户通过 Web 浏览器或其他客户端发起请求(如 GET 或 POST)。
- Controller 处理请求:
Controller
接收请求,调用相应的业务逻辑层 (Service
) 来处理业务。 - Service 进行业务逻辑处理:
ServiceImpl
处理复杂的业务逻辑,并可能需要通过Mapper
与数据库进行交互。 - Mapper 查询数据库:
Mapper
执行 SQL 查询,获取数据并返回。 - 业务层处理数据:
ServiceImpl
对数据库返回的数据进行处理和转换。 - Controller 返回响应:
Controller
将处理结果(通常是数据)返回给前端。
3.2 各层中的职责和关系
+-----------+ +-----------+ +----------------+ +-------------+ +-------------+
| Controller| -----> | Service | -----> | ServiceImpl | -----> | Mapper | -----> | POJO |
+-----------+ +-----------+ +----------------+ +-------------+ +-------------+↑ ↑ ↑ ↑ ↑(调用接口) (调用实现) (调用数据库操作) (持久化数据) (封装数据)
各层的职责和关系:
-
Controller: – 负责接收请求,调用
Service
层的接口。- 职责:接收前端请求,调用
Service
层进行处理,并返回处理结果给前端。 - 与其他组件的关系:
Controller
接收到前端请求后,调用Service
接口中的方法进行业务处理,最终返回处理结果。
- 职责:接收前端请求,调用
-
Service (业务层接口): – 定义业务逻辑的接口。
- 职责:定义业务逻辑的抽象接口。
Service
层提供了一系列业务方法,用于业务操作的声明,但不包含具体实现。 - 与其他组件的关系:
Service
层由ServiceImpl
实现,Controller
调用Service
接口提供的业务方法。Service
只定义接口,不涉及具体的业务实现细节。
- 职责:定义业务逻辑的抽象接口。
-
ServiceImpl (服务实现类): – 实现业务逻辑,调用
Mapper
层的数据库操作。- 职责:
ServiceImpl
是Service
接口的具体实现,负责处理具体的业务逻辑。它可以调用Mapper
层进行数据库操作,并封装业务操作。 - 与其他组件的关系:
ServiceImpl
调用Mapper
进行数据库操作,获取或更新数据,并将结果返回给Controller
。它的作用是将数据库访问与业务逻辑分开。
- 职责:
-
Mapper (数据访问层): – 负责数据库的操作,将数据存取到 POJO 中。
- 职责:
Mapper
是与数据库交互的层,通常定义了数据库的查询、插入、更新和删除操作。实现通常MyBatis
- 职责:
-
POJO (数据模型): – 表示数据模型,封装数据。
- 职责:POJO 是普通的 Java 对象,通常用于表示数据库中的一行记录或者某些数据结构。它封装了数据,并为这些数据提供 getter 和 setter 方法。
- 与其他组件的关系:POJO 作为数据模型,通常用于与数据库交互,它由
Mapper
来操作,ServiceImpl
会将 POJO 作为处理结果传递给Controller
。
工作流程:
- 用户请求:用户通过前端发起请求,
Controller
接收请求。 - 调用 Service 接口:
Controller
调用Service
接口定义的方法来执行业务操作。 - 业务实现:
ServiceImpl
作为Service
接口的实现,负责具体的业务逻辑,并调用Mapper
进行数据操作。 - 数据库操作:
Mapper
执行数据库操作,将数据从数据库加载到 POJO 中,或者将 POJO 中的数据保存到数据库。 - 返回结果:
ServiceImpl
将结果(通常是 POJO 对象或集合)返回给Controller
,Controller
将处理结果返回给前端。
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 '用户表,存储所有用户信息';
下面是模拟数据
4.2 服务端代码
-
POM 安装分页查询分页插件PageHelper,JAXBJava类映射到XML表示形式
创建项目
我的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 在测试阶段的问题发现
这是由于pom.xml,把下面的这个删去,然后在右侧的maven配置中clean一下重新刷maven,最终重新build一下代码即可
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资源下,新建一个同级的包,切记是以‘/'分割的
在其中同名的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>
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调试
还有json格式的新增用户
相关文章:

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

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

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

【C语言】_指针运算
目录 1. 指针-整数 2. 指针-指针 2.1 指针-指针含义 2.2 指针-指针运算应用:实现my_strlen函数 3. 指针的关系运算(大小比较) 1. 指针-整数 联系关于指针变量类型关于指针类型和指针-整数相关知识: 原文链接如下࿱…...

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

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

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

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

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

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

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

华为ensp-BGP路由过滤
学习新思想,争做新青年,今天学习的是BGP路由过滤 实验目的: 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容: 本实…...

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键值:包含子嵌套列表和字典
目标:取json中所有的Name、Age字典 思路:递归处理字典中直接包含子字典的情况, import jsondef find_targ_dicts(data,key1,key2):result {}if isinstance(data, dict):if key1 in data and key2 in data: # 第一层字典中包含key1和key2re…...

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

Formality:官方Tutorial(一)
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文是对Synopsys Formality User Guide Tutorial中第一个实验的翻译(有删改),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,检查每个子字符串是否与 needle 匹配for i in range(b - a 1):if…...

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

在 Windows 上使用 SSH 密钥访问 Linux 服务器
本章目录: 前言1. 准备工作2. 生成 SSH 密钥对步骤 1:打开命令行步骤 2:运行 ssh-keygen 命令步骤 3:选择密钥保存位置步骤 4:设置密钥密码(可选)步骤 5:生成密钥对 3. 查看生成的密钥文件4. 将…...

小白0基础centos8安装docker
总述:博主作为0基础小白将详细记录第一次从centos8的下载到安装docker的过程,包括中间出现的问题和解决方案 1Centos8下载 参见博文CentOS 8 的安装(官方安装、清华大学开源软件镜像站、阿里云镜像、网易镜像下的安装步骤)_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(这个路径根据自己实际情况变化)有个pg_hba.conf文件,修改里面host内容如下,我这里设置的是所有ip都能…...

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

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

web实操9——session
概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印:…...

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

.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下载与安装步骤: 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能(可选)6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具,尤其适合数据科学、机器…...

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