手寫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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82585.shtml
英文地址,請注明出處:http://en.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 …