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. 将…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
