手寫tomcat:基本功能實現(4)

邏輯架構

?

  1. HTTP 請求與 Socket

    • 左側的 “HTTP 請求” 箭頭指向 “socket”,表示客戶端發送的 HTTP 請求通過 socket 傳輸到服務器。Socket 負責接收請求,并提取出其中的?請求路徑(如?/first)和?請求方法(如 GET、POST),為后續處理做準備。
  2. Servlet 容器的路由機制

    • 圖中粉色表格代表 Servlet 容器內的路由映射表,每一行記錄了一個 URL 路徑與對應 Servlet 對象的映射關系。例如,路徑?/first?對應?firstServlet?對象,/second?對應?secondServlet?對象。容器根據 socket 提取的請求路徑,從映射表中找到匹配的 Servlet 來處理請求。
  3. Web 應用結構(webapps)

    • webapps?是存放 Web 應用的目錄,圖中?myweb?是其中一個應用,包含兩類資源:
      • Servlet 資源:動態處理請求的 Servlet 程序。
      • 靜態資源:如 HTML、CSS、圖片等無需動態處理的文件。
  4. 核心類與注解支持

    • 右側藍色區域包含?HttpServlet?類、HttpRequest?和?HttpResponse,它們是處理請求和響應的核心類。HttpServlet?是 Servlet 的基類,HttpRequest?用于封裝請求信息,HttpResponse?用于構造響應數據。
    • 紫色區域表示對?@WebServlet?注解的支持。該注解用于配置 Servlet 對應的 URL 路徑等信息,簡化 Servlet 的注冊過程,與圖中路由映射表的功能相呼應。

TomcatRoute類

package com.qcby.config;import com.qcby.Util.SearchClassUtil;
import com.qcby.servlet.Httpservlet;
import com.qcby.zj.YbyServlet;import java.util.HashMap;
import java.util.List;import java.util.List;
import java.util.Map;public class TomcatRoute {public static HashMap<String, Httpservlet> Route = new HashMap<>();static {List<String> classesPath = SearchClassUtil.searchClass();for (String path : classesPath) {try {//加載類Class clazz = Class.forName(path);//獲取注解YbyServlet webServlet = (YbyServlet) clazz.getDeclaredAnnotation(YbyServlet.class);
//                對象Object servlet = clazz.getDeclaredConstructor().newInstance();Route.put(webServlet.url(), (Httpservlet) servlet);
//                Httpservlet servlet = (Httpservlet) clazz.newInstance();
//                servletMap.put(webServlet.url(),servlet);System.out.println(Route);} catch (Exception e) {e.printStackTrace();}}}}

主要功能是自動掃描帶有特定注解的 Servlet 類并注冊到路由表中。使用靜態 HashMap 存儲路徑到 Servlet 的映射關系。加載類:Class.forName("com.qcby.servlet.HomeServlet")。

一、核心功能與設計思想

public class TomcatRoute {public static HashMap<String, Httpservlet> Route = new HashMap<>();static { ... }
}

功能:自動掃描并注冊所有帶有YbyServlet注解的 Servlet 類

設計思想

  • 基于 "約定優于配置" 原則,通過注解簡化 Servlet 注冊
  • 使用靜態代碼塊確保在類加載時完成初始化
  • 采用單例模式管理 Servlet 實例(每個 Servlet 只有一個實例)

二、核心組件詳解

1. 路由注冊表

public static HashMap<String, Httpservlet> Route = new HashMap<>();
  • 數據結構:靜態 HashMap 存儲路徑到 Servlet 的映射
  • :URL 路徑(如/user),來自YbyServlet注解的url()屬性
  • :實現了Httpservlet接口的 Servlet 實例

2. 類掃描機制

List<String> classesPath = SearchClassUtil.searchClass();
  • SearchClassUtil功能
    • 掃描指定包下的所有類
    • 返回類的全限定名列表(如["com.qcby.servlet.UserServlet", "com.qcby.servlet.OrderServlet"]
  • 實現方式
    • 使用類加載器獲取資源路徑
    • 遞歸遍歷所有.class文件
    • 將文件路徑轉換為類的全限定名

HttpServletResponse類

package com.qcby.Response;import com.qcby.Request.HttpServletRequest;import java.io.IOException;
import java.io.OutputStream;public class HttpServletResponse {private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}public  void writeServlet(String context) throws IOException {outputStream.write(context.getBytes());}
}

這段代碼實現了 HTTP 響應的基礎功能,負責將服務器處理結果返回給客戶端

Tomcat

package com.qcby;
//tomcat主啟動類
import com.qcby.config.TomcatRoute;
import com.qcby.servlet.Httpservlet;
import com.qcby.Request.HttpServletRequest;
import com.qcby.Response.HttpServletResponse;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;public class Mytomcat {static HashMap<String,Httpservlet> routes= TomcatRoute.Route;public  static void dispatch(HttpServletRequest request,HttpServletResponse response) throws IOException {Httpservlet servlet=routes.get(request.getPath());if(servlet!=null){servlet.service(request,response);}}public static void main(String[] args) {try {System.out.append("服務器啟動......");
//				1.定義ServerSocket對象進行服務器的端口注冊ServerSocket serverSocket = new ServerSocket(8080);while (true) {
//				2.監聽客戶端的socket鏈接程序Socket socket = serverSocket.accept();//阻塞監聽
//				3.從socket對象當中獲得一個字節流對象InputStream iStream = socket.getInputStream();HttpServletRequest request=new HttpServletRequest();BufferedReader reader=new BufferedReader(new InputStreamReader(iStream));String str=reader.readLine();request.setMethod(str.split("\\s")[0]);request.setPath(str.split("\\s")[1]);System.out.println(request.getMethod() + " " + request.getPath());OutputStream outputStream=socket.getOutputStream();HttpServletResponse response=new HttpServletResponse(outputStream);dispatch(request,response);}} catch(Exception e){e.printStackTrace();}}}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83676.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jvm安全點(一)openjdk17 c++源碼垃圾回收安全點信號函數處理線程阻塞

1. 信號處理入口?? ??JVM_HANDLE_XXX_SIGNAL?? 是 JVM 處理信號的統一入口&#xff0c;負責處理 SIGSEGV、SIGBUS 等信號。??javaSignalHandler?? 是實際注冊到操作系統的信號處理函數&#xff0c;直接調用 JVM_HANDLE_XXX_SIGNAL。 ??2. 安全點輪詢頁的識別?? …

微信小程序:封裝表格組件并引用

一、效果 封裝表格組件,在父頁面中展示表格組件并顯示數據 二、表格組件 1、創建頁面 創建一個components文件夾,專門用于存儲組件的文件夾 創建Table表格組件 2、視圖層 (1)表頭數據 這里會從父組件中傳遞表頭數據,這里為columns,后續會講解數據由來 循環表頭數組,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 發送、2 路 TLK2711 接收 FMC 子卡模塊

產品概述 FMC216 是一款基于 VITA57.1 標準規范的 2 路 TLK2711 接收、2 路 TLK2711 發送 FMC 子卡模塊。該板卡支持 2 路 TLK2711 數據的收發&#xff0c;支持線速率 1.6Gbps&#xff0c;經過 TLK2711 高速串行收發器&#xff0c;可以將 1.6Gbps 的高速串行數據解串為 16 位并…

K8S Gateway API 快速開始、胎教級教程

假設有如下三個節點的 K8S 集群&#xff1a; ?? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至網關 API 中。在 Kubernetes …

時序數據庫IoTDB分布式架構解析與運維指南

一、IoTDB分布式架構概述 分布式系統由一組獨立的計算機組成&#xff0c;通過網絡通信&#xff0c;對外表現為一個統一的整體。IoTDB的原生分布式架構將服務分為兩個核心部分&#xff1a; ?ConfigNode&#xff08;CN&#xff09;?&#xff1a;管理節點&#xff0c;負責管理…

Ubuntu 20.04 LTS 中部署 網頁 + Node.js 應用 + Nginx 跨域配置 的詳細步驟

Ubuntu 20.04 LTS 中部署 網頁 Node.js 應用 Nginx 跨域配置 的詳細步驟 一、準備工作1、連接服務器2、更新系統 二、安裝 Node.js 環境1、安裝 Node.js 官方 PPA&#xff08;用于獲取最新穩定版&#xff09;&#xff1a;2、安裝 Node.js 和 npm&#xff08;LTS 長期支持版本…

3DVR制作的工具或平臺

3DVR&#xff08;三維虛擬現實&#xff09;是利用三維圖像技術和虛擬現實技術&#xff0c;將真實場景進行三維掃描并轉換成計算機可識別的三維模型&#xff0c;使用戶能夠在虛擬空間中自由漫游&#xff0c;體驗身臨其境的感覺。3DVR技術結合了全景拍攝和虛擬現實&#xff0c;提…

垂直智能體:企業AI落地的正確打開方式

在當前AI浪潮中&#xff0c;許多企業急于跟進&#xff0c;推出自己的AI智能體解決方案。然而&#xff0c;市場上大量出現的"萬能型"智能體卻鮮有真正解決實際問題的產品。本文將探討為何企業應該專注于開發垂直領域智能體&#xff0c;而非追求表面上的全能&#xff0…

軟件工程各種圖總結

目錄 1.數據流圖 2.N-S盒圖 3.程序流程圖 4.UML圖 UML用例圖 UML狀態圖 UML時序圖 5.E-R圖 首先要先了解整個軟件生命周期&#xff1a; 通常包含以下五個階段&#xff1a;需求分析-》設計-》編碼 -》測試-》運行和維護。 軟件工程中應用到的圖全部有&#xff1a;系統…

王者榮耀游戲測試場景題

如何測試一個新英雄&#xff1a;方法論與實踐維度 測試一個新英雄不僅僅是“打打打”&#xff0c;而是一套完整的測試流程&#xff0c;包括設計文檔驗證、功能驗證、數值驗證、性能驗證、交互驗證等。可以從以下多個角度展開&#xff1a; &#x1f50d; 1. 方法論維度 ? 測試…

第四天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 很抱歉的說一下&#xff0c;我昨天看白色巨塔電視劇&#xff0c;看的入迷了&#xff0c;同時也看出一些道理&#xff0c;學到東西&#xff1b; 但是把昨天的寫事情給忘記了&#xff0c;今天…

多模態大語言模型arxiv論文略讀(七十八)

AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文標題&#xff1a;AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文作者&#xff1a;Zhen Xing, Qi Dai, Zejia Weng, Zuxuan W…

優化 Spring Boot 應用啟動性能的實踐指南

1. 引言 Spring Boot 以其“開箱即用”的特性深受開發者喜愛,但隨著項目復雜度的增加,應用的啟動時間也可能會變得較長。對于云原生、Serverless 等場景而言,快速啟動是一個非常關鍵的指標。 2. 分析啟動過程 2.1 啟動階段概述 Spring Boot 的啟動流程主要包括以下幾個階…

Ubuntu下配置VScode出現#include錯誤請更新includePath的解決方法

首先Ubuntu新手小白一定要先安裝g&#xff0c;安裝方法是&#xff1a; 在桌面右鍵打開終端&#xff0c;輸入&#xff1a;sudo apt-get install g 安裝好g之后&#xff0c;在vscode終端輸入&#xff1a;g -v -E -x c - 輸出這些路徑&#xff0c;復制 如果還存在顯示cout不存在的…

【背包dp】小結

背包問題總結 一、什么是背包問題&#xff1f; 定義&#xff1a;給定一個容量為 W 的背包和 n 件物品&#xff0c;每件物品有一個重量 w[i] 和價值 v[i]&#xff0c;要求選擇若干物品放入背包&#xff0c;在不超過容量的前提下&#xff0c;使總價值最大。 背包問題本質是&am…

濟南國網數字化培訓班學習筆記-第三組-1-電力通信傳輸網認知

電力通信傳輸網認知 電力通信基本情況 傳輸介質 傳輸介質類型&#xff08;導引與非導引&#xff09; 導引傳輸介質&#xff0c;如電纜、光纖&#xff1b; 非導引傳輸介質&#xff0c;如無線電波&#xff1b; 傳輸介質的選擇影響信號傳輸質量 信號傳輸模式&#xff08;單工…

代碼隨想錄算法訓練營第六十四天| 圖論9—卡碼網47. 參加科學大會,94. 城市間貨物運輸 I

每日被新算法方式轟炸的一天&#xff0c;今天是dijkstra&#xff08;堆優化版&#xff09;以及Bellman_ford &#xff0c;嘗試理解中&#xff0c;屬于是只能照著代碼大概說一下在干嘛。 47. 參加科學大會 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

upload-labs通關筆記-第8關 文件上傳之點繞過

目錄 一、點繞過原理 二、deldot()函數 三、源碼分析 四、滲透實戰 1、構建腳本test8.php 2、打開靶場 3、bp開啟攔截 4、點擊上傳 5、bp攔截 6、后綴名增加點 7、發包并獲取腳本地址 8、訪問腳本 本文通過《upload-labs靶場通關筆記系列》來進行upload-labs靶場的滲…

Spring Web MVC————入門(3)

今天我們來一個大練習&#xff0c;我們要實現一個登錄界面&#xff0c;登錄進去了先獲取到登錄人信息&#xff0c;可以選擇計算器和留言板兩個功能&#xff0c;另外我們是學后端的&#xff0c;對于前端我們會些基礎的就行了&#xff0c;知道ajax怎么用&#xff0c;知道怎么關聯…

PhpStudy | PhpStudy 工具安裝 —— Windows 系統安裝 PhpStudy

&#x1f31f;想了解這個工具的其它相關筆記&#xff1f;看看這個&#xff1a;[網安工具] 服務器環境配置工具 —— PhpStudy 使用手冊 筆者備注&#xff1a;Windows 中安裝 PhpStudy 屬于傻瓜式安裝&#xff0c;本文只是為了體系完善而發。 在前面的章節中&#xff0c;筆者簡…