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 的一个子模块,它专注于…...
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…...
智汇厦门:苏哒智能携其智能化产品亮相文心中国行现场
2025年1月2日,文心中国行再次踏足美丽的鹭岛厦门。 本次的文心中国行活动不仅有来自政府、高校及企业的精英专家将齐聚一堂,分享AI与大模型的最新研究成果,还正式揭牌百度飞桨(厦门)人工智能产业赋能中心,…...
SQL 分析函数与聚合函数的组合应用
目标:掌握 SQL 中分析函数(窗口函数)与聚合函数的组合使用,通过实际案例实现复杂业务需求,如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数(Aggregate Functions):…...
【Elasticsearch入门到落地】5、安装IK分词器
接上篇《4、Elasticsearch的安装》 上一篇我们进行了Elasticsearch以及Kibana的环境准备及软件安装,本篇我们安装最后一个支持软件IK分词器。 一、IK分词器概念 我们再来回顾一下上一张IK分词器的概念: IK分词器(IK Analyzer)是…...
8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)
RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator(生成器)3.3 检索器(Retriever)3.4训练(Training)3.5**解码方法**(求近似 )3.6微调的参数 …...
【论文笔记】Contrastive Learning for Sign Language Recognition and Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Contrastive Learning for…...
《C++设计模式》策略模式
文章目录 1、引言1.1 什么是策略模式1.2 策略模式的应用场景1.3 本文结构概览 2、策略模式的基本概念2.1 定义与结构2.2 核心角色解析2.2.1 策略接口(Strategy)2.2.2 具体策略实现(ConcreteStrategy)2.2.3 上下文(Cont…...
细说STM32F407单片机轮询方式CAN通信
目录 一、项目介绍 二、项目配置 1、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 2、CAN1 (1)Bit Timings Parameters组,位时序参数 (2)Basic Parameters组,基本参数 (3)…...
perf:对hutool的BeanUtil工具类做补充
分享一个自定义的BeanUtil,继承的是hutool的工具类,然后自己扩充了几个方法; 1、实现了两个对象覆盖非空属性的功能(经常使用),不需要设置CopyOptions; 2、两个对象,对指定前缀的属…...
【数据结构】栈与队列(FIFO)
在阅读该篇文章之前,可以先了解一下堆栈寄存器和栈帧的运作原理:<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹,最先装进去的子弹最后射出来,最后装入的子弹…...
02.01、移除重复节点
02.01、[简单] 移除重复节点 1、题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 2、解题思路 为了实现这一目标,我们可以使用一个哈希表(或集合)来记录已经遇到的节点值,逐步遍历链表并删…...
Spring thymeleaf 的快速默认搭建使用
Spring thymeleaf 的快速默认搭建使用 thymeleaf 的搭建Pom 文件 thymeleaf 的使用Controller返回参数String资源文件路径访问端点显示HTML页面 thymeleaf 的搭建 Pom 文件 Pom 文件引入 spring-boot-starter-thymeleaf 依赖 <dependency><groupId>org.springfra…...
unity学习3:如何从github下载开源的unity项目
目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢? 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2(适合内部项目) 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…...
印象笔记07——试一试PDF标注
印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期,我再次查询了资料,印象笔记还是有一些可圈可点的功能的(当然部分有平替),针对会员作用,开发使用场景虽然是逆向的,但我坚信这是一部分人的现…...
Logback的使用
1、基本认识 logback官方文档:http://logback.qos.ch 具体样例:https://www.baeldung.com/logback 从下面依赖关系图可以看见,Springboot的核心启动器spring-boot-stater依赖了spring-boot-starter-looging,而这个就是日志的启动器…...
沙箱模拟支付宝支付3--支付的实现
1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…...
微信小程序滑动解锁、滑动验证
微信小程序简单滑动解锁 效果 通过 movable-view (可移动的视图容器,在页面中可以拖拽滑动)实现的简单微信小程序滑动验证 movable-view 官方说明:https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…...
Redis的常用命令
Redis中文字典网站 redis 命令手册https://redis.com.cn/commands.html Keys * 查看当前库所有的key exists ke 判断某个key是否存在 type key查看你的key是什么类型 Del key删除执行的key数据 unlink key非阻塞删除,仅仅将keys从keyspace元数据中删除…...
国内Ubuntu环境Docker部署 ComfyUI
国内Ubuntu环境Docker部署 ComfyUI 趁着这两天用docker部署了 Stable Diffusion,顺手也安排上 ComfyUI。 ComfyUI相比 Stable Diffusion 原生的 WEB UI,更容易让人了解其出图的过程,极其适合学习与研究。拼接其强大的插件节点、不仅能够实现文…...
Meta 的新策略,将 AI 生成的角色整合到其社交媒体平台
一、Meta新年规划及引人注目的举措 多元规划背景:在新的一年,Meta制定了多维度的战略规划,旨在巩固并拓展其在科技领域的影响力。增强现实与元宇宙是其长期布局的重点方向,期望借此塑造未来互联网的交互形态;面对TikTo…...
玩转OCR | 腾讯云智能结构化OCR初次体验
目录 一、什么是OCR(需要了解) 二、产品概述与核心优势 产品概述 智能结构化能做什么 举例说明(选看) 1、物流单据识别 2、常见证件识别 3、票据单据识别 4、行业材料识别 三、产品特性 高精度 泛化性 易用性 四、…...
蓝桥杯JAVA--003
需求 2.代码 public class RegularExpressionMatching {public boolean isMatch(String s, String p) {if (p.isEmpty()) {return s.isEmpty();}boolean firstMatch !s.isEmpty() && (s.charAt(0) p.charAt(0) || p.charAt(0) .);if (p.length() > 2 && p…...
STC51和STM32单片机烧录引脚的完整名称
STC51 和 STM32 单片机烧录引脚的完整名称 1. STC51 单片机的烧录引脚 STC51 单片机通过 串口(UART) 进行程序下载,主要引脚如下: 引脚名称完整英文名称说明TXDTransmit Data串口发送引脚,用于发送数据。RXDReceive…...
阿里云大模型ACP高级工程师认证模拟试题
阿里云大模型ACP高级工程师认证模拟试题 0. 引言1. 模拟试题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题多选题单选题单选题单选题多选题多选题单选题多选题单…...
深入理解计算机中的补码、反码、原码
问题: 我们每天用的钟表,其实只有1~12这12个数字,但我们日常会说13点、17点之类的。 问:13点在钟表上哪个位置? 答:很简单嘛,1点的位置。 你不觉得奇怪吗,为啥13点会和1点在同一个位…...
调试:用电脑开发移动端网页,然后用手机真机调试
一、背景 电脑开发移动端,然后想真机调试... 二、实现 2.1、电脑和手机链接相同局域网 2.2、pnpm run dev 启动项目 2.3、浏览器访问 localhost:3001/login 2.4、Windowsr 输入cmd,在cmd输入 ipconfig 2.5、浏览器访问 ip地址加/login 2.6、手机端…...
深入浅出:Spring Boot 自定义消息转换器的实现与应用
Spring Boot 作为当前最流行的 Java Web 开发框架之一,广泛应用于微服务架构、企业级应用等多个场景。Spring Boot 提供了灵活且易于扩展的架构,其中消息转换器(Message Converter)是其重要组成部分。消息转换器在 Spring Boot 中…...
基于AI大模型的医院SOP优化:架构、实践与展望
一、引言 1.1 研究背景与意义 近年来,人工智能(AI)技术取得了迅猛发展,尤其是大模型的出现,为各个领域带来了革命性的变化。在医疗领域,AI 医疗大模型正逐渐崭露头角,展现出巨大的应用潜力。随着医疗数据的海量积累以及计算能力的大幅提升,AI 医疗大模型能够对复杂的…...
Maven项目集成SQL Server的完整教程:从驱动配置到封装优化
前言 在最近的系统对接过程中,由于对方团队不熟悉技术,最终选择直接提供 SQL Server 视图。本文详细记录了使用 Maven 集成 SQL Server 驱动的过程,以及从配置到查询的各个关键步骤,还包括注意事项与常见问题,希望对需…...
Java 21 优雅和安全地处理 null
在 Java 21 中,判断 null 依然是开发中常见的需求。通过使用现代 Java 提供的工具和特性,可以更加优雅和安全地处理 null。 1. 使用 Objects.requireNonNull Objects.requireNonNull 是标准的工具方法,用于快速判断并抛出异常。 示例 import java.util.Objects;public c…...
Java(四十四)file
Java中的file类:代表文件或者文件夹(目录)类,也就是说将文件或者文件夹通过File类来封装成对象。 一:常用的构造方法: 使用file类,需要通过构造方法创建一个file对象。 1:public File(String pathname) public static void main(String[] args) {File fl = new File(&…...
【51项目】51单片机自制小霸王游戏机
视频演示效果: 纳新作品——小霸王游戏机 目录: 目录 视频演示效果: 目录: 前言:...
【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观
数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。...
《新概念模拟电路》-三极管
三极管 本系列文章主要学习《新概念模拟电路》中的知识点。在工作过程中,碰到一些问题,于是又翻阅了模电这本书。我翻阅的是ADI出版的,西安交通大学电工中心杨建国老师编写的模电书。 <模电>和《数电》这两本书是电子学的专业基础课&…...
K 近邻算法入门指南:明氏距离与皮尔森距离的基础讲解
1、K近邻算法介绍 K近邻(k-Nearest Neighbor,KNN)分类算法的思路是:在特征空间中,如果一个样本附近的k个最近样本的大多数属于某一个类别,则该样本也属于这个类别。K近邻算法中,所选择的邻居都是已经正确分类的对象。…...
如何验证imap是否生效
要验证您的 Outlook 邮箱是否启用了 IMAP 并且正常工作,可以按照以下步骤进行操作: 1. 确认 Outlook 邮箱是否启用 IMAP 步骤: 登录到您的 Outlook Web 账户: 打开浏览器,访问 Outlook.com 或 Microsoft 365 Outlook…...
MySQL 06 章——多表查询
多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作 前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没…...
转换VMware Esxi 虚拟机到 Windows2019 Hyper-V Server
Hyper-v专用P2V工具disk2vhd实际应用 工具介绍 disk2vhd是一个非常小的P2V转换工具,可以将你的物理服务器或Esxi vm 转换成为VHD或者vhdx格式的虚拟硬盘文件,然后在虚拟平台上作为一台虚拟机来使用。目前disk2vhd的最新版本是2.0.1,已经可以…...
头歌实训2-1:面向对象程序设计-基础部分
第1关:定义银行员工类BankEmployee 本关任务:编写银行员工类BankEmployee,要求: 1.银行员工类的属性包括姓名name,工号num,工资salary 2.姓名name和工号num设置为私有属性,并将salay设置为默认参数3000 平…...
超高分辨率 图像 分割处理
文章大纲 制造业半导体领域高分辨率图像半导体数据集开源的高分辨率晶圆图像数据集1. WM-811K数据集2. Kaggle上的WM-811K Clean Subset数据集医疗 病理领域高分辨率图像1. Camelyon+2. CAMELYON173. CPIA Dataset4. UCF-WSI-Dataset航拍 遥感中的高分辨率 图像航拍遥感领域高分…...
使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作
可以使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作。apply 方法允许你逐行或逐列地对 DataFrame 或 Series 的元素进行操作,而且你可以将其他列的值作为参数传递给函数。 示例:使用 apply 结合其他…...
[CTF/网络安全] 攻防世界 warmup 解题详析
查看页面源代码,发现source.php 得到一串代码,进行代码审计: <?phpclass emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"];…...
力扣第389题—找不同
class Solution:def findTheDifference(self, s: str, t: str) -> str:# 对字符串 s 和 t 进行排序a sorted(s)b sorted(t)# 比较排序后的两个列表for i in range(len(a)):if a[i] ! b[i]:return b[i]# 如果前面的比较没有找到差异,那么差异字符在 t 的最后一个…...
vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)
很多小伙伴苦于无法搭建一个规范的前端项目,导致后续开发不规范,今天给大家带来一个基于Vite6TypeScriptVue3ESlint9Prettier的搭建教程。 目录 一、基础配置1、初始化项目2、代码质量风格的统一2.1、配置prettier2.2、配置eslint2.3、配置typescript 3、…...
滴滴数据分析80道面试题及参考答案
如何衡量分类好坏? 衡量分类好坏有多种方法,常用的有准确率、精确率、召回率、F1 值、ROC 曲线与 AUC 值等。 准确率:是指分类正确的样本数占总样本数的比例,计算公式为:准确率 = (分类正确的样本数)/(总样本数)。准确率越高,说明分类器整体的分类效果越好,但在正负…...
嵌入式应用软件开发中C语言方向面试题
嵌入式应用软件开发中C语言方向面试题随笔 前言一、C语言基础二、嵌入式开发相关三、硬件相关知识五、实际编程问题前言 做嵌入式开发这么多年了,简单记录下C语言方向常见面试题,这里是应用软件方向的。 一、C语言基础 C语言的指针与数组的区别是什么?指针:指针是一个变量…...
vue3中mixins替代方案
使用自定义 Hooks(Composables) 自定义 Hooks 是一种基于函数的代码复用方式,可以在 setup 函数中使用。它允许将组件的逻辑分割成更小的、可复用的部分。 useCounter.js //useCounter.js import { ref, onMounted } from vue;export func…...
线性代数自学资源推荐我的个人学习心得
1.前言 自己这个学期的课程基本上就结束了,因此我自己就开始学习下个学期的课程--线性代数,也是我们在大学里面的最后一门数学课程了; 之前有过一些这个线性代数的基础,当时主要是参加这个数学建模比赛去学习这个matlab吗&#…...
WordPress Crypto 插件 身份认证绕过漏洞复现(CVE-2024-9989)
0x01 产品简介 WordPress Crypto插件是指那些能够为WordPress网站提供加密货币支付、信息显示或交易功能的插件。这些插件通常与WordPress电子商务插件(如WooCommerce)集成,使网站能够接受多种加密货币支付,或展示加密货币实时信息。支持多种加密货币支付,付款直接进入钱…...