java中的Servlet2.x详解
一、Servlet 2.x 版本演进与核心特性
Servlet 2.x 是 Java Web 开发中承上启下的重要版本系列,主要包括 Servlet 2.4 和 Servlet 2.5 两个子版本。以下是其核心特性与改进:
-
Servlet 2.4(2003年发布)
-
XML Schema 支持:引入基于 XML Schema 的部署描述符(
web.xml
),取代 DTD,提高了配置文件的可扩展性和验证能力。 -
多路径匹配优化:允许通过通配符(如
*.do
)灵活配置 URL 映射,增强请求路由的灵活性。 -
新增监听器:支持
ServletRequestListener
和ServletRequestAttributeListener
,扩展了对请求生命周期的监控能力。 -
安全性增强:优化会话管理机制,支持更细粒度的安全约束配置。
-
-
Servlet 2.5(2005年发布)
-
注解初步支持:兼容 Java 5 的注解特性,允许通过
@WebServlet
、@WebFilter
等注解简化配置(需配合自定义处理器实现)。 -
依赖去除与兼容性:移除
SingleThreadModel
接口,明确推荐无状态设计以解决线程安全问题。 -
HTTP 方法扩展:支持
PUT
、DELETE
等 HTTP 方法,为 RESTful 风格 API 开发奠定基础。 -
异步处理基础:虽未完全支持异步请求,但为后续 Servlet 3.0 的异步特性做了铺垫。
-
二、Servlet 2.x 核心机制
-
生命周期管理
-
初始化(
init()
):容器首次加载时调用,用于一次性资源加载(如数据库连接)。 -
请求处理(
service()
):根据 HTTP 方法分派到doGet()
或doPost()
等方法,开发者需重写具体方法实现业务逻辑。 -
销毁(
destroy()
):服务器关闭时释放资源,如关闭线程池或文件句柄。
-
-
配置方式
-
XML 配置(主流方式):通过
web.xml
定义<servlet>
和<servlet-mapping>
,关联类与 URL 路径。<servlet><servlet-name>UserServlet</servlet-name><servlet-class>com.example.UserServlet</servlet-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param> </servlet> <servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/user/*</url-pattern> </servlet-mapping>
-
注解模拟(Servlet 2.5):通过自定义注解(如
@WebServlet
)和过滤器实现类注解配置,减少 XML 依赖。
-
三、关键组件与扩展功能
-
ServletContext 全局上下文
-
作用域:整个 Web 应用共享,用于存储全局参数(如数据库配置)或共享对象。
-
资源访问:通过
getResourceAsStream()
读取类路径或 Web 资源(如配置文件)。
-
-
过滤器(Filter)与监听器(Listener)
-
过滤器链:支持多过滤器按顺序拦截请求,实现日志记录、权限校验等功能。
-
监听器类型:
-
ServletContextListener
:监控应用启动/销毁事件。 -
HttpSessionListener
:跟踪会话创建与超时。
-
-
-
会话管理(HttpSession)
-
会话跟踪:默认基于 Cookie 或 URL 重写,支持跨请求的用户状态维护。
-
安全性:通过
session.invalidate()
主动销毁会话,防止会话固定攻击。
-
四、开发实践与优化
-
线程安全设计
-
避免实例变量:Servlet 实例为单例,多线程共享变量需同步或使用局部变量。
-
无状态化:推荐将状态信息存储于
HttpSession
或数据库,而非 Servlet 类成员。
-
-
性能优化
-
资源懒加载:在
init()
中初始化耗时资源,避免影响启动速度。 -
缓存策略:对频繁访问的静态数据(如配置参数)使用内存缓存。
-
-
调试与日志
-
日志集成:通过
ServletContext.log()
记录运行日志,或集成 Log4j 等框架。 -
异常处理:重写
doError()
方法统一处理异常,提升用户体验。
-
五、Servlet1.x与Servlet2.x的比较
1、规范演进与核心特性
对比维度 | Servlet 1.x | Servlet 2.x(2.4/2.5) |
---|---|---|
规范发布时间 | 1997年(1.0) | 2.4(2003年)、2.5(2005年) |
配置方式 | 完全依赖 web.xml ,无注解支持 | 2.5 开始实验性支持注解(需手动处理),但主流仍依赖 web.xml |
HTTP 方法处理 | 需在 service() 中手动解析请求方法(如 GET /POST ) | 通过 HttpServlet 抽象类自动分派到 doGet() 、doPost() 等具体方法 |
线程安全设计 | 默认单例多线程模型,开发者需自行处理实例变量同步问题 | 明确弃用 SingleThreadModel ,推荐无状态设计(局部变量替代成员变量) |
生命周期管理 | 初始化时机固定(首次请求触发) | 2.5 支持 <load-on-startup> 配置,允许容器启动时预加载 Servlet |
功能扩展性 | 仅支持基础请求处理,无内置会话管理、监听器等功能 | 2.4 新增 ServletRequestListener 等监听器,支持细粒度请求生命周期监控 |
2、核心组件与功能升级
-
请求处理抽象化
-
Servlet 1.x:需直接实现
Servlet
接口,手动编写service()
方法处理所有请求类型,代码冗余度高。 -
Servlet 2.x:引入
HttpServlet
抽象类,自动分派 HTTP 方法到doGet()
、doPost()
等专用方法,简化开发。
-
-
配置与注解支持
-
Servlet 2.5 实验性支持
@WebServlet
注解,但需配合自定义处理器实现类注解映射,未完全替代web.xml
。 -
示例对比:
<!-- 2.x 的 web.xml 配置 --> <servlet><servlet-name>UserServlet</servlet-name><servlet-class>com.example.UserServlet</servlet-class> </servlet>
// 2.5 实验性注解(需额外支持) @WebServlet("/user") public class UserServlet extends HttpServlet { ... }
-
-
会话与上下文管理
-
Servlet 1.x:无原生会话支持,需通过 Cookie 或 URL 重写手动实现状态跟踪。
-
Servlet 2.x:引入
HttpSession
对象,内置会话管理机制,支持跨请求数据存储。
-
3、性能与扩展性优化
-
线程模型改进
-
Servlet 1.x:单实例多线程易引发竞态条件(如共享实例变量)。
-
Servlet 2.x:通过无状态设计建议和线程池优化,提升并发处理能力。
-
-
资源管理增强
-
Servlet 2.4:支持通过
ServletContext
获取全局初始化参数,实现配置集中管理。 -
示例:
<!-- web.xml 全局参数 --> <context-param><param-name>appName</param-name><param-value>MyApp</param-value> </context-param>
-
4、适用场景与迁移建议
版本 | 典型场景 | 迁移建议 |
---|---|---|
1.x | 遗留系统维护、早期动态页面生成(如 JSP 混合开发) | 逐步重构至 2.x/3.x,利用抽象类和监听器简化代码 |
2.x | 企业级 Web 应用(需会话管理、过滤器链)、传统 MVC 架构(如 Struts 1.x) | 结合注解优化配置,逐步引入异步处理(Servlet 3.0+)提升性能 |
5、总结
Servlet 2.x 在 抽象层级(HttpServlet
)、功能扩展(监听器、会话管理)和 配置灵活性(实验性注解)上显著优于 1.x,为后续 3.0 的全面异步化和注解化奠定了基础。对于现代开发,建议优先采用 Servlet 3.0+ 规范,但理解 1.x/2.x 的差异对维护遗留系统和深入掌握 Java Web 底层机制仍至关重要。
六、Servlet 2.x 向 3.0 的过渡
-
注解支持演进:Servlet 2.5 的注解需手动实现处理器,而 3.0 原生支持注解配置。
-
异步处理完善:2.5 仅奠定基础,3.0 引入
AsyncContext
实现非阻塞 I/O。 -
模块化部署:3.0 允许通过片段(
web-fragment.xml
)替代集中式配置,2.x 仍依赖单一web.xml
。
总结
Servlet 2.x 系列通过 XML Schema 优化、监听器扩展 和 注解初步探索,显著提升了 Java Web 开发的灵活性与安全性。尽管其配置方式相对繁琐,但仍是企业级应用的核心技术基础。理解其生命周期、线程模型及扩展机制,有助于高效开发稳定可靠的 Web 服务,并为过渡到 Servlet 3.0+ 的现代化特性奠定基础。
相关文章:
java中的Servlet2.x详解
一、Servlet 2.x 版本演进与核心特性 Servlet 2.x 是 Java Web 开发中承上启下的重要版本系列,主要包括 Servlet 2.4 和 Servlet 2.5 两个子版本。以下是其核心特性与改进: Servlet 2.4(2003年发布) XML Schema 支持:…...
大模型deepseek如何助力数据安全管理
敏感数据识别与处理 精准定位敏感信息 :运用多模态识别引擎技术,快速扫描上传文件与输入内容,精准识别身份证号、银行卡号、商业合同关键信息等各类敏感数据,并支持金融、医疗等行业定制化规则库,满足不同行业的特殊需…...
【linux驱动】【设备树】按键设备树讲解
设备树你添加电源键示例。 / {gpio-keys {compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;button@1 {label = "Power Button";linux,code = <KEY_POWER>; // 按键编码,定义在include/uapi/linux/input-event-code…...
Vibe Coding:编程中的氛围与效率的艺术
引言 在软件开发的世界里,我们常常关注语言特性、框架选择和算法效率,却较少讨论一个同样重要的因素——编程时的"氛围"(vibe)。Vibe Coding是一种关注开发者心理状态、工作环境和整体"感觉"的编程方法论。它…...
算法岗实习八股整理——深度学习篇(不断更新中)
目录 激活函数特征典型例子sigmod函数tanh函数补充:零中心化输出优势非线性特性如何提升神经网络表现 激活函数 特征 非线性:激活函数满足非线性时,才不会被单层网络替代,神经网络才有意义可微性:优化器大多数是用梯…...
Java IO及Netty框架学习小结
Netty netty官网: Netty 什么是Netty? Netty 是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty 是一个 NIO 客户端服务器框架,可以快速轻松地开发网络应用程序(例如协议服务器和客…...
理想AI Talk第二季-重点信息总结
一、TL;DR 理想为什么要做自己的基模:座舱家庭等特殊VLM场景,deepseek/openai没有解决理想的基模参数量:服务端-300B,VLencoder-32B/3.6B,日常工作使用-300B,VLA-4B为什么自动驾驶可以达成&…...
软件架构之-论软件系统架构评估以及应用
论软件系统架构评估以及应用 摘要正文 摘要 2023年2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发,该项目旨在为长三角地区渔船建造设计院,以及渔船图纸审查机构提供一个便捷化的服务平台。在此项目中,…...
Java面试实战:从Spring Boot到分布式缓存的深度探索
Java面试实战:从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂,面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信,迎接这场技术“拷问”。 第一轮:基础问题 老王&#…...
2025年全国青少年信息素养大赛C++小学全年级初赛试题
一、单选题 1、在C中,表示逻辑运算符 "或" 的是?( )(5 分) A.|| B.& C. D. 解析:||是或者, &&是并且 2、…...
React中巧妙使用异步组件Suspense优化页面性能。
文章目录 前言一、为什么需要异步组件?1. 性能瓶颈分析2. 异步组件的价值 二、核心实现方式1. React.lazy Suspense(官方推荐)2. 路由级代码分割(React Router v6) 总结 前言 在 React 应用中,随着功能复…...
nginx相关面试题30道
一、基础概念与核心特性 1. 什么是 Nginx?它的主要用途有哪些? 答案: Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器,基于事件驱动的异步非阻塞架构,擅长处理高并发场景。 主要用途:…...
java中的Servlet1.x详解
Servlet 1.x 是 Java Web 开发的早期规范,为后续版本奠定了基础。以下是其核心特性、使用方式及与现代版本的对比分析: 一、Servlet 1.x 的核心特性 基础接口与实现 Servlet 1.x 的核心是 javax.servlet.Servlet 接口,开发者必须直接实现其五…...
给大模型“贴膏药”:LoRA微调原理说明书
一、前言:当AI模型开始“叛逆” 某天,我决定教deepseek说方言。 第一次尝试(传统微调): 我:给deepseek灌了100G东北小品数据集,训练三天三夜。结果:AI确实会喊“老铁666”了…但英…...
【数字电路】第七章 脉冲波形的产生与整形电路
一、脉冲波形的产生与整形电路概述 1.矩形脉冲的获得方法 2.矩形脉冲的主要参数 3.本章所涉及的电路 4.稳态与暂稳态 电路的暂稳态实际上是通过RC电路的充放电来实现的。 5.TTL电路输入等效电路 6.TTL电路的输出等效电路 7.CMOS电路的输入等效电路 8.CMOS电路的输出等效电路 …...
React Flow 边的基础知识与示例:从基本属性到代码实例详解
本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示例与实战源)。完整介绍…...
DB-MongoDB-00002--Workload Generator for MongoDB
## DB-MongoDB-00002–Workload Generator for MongoDB 1、介绍 Workload Generator for MongoDB was designed to help MongoDB users effortlessly generate data and simulate workloads for both sharded and non-sharded clusters. The generated workloads include s…...
buck变换器的simulink/matlab仿真和python参数设计
什么是Buck电路? BUCK电路是一种降压斩波器,降压变换器输出电压平均值Uo总是小于输出电压UD。通常电感中的电流是否连续,取决于开关频率、滤波电感L和电容C的数值。BUCK也是DC-DC基本拓扑,或者称为电路结构,是最基本的DC-DC电路…...
谷歌地球引擎GEE将多个遥感影像作为多个波段合并成一张图像并下载的方法
本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,下载多年的逐日的ERA5土壤湿度数据,并在下载时,将每年同月份内的每一天的图像作为一个波段加以合并的方法。 在之前的文章GEE谷歌地球引擎批量下载逐日…...
Debezium快照事件监听器系统设计
Debezium快照事件监听器系统设计 1. 系统概述 1.1 设计目标 为 Debezium 的快照过程提供可扩展的事件监听机制允许外部系统在快照过程中执行自定义逻辑提供线程安全的事件分发机制确保监听器的异常不会影响主快照流程1.2 核心功能 表快照开始事件监听表快照完成事件监听行数据…...
选择之困:如何挑选合适的 Python 环境与工具——以 Google Colaboratory 为例
引言:选择之困与 Python 的多样性 在过去的十年中,Python 编程语言以其简洁的语法、强大的功能和广泛的适用性迅速崛起,成为全球最受欢迎的编程语言之一。从数据科学到 Web 开发,从自动化脚本到人工智能,Python 无处不在。然而,这种多样性和快速发展也带来了一个显著的问…...
基于Java+MySQL+Servlet的留言系统开发全解析
本系统基于Java Web技术栈开发,采用前后端分离架构,后端通过Servlet实现业务逻辑,前端使用HTML/CSS/JavaScript构建交互界面。本文将详细解析系统设计思路、技术实现与核心代码,助您快速掌握留言系统开发精髓。 一、项目简介 本留…...
实操分享java应用容器化,使用docker作为容器工具
### 一. 目的 将现有的java应用容器化,使用docker作为容器工具。 ### 二. 配置 #### 1. Java应用中的配置 ##### a. Java子项目中的pom文件配置 ```xml <build> <plugins> <plugin> <groupId>org.spring…...
李臻20242817_安全文件传输系统项目报告_第12周
安全文件传输系统项目报告(第 9 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…...
19-I2C库函数
一、IIC配置流程 IIC配置流程需要添加的库函数:stm32f4xx_i2c.c 1、理解电路原理图 SCL --- PB8 SDA -- PB9 使用I2C1 2、配置I2C库函数的步骤 (1)使能GPIOB组时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);(2…...
minicom串口调试助手
sudo apt-get install minicom 配置 sudo minicom -s 然后用方向键向下移动到“Serial port setup”,回车 按键盘“A”把串口的映射文件名输入。 按键盘“E”可以修改波特率 按键盘“F”把硬件流关闭,否则minicom可能无法接收键盘输入。 配置好后&…...
扫描件交叉合并PDF免费软件 拖拽即合并 + 自动对齐页码 档案整合更轻松
各位办公小能手们!我跟你们说啊,今天要给你们介绍个超厉害的工具,叫PDFCrossMerge。这玩意儿就像一个神奇的文档小魔法师,专门搞PDF扫描件交叉合并的事儿,能解决单面扫描文件正反面页码顺序的大难题。 先说说它的核心…...
atcoder C - ~
https://atcoder.jp/contests/abc406/tasks/abc406_c 题目简述: 给定一个序列p,让你求出p的所有子序列中波浪形序列的个数 波浪形序列的定义:1:长度>4;2:仅存在一个波峰和波谷;3࿱…...
PCB设计实践(十八)PCB设计铜厚选择及分层设计深度解析
PCB铜箔厚度作为电路板设计的核心参数之一,直接影响电路性能、可靠性及成本。本文将从铜厚选择的六大核心要素、多层板分层设计的策略、制造工艺的耦合关系三大维度,系统性解析PCB铜厚设计的工程方法论,并结合典型应用场景提供决策框架。 一、…...
React 19中如何向Vue那样自定义状态和方法暴露给父组件。
文章目录 前言一、什么是 useImperativeHandle?1.1 为什么需要 useImperativeHandle?1.2 基本语法 二、useImperativeHandle 的常见用法3.1 暴露自定义方法3.2子组件封装的弹窗关闭方法暴露给外部 注意点:总结 前言 在 React 的函数组件中&a…...
【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现
【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现 高性能网络学习目录 基础内容(两周完成): 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发PosixAPIQUIC 2.3协程库…...
1.5 MouseDown,MouseUp,LostMouseCapture的先后顺序
本文目标是实现如下功能: 按下一个按钮后置位某变量;鼠标松开后复位某个变量? 看似简单,但是一般来说会存在如下两种现象: 鼠标移出按钮:默认会丢失鼠标事件跟踪,即MouseLeftButtonUp事件并不会被触发。 焦点切换:Tab 键切换焦点会干扰按钮的事件捕获 本文通过几个…...
备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数
备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数 题目可点下方去处,支持在线编程~ 求最小公倍数_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点击下方去处,支持源码和素材获取~ 求最小公倍数-scratch作品-少儿编程题库学习…...
Vue3进行工程化项目,保姆级教学(编译软件:vscode)大部分编译平台适用
目录 1. 创建vue工程 1.1 第一步 1.2 选择名称和工件 1.3 选择语言 1.4 自动下载js 1.5 运行vue工程 1.6 成功页面 2. 更改vue工程安装的位置 3. 更改运行工程方式 第一步 第二步 编辑 第三步 调试 编辑 运行项目 前面所学都是vue3的基础,为了简…...
通过觅思文档项目实现Obsidian文章浏览器在线访问
觅思文档项目开源地址 觅思文档项目开源地址:https://gitee.com/zmister/MrDoc 觅思文档部署步骤概览 服务器拉取代码: git clone https://gitee.com/zmister/mrdoc-install.git && cd mrdoc-install && chmod x docker-install.sh &a…...
⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」
「大模型Clouder认证:利用大模型提升内容生产能力」这个认证目前在阿里云认证中心还是免费的,简单几步就可以申请考试,有两次的免费考试机会。而且,这个课程中的内容对于所有普通用户来说都非常实用,课程整体长度也就3节课,非常快速就能学完。心动不如行动,赶紧开始吧!…...
零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)
以下是对该图像分类识别系统的的简单介绍: PP-ShiTuV2 是一个由百度飞桨团队发布的实用轻量级通用图像识别系统,由主体检测、特征提取、向量检索三个模块构成,适用于快速构建轻量级、高精度、可落地的图像识别应用image_classification是一个…...
阿克曼-幻宇机器人系列教程4- 建图
在之前的文章中,我们介绍了如何登录机器人,如何实现上位机与下位机之间的互通,还介绍了机器人的topic和message,以及如何通过命令行对topic、message进行对应的操作。 接下来,我们就要运用前面所学的所有知识进行综合…...
【方法论】如何构建金字塔框架
文章目录 一、自上而下法1、5步法2、案例说明:基于自上而下法构建金字塔结构来优化写作逻辑 二、自下而上法1、 自下而上法的“三步走”策略步骤1:列出所有思想要点步骤2:找出逻辑关系(因果或共性)步骤3:得…...
Ubuntu 18.04设置静态IP的方法(图形化操作)
0 前言 当路由器启用了DHCP功能,每次启动虚拟机下的Ubuntu(网络连接模式为桥接模式)分配到的IP可能是不一样的,不方便使用和调试(例如开发板加载镜像的主机IP地址也要跟着更改)。针对这些问题,…...
第12章 Java多线程机制
12.1 进程与线程 4种状态:新建、运行、中断和死亡。 (新建、运行、中断和死亡) 建立线程的两种方法:用Thread类或其子类。 线程新建后,必须调用 start () 方法使其进入就绪队列,才有机会获得 CPU 资源&a…...
AM32电调学习解读八:无感驱动相位波形解析
这是第八篇,本篇主要是解读换相波形,方便理解代码。 1、无感驱动波形图 1)ESC简图 2)比较器接线图 灵动微 BLDC 电机方波控制中的反电动势过零检测介绍 - 大大通(简体站) 3)未满duty波形 未满duty方便看出是高边驱…...
封装、继承、多态的理解
目录 1、封装 2、继承 3、多态 4、举例:计算机和外设 1、封装 封装是从使用者的角度,将某种复杂的事务,打包成一个整体,只对使用者提供方便使用的方式。 举例: 1> 胶囊:对于各种混合药物的封装 …...
使用vscode做python项目fastapi的开发
准备工作 安装必要软件 Python:确保安装 Python 3.8 或更高版本(FastAPI 推荐)。下载地址:https://www.python.org/downloads/ 验证安装: bash python --versionVS Code:下载并安装 VS Code:ht…...
多指标组合策略思路
一种基于多种技术指标和日历因素的综合交易策略,旨在通过复杂的条件判断来预测市场的短期走势,并据此进行买卖操作。 策略概述 该策略的核心思想是通过结合多个技术指标和日历因素来判断市场的短期趋势,并在合适的时机进行买入或卖出操作。 具…...
day29 python深入探索类装饰器
目录 一、类装饰器的初步理解 二、类装饰器与函数装饰器的对比 三、类装饰器的实现与应用 (一)为类添加日志功能 (二)动态方法绑定的两种方式 四、手动调用装饰器:类的“后天改造” 五、总结与展望 一、类装饰器…...
Rstudio换皮:自定义彩虹括号与缩进线
更换主题 Rstudio还是R语言最好用的IDE,默认的Rstudio已经自带了很多主题,可以自由选择。 更换内置主题 • 操作路径:Tools → Global Options → Appearance 在Editor Theme选项中切换主题,默认使用Textmate主题。RStudio提供…...
基于springboot+vue的车票管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户管理 班次时…...
计算机组成与体系结构:Snooping-Based Protocols(监听式协议)
目录 什么是监听式协议? Snooping 的总线模型 两种写策略:Write Update vs. Write Invalidate 1️⃣ Write-Invalidate(写失效) 2️⃣ Write-Update(写更新) 🔍 操作流程分析 ǵ…...
CSS 浮动(Float)及其应用
1. 什么是浮动(Float)? 浮动元素会脱离正常的文档流(Document Flow),并向左或向右移动,直到碰到父元素的边缘或另一个浮动元素。 基本语法 .float-left {float: left; }.float-right {float:…...