手写Tomcat(一)

一、Tomcat简介 

Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

1.1 Tomcat基本架构

Servlet接口文件中定义的方法有以下几个:

  • init():初始化Servlet
  • getServletConfig():获取Servlet配置信息
  • service():服务..........
  • getServletInfo():获取Servlet的运行信息
  • destroy():销毁,回收内存

补充: 

  • Servlet是接口文件,定义方法不需实现,通过其子类即GenericSrevlet(抽象类)及HttpSrevlet(抽象类)进行实现。
  • 补充:抽象类中可以写抽象方法,也可以写实现方法,同时可以不实现接口中定义的全部抽象方法。

GenericSrevlet类中实现了init()、getServletConfig()、getServletInfo()、destroy()四个方法,把service()交由HttpSrevlet实现。

为什么在HttpSrevlet中实现service()方法? 

HttpServlet中关于 service()定义如下: 

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();long lastModified;if (method.equals("GET")) {lastModified = this.getLastModified(req);if (lastModified == -1L) {this.doGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader("If-Modified-Since");} catch (IllegalArgumentException var9) {ifModifiedSince = -1L;}if (ifModifiedSince < lastModified / 1000L * 1000L) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals("HEAD")) {lastModified = this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}

HttpServlet中定义service()是为了更好的匹配当前http的请求方式。

二、Tomcat简化模型构建知识补充

2.1 HTTP协议

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。

2.1.1 请求部分

请求部分包括请求头、请求方式、请求内容,如请求方式等可以进行选择,但是在发送请求时不能删减。

2.1.1.1 请求头

注:可以通过f12,选择网络进行查看。

2.1.1.2 请求方式

 GET

  • 用途获取资源(查询数据),参数通过 URL 的 Query String 传递(如 /users?id=123)。

  • 特点

    • 可见性:参数暴露在 URL 和浏览器历史中。

    • 长度限制:由浏览器和服务器共同决定(如 IE 限制为 2048 字符,Chrome 约 8KB),并非 HTTP 协议规定

    • 幂等性:多次请求结果相同(不修改资源)。

  • 安全建议:避免用 GET 传输敏感信息(密码、Token)。

POST 

  • 用途提交数据(创建或修改资源),参数在 请求体 中(支持多种编码格式,如 form-dataJSON)。

  • 特点

    • 无长度限制:理论上由服务器配置决定。

    • 非幂等性:多次提交可能产生不同结果(如重复创建订单)。

    • 相对安全误解:HTTP 明文传输下,POST 请求体仍可被拦截。真正的安全需依赖 HTTPS

  • 常见场景:表单提交、文件上传、复杂数据(如嵌套 JSON),一般用来做增删改操作。                                                                                                                                 

HEAD 

  • 用途:获取资源的 元数据(响应头),不返回响应体。

  • 典型应用

    • 检查资源是否存在(通过状态码 200 或 404)。

    • 验证资源是否修改(通过 Last-Modified 或 ETag 头)。

    • 预加载资源信息(如 Content-Length 用于进度条)。

OPTIONS

  • 用途询问服务器支持的 HTTP 方法 或 CORS 预检请求

  • CORS 预检

    • 浏览器在跨域请求前自动发送 OPTIONS 请求。

    • 服务器需返回 Access-Control-Allow-Methods 等头,声明允许的方法、头、源。

    • 示例:Access-Control-Allow-Methods: GET, POST, PUT

PUT

  • 用途完整替换资源(全量更新)。

  • 幂等性:多次请求结果一致(如更新用户信息为固定值)。

  • 与 POST 区别

    • POST 用于创建资源时,URI 由服务器决定(如 /users)。

    • PUT 需客户端指定完整资源路径(如 /users/123)。

PATCH

  • 用途局部更新资源(如只修改用户的邮箱)。

  • 非幂等性:连续多次局部更新可能导致意外结果(如递增计数器)。

  • 实现方式:需定义数据格式(如 JSON Patch 标准)。

DELETE

  • 用途删除指定资源

  • 幂等性:多次删除同一资源结果相同(首次返回 200 或 204,后续可能返回 404)。

  • 注意:实际业务中常采用 逻辑删除(标记为删除状态)而非物理删除。

TRACE

  • 用途:回显客户端请求,用于调试。

  • 安全风险:可能引发 跨站追踪攻击(XST),多数服务器默认禁用。

CONNECT

  • 用途:建立到目标服务器的 隧道连接,用于代理 HTTPS 流量。

  • 工作流程

    1. 客户端发送 CONNECT example.com:443 HTTP/1.1

    2. 代理服务器建立 TCP 连接到目标服务器。

    3. 后续数据直接透传(用于 TLS 加密通信)

关键对比总结

特性GETPOSTPUTPATCHDELETE
幂等性✔️✔️✔️
安全性
数据位置URLBodyBodyBodyURL

 

2.1.2 响应部分

响应部分包括响应头、响应状态、响应内容。

2.1.2.1 响应头

注:可以通过f12,选择网络进行查看。

2.1.2.2 响应状态
  • 200:ok
  • 404:url出错
  • 500:服务器内部错误
2.1.2.3 响应内容

响应内容就是传输的内容。

2.2 数据传输

在tomcat中,接口信息及参数等的数据传递的底层通过I/O实现,随后将数据给到ServletRequest/ServletReqsponse。

2.2.1 request

request中接受的信息(仅列举一部分):

  • method:请求方式
  • 编码方式:如JSON
  • data:parameter
  • url:请求地址
  • cookie:获取登录信息

2.2.2 response

response中包含的信息(仅列举一部分):

  • 状态码
  • 编码方式:如JSON
  • 字符集:如utf-8
  • data数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三节_PySide6中Qt Designer 的基础使用_上篇

文章目录 前言一、Qt Designer简介1.什么是 Qt Designer&#xff1f;2.核心功能3.核心优势 二、Qt Designer界面介绍1.主窗口的创建2.窗口五大区域的简单介绍 三、界面布局 Layout1.窗口布局方式介绍2.UI布局技巧概述3.UI布局实战应用 总结 前言 第二节_PySide6项目创建流程介…

行列式的线性性质(仅限于单一行的加法拆分)

当然可以&#xff0c;以下是经过排版优化后的内容&#xff0c;保持了原始内容不变&#xff0c;仅调整了格式以提升可读性&#xff1a; 行列式的线性性质&#xff08;加法拆分&#xff09; 这个性质说的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…

Git使用说明

配置Git 确定已经安装了Git, 通过以下的命令配置全局的邮箱和用户名 git config --global user.email "your@xx.com" git config --global user.name "yourname" 初始化本地仓库 首先,打开终端并切换到存放你代码的项目目录。接着执行以下命令,将该…

【后端高阶面经:缓存篇】36、如何保证Redis分布式锁的高可用和高性能?

一、分布式锁核心挑战:从单机到分布式的跨越 (一)分布式锁的本质需求 互斥性:同一时刻仅一个客户端持有锁容错性:节点故障时锁仍有效(避免单点)原子性:加锁/释放锁操作原子完成可重入性:支持同一客户端多次获取同一把锁(二)Redis天然优势 单线程模型保证操作原子性…

【后端高阶面经:MongoDB篇】40、怎么优化MongoDB的查询性能?

一、索引优化&#xff1a;构建高效查询的基石 &#xff08;一&#xff09;索引类型与适用场景 1. 五大核心索引类型 索引类型适用场景示例代码性能影响单字段索引单条件查询&#xff08;如用户ID、状态字段&#xff09;db.users.createIndex({ user_id: 1 })低复合索引多条件…

Linux wget 常用命令详解

目录 1.1 工具定位 基础下载示例 二、高效下载参数详解 2.1 下载控制类 2.2 文件管理类 2.3 网络优化类 三、高级应用场景 3.1 递归下载与整站镜像 3.2 自动化下载实践 3.3 安全下载配置 四、参数速查手册 4.1 常用参数汇总 1.1 工具定位 基础下载语法 wget [选项…

Pytorch中文文本分类

本文为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 将对中文文本进行分类&#xff0c;示例如下&#xff1a; 文本分类流程图 1.加载数据 import time import pandas as pd import torch from torch.utils.data import DataLoader, random_split impo…

13.「极简」扣子(coze)教程 | 小程序UI设计进阶(三)让界面动起来,实操讲透“聚焦”事件

前一期大师兄介绍了扣子平台组件的两种状态“禁用”和“加载”。这两种方法使控件可以通过简单设置表示出更多的运行状态。今天大师兄将详细介绍控件的一种事件“聚焦”。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 小程序UI设计进阶 II&#xff01;让…

剑指offer11_矩阵中的路径

矩阵中的路径 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移动一个格子。 如…

腾讯2025年校招笔试真题手撕(三)

一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…

《三维点如何映射到图像像素?——相机投影模型详解》

引言 以三维投影介绍大多比较分散&#xff0c;不少小伙伴再面对诸多的坐标系转换中容易弄混&#xff0c;特别是再写代码的时候可能搞错&#xff0c;所有这篇文章帮大家完整的梳理3D视觉中的投影变换的全流程&#xff0c;一文弄清楚这个过程&#xff0c;帮助大家搞清坐标系转换…

Ini配置文件读写,增加备注功能

1.增加备注项写入 例: #节点备注 [A] #项备注 bbb1 ccc2 [B] bbb1 IniConfig2 ic new IniConfig2(); //首次写入 if (!ic.CanRead()) { ic.AddSectionReMarke("A", "节点备注"); ic.SetValue("A&qu…

OpenHarmony 5.0中状态栏添加以太网状态栏图标以及功能实现

目录 1.前置条件 2.方案 1.前置条件 首先以太网接口是有问题的,如下按照如下流程将以太网接口进行修复 OpenHarmony 以太网卡热插拔事件接口无效-CSDN博客 然后上述的接口可以了就可以通过这个接口获取以太网是否连接状态 要注意wifi连接的干扰和预置虚拟网口干扰 2.方案…

RNN GRU LSTM 模型理解

一、RNN 1. 在RNN中&#xff0c; 2. RNN是一个序列模型&#xff0c;与非序列模型不同&#xff0c;序列中的元素互相影响&#xff1a; 是由 计算得来的。 在前向传播中&#xff1a; 用于计算 和 用于计算 和 因此&#xff0c;当进行反向链式法则求导时候&#xf…

多路径传输(比如 MPTCP)控制实时突发

实时突发很难控制&#xff0c;因为 “实时” 和 “突发” 相互斥。实时要求避免排队&#xff0c;而突发必然要排队&#xff0c;最终的解决方案都指向找一个公说公有理&#xff0c;婆说婆有理的中间点&#xff0c;这并没解决问题&#xff0c;只是权衡了问题。 这种局部解决问题的…

函数式编程思想详解

函数式编程思想详解 1. 核心概念 不可变数据 (Immutable Data) 数据一旦创建&#xff0c;不可修改。任何操作均生成新数据&#xff0c;而非修改原数据。 优点&#xff1a;避免副作用&#xff0c;提升并发安全&#xff0c;简化调试。 Java实现&#xff1a;使用final字段、不可变…

iOS 主要版本发布历史

截至 2025 年 5 月&#xff0c;iOS 的最新正式版本是 iOS 18&#xff0c;于 2024 年 9 月 16 日 正式发布。此前的 iOS 17 于 2023 年 9 月 18 日 发布&#xff0c;并在 2024 年被 iOS 18 取代。(维基百科) &#x1f4f1; iOS 主要版本发布历史 以下是 iOS 各主要版本的发布日…

矩阵详解:线性代数在AI大模型中的核心支柱

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

基于51单片机和8X8点阵屏、独立按键的飞行躲闪类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#xff…

区块链可投会议CCF C--APSEC 2025 截止7.13 附录用率

Conference&#xff1a;32nd Asia-Pacific Software Engineering Conference (APSEC 2025) CCF level&#xff1a;CCF C Categories&#xff1a;软件工程/系统软件/程序设计语言 Year&#xff1a;2025 Conference time&#xff1a;December 2-5, 2025 in Macao SAR, China …