0x03 http协议和分层架构

news/2025/3/6 9:10:07/
http://www.w3.org/2000/svg" style="display: none;">

HTTP协议

简介

Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

https://i-blog.csdnimg.cn/img_convert/b5bd814771a5bfa8eb1017a17f59299a.png" alt="1740749054094.png" />

  • http协议基于TCP协议:面向连接,安全
  • 基于请求-响应模型:一次请求对应一次响应
  • HTTP协议是无状态的协议:对事务处理没有记忆能力。每次请求-响应都是独立的,优点是速度快,缺点是多次请求间不能共享数据

请求协议

https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fwww.helloimg.com%2Fi%2F2025%2F02%2F28%2F67c1c557b09c2.png&pos_id=img-nGVPrMI5-1740794272091" alt="外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传" />

请求行:请求数据第一行:请求方式(get、post)、资源路径、协议

请求头:第二行开始,格式:key:value

常见请求头:

  1. Host:请求的主机名
  2. User-Agent:浏览器版本
  3. Accept:表示浏览器能接受的资源类型,如text/,image/
  4. Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
  5. Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip、deflate
  6. Content-Type:请求主题的数据类型
  7. Content-Length:请求主体的大小(单位:字节)

请求体post请求,存放请求参数

请求方式-GET:请求参数在请求行中,没有请求体。GET请求大小在浏览器中是有限制的。

请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。

请求数据获取

浏览器端发送请求数据后,服务器端需要接受并获取请求数据。Web服务器(Tomcat)对http协议的请求数据进行解析,并进行了封装(HttpServletRequest),在调用Controller方法的时候传递给了该方法。这样,就使得程序员不必直接对协议进行操作,让web开发更加便捷。

响应协议

https://i-blog.csdnimg.cn/img_convert/7dfb4a0fbd24517462111207bf5f01db.png" alt="1740754578078.png" />

响应行:响应数据第一行(协议、状态码、描述)

https://i-blog.csdnimg.cn/img_convert/15459eb870555c7fca2d87e369b6be8b.png" alt="1740754789705.png" />

响应头:第二行开始,格式(key:value)

常见响应头
Content-Type:表示响应内容的类型,例如text/html,application/json

Content-Length:表示改响应内容的长度

Content-Encoding:表示改响应压缩算法,例如gzip

Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒

Set-Cookie:告诉浏览器为当前页面所在的域设置cookie

响应体:最后一部分,存放响应数据

响应数据设置

web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。

分层解耦

三层架构

https://i-blog.csdnimg.cn/img_convert/282219e53a58987bfb145bbea0a8c2c9.png" alt="1740789574472.png" />

对代码进行拆分的原因是要遵循单一职责原则,便于复用和后期维护

分层解耦

拆分完三层架构之后会发现,Service调用Dao,Controller调用Service都是通过在本层new一个另外一层的对象来实现功能的调用,这样三层之间的耦合度就比较高,下面需要进行解耦合。

解耦合主要是通过Spring框架两项关键的技术控制反转(Inversion Of Control\IOC)依赖注入(Dependency Injection \DI)

控制反转IOC:对象的创建控制权由程序自身转移到外部(容器),这种思想为控制反转

依赖注入DI:容器为应用程序提供运行时所以来的资源称之为依赖注入

Bean对象:IOC容器中创建、管理的对象,称之为Bean


下面是如何具体实现分层解耦

  1. 将Dao及Service层的实现类,交给IOC容器管理Component注解
  2. 为Controller及Service注入运行时依赖的对象Autowired注解

UserController的代码

java">@RestController
public class UserController {@Autowiredprivate Userservice userservice;@RequestMapping("/list")public List<User> list(){List<User> userList = userservice.findAll();return userList;}}

UserServiceImpl的代码

java">@Component
public class UserServiceImpl implements Userservice {@Autowiredprivate UserDao userDao;@Overridepublic List<User> findAll() {List<String> lines = userDao.findAll();//2.解析数据,封装成对象 --> 集合List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}

UserDaoImpl的代码

java">@Component
public class UserDaoImpl implements UserDao {public List<String> findAll(){//1.加载并读取文件InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());return lines;}
}

IOC

衍生注解,是为了将类划分到三层架构,哪一层就是用对应的衍生注解

https://i-blog.csdnimg.cn/img_convert/9c0b6a16146cf0bbc6a1a28084382ee1.png" alt="1740791962986.png" />

代码中声明bean的四大注解,想要生效,还需要被组件扫描注解@ComponentScan扫描

虽然在上面代码中注解@ComponentScan没有被显示配置,但实际上已经包含在启动类声明注解@SprintBootApplication中,默认扫描的范围时启动类所在包及其子包。

https://i-blog.csdnimg.cn/img_convert/03cde650f7a54a5d411bc11d5fad6f02.png" alt="1740792639436.png" />

DI

基于**@Autowired**进行依赖注入的常见方式有三种

第一种:属性注入

java">@RestController
public class UserController {@Autowiredprivate UserService userService;
}

优点:代码简洁、方便快速开发

缺点:隐藏了类之间的依赖关系,可能破坏类的封装性

第二种:构造函数注入

java">@RestController
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
}

优点:能清晰地看到类的依赖关系、提高代码的安全性

缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿

第三种:setter注入

java">@RestController
public class UserController {private UserService userService;@Autowiredpublic setUserUserService(UserService userService) {this.userService = userService;}
}

优点:保证了类的封装性,依赖关系更清晰

缺点:代码繁琐

实战中很多企业会选择基于属性的注入,第一种和第二种用的更多一点

@Autowired是根据类型注入的

如果一个类型有多个Bean对象,则是不允许的,会直接报错

需要指定具体注入哪个Bean对象

https://i-blog.csdnimg.cn/img_convert/065b122c8cf7e3952b6fc0fa2ef22535.png" alt="1740793984627.png" />

@Resoure和@Autowired

@Resoure是javeee中提供的注解,@Autowired是Spring框架中提供的注解

@Resoure默认是按名称注入的,@Autowired默认是按类型注入


http://www.ppmy.cn/news/1577029.html

相关文章

Python编程题

1.斐波那契数列 def fib(n):if n 1 or n 2:return 1else:return fib(n - 1) fib(n - 2) n int(input("输入要打印的斐波那契数的项数: ")) for i in range(1,n1):print(fib(i),end" ") 2.计算等差数列前n项和 使用列表保存一个首项为2&#xff0c;公…

< 自用文儿 > DELETED 设置速读 in Ubuntu24

systemctl 和 DELETED&#xff1a; 配置文件&#xff1a; vi /etc/systemd/system/ DELETED.service [Unit] DescriptionV2Ray Service Documentation DELETED Afternetwork.target nss-lookup.target[Service] #Usernobody CapabilityBoundingSetCAP_NET_ADMIN CAP_NET_BIN…

DeepSeek掘金——DeepSeek-R1驱动的金融分析师

DeepSeek掘金——DeepSeek-R1驱动的金融分析师 我们将专注于创建一个专门用于提取相关新闻见解的代理。该代理将利用 DeepSeek-R1 提供全面的市场洞察。 在当今快节奏的金融市场中,获取准确及时的信息对于做出明智的投资决策至关重要。想象一下,一位人工智能金融分析师能够分…

ReconDreamer:通过在线恢复构建驾驶场景重建的世界模型

24年11月来自极佳科技、北大、理想汽车和中科院自动化所的论文“ReconDreamer: Crafting World Models for Driving Scene Reconstruction via Online Restoration”。 ReconDreamer&#xff0c;通过逐步整合世界模型知识来增强驾驶场景重建。具体来说&#xff0c;DriveRestor…

Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]

ChatOn 链接&#xff1a;https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言&#xff1a;全语言支持

OPPO Find N5折叠手机:创新与实用的完美融合,FPC应用展现科技魅力【新立电子】

OPPO Find N5作为2025年新出世的折叠手机&#xff0c;以其卓越的设计、强大的性能以及创新的技术&#xff0c;为消费者带来了全新的使用体验。FPC&#xff08;柔性电路板&#xff09;在其中的运用&#xff0c;也进一步提升了手机的整体性能和用户体验。 OPPO Find N5的最大亮点…

物联网感应层设备的通信协议及数据上传路径详解

以下是物联网感应层设备的通信协议及数据上传路径详解&#xff0c;包含典型技术方案和实际应用案例&#xff1a; 一、通信协议矩阵 短距离传输&#xff08;<100m&#xff09; 协议类型技术特性典型设备应用场景BLE 5.22Mbps速率&#xff0c;mesh组网可穿戴设备医疗手环连接…

服务器托管对中小型企业有何帮助?

随着信息技术的快速发展&#xff0c;服务器托管服务逐渐成为中小型企业提升运营效率和降低经济成本的重要手段&#xff0c;本文则主要来探讨一下服务器托管服务对于中小型企业都有着哪些帮助吧&#xff01; 中小型企业选择服务器托管&#xff0c;不仅能够提高企业的业务处理能力…