手寫簡單的tomcat

首先,Tomcat是一個軟件,所有的項目都能在Tomcat上加載運行,Tomcat最核心的就是Servlet集合,本身就是HashMap。Tomcat需要支持Servlet,所以有servlet底層的資源:HttpServlet抽象類、HttpRequest和HttpResponse,否則我們無法新建Servlet。

http協議:客戶端和用戶端進行請求和響應的過程:

這樣我們就可以在webapps寫項目了,一個項目有兩大資源:servlet資源和靜態資源,servlet本身是java類,我們讓它調用doGet和doPost方法,必須繼承HttpServlet,同時也需要@WebServlet注解,那么在Tomcat中就必須要有@WebServlet注解的實現,如果沒有@WebServlet,我們就無法拿到相應的注解。這樣我們就能成功搭建起Servlet資源。

當Http請求打過來之后,先打到socket上,處理Http請求,其本身就是連接器,從請求上能獲取到請求路徑和請求方法。先獲取到請求路徑,判斷servlet容器中是否含有相同路徑,如果有,再獲取請求方法,判斷是doGet還是doPost。


簡易版tomcat的核心原理

真正的Tomcat很復雜,但它的最核心功能可以簡化為:

  1. 監聽HTTP請求(Socket 綁定 8080 端口)
  2. 解析HTTP請求(讀取請求頭、請求體)
  3. 找到對應的Servlet處理請求(反射調用?service()?方法)
  4. 返回HTTP響應(寫回響應頭和HTML)

手寫tomcat

首先,定義Servlet接口

public interface servlet {public void service(HttpServletRequest request, HttpServletResponse response) throws IOException;
}

其次,定義request和response

public class HttpServletRequest {private String method;private String url;//............public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}
}public class HttpServletResponse {//輸出流private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}/*** 返回動態資源* @param context*/public void write(String context) throws IOException {//System.out.println(context);outputStream.write(context.getBytes());}/*** 返回靜態資源*/public void writeHtml(String path) throws Exception {String resourcesPath = FileUtil.getResoucePath(path);File file = new File(resourcesPath);if(file.exists()){//靜態文件存在System.out.println("靜態文件存在");FileUtil.writeFile(file,outputStream);}else {System.out.println("靜態文件不存在");write(ResponseUtil.getResponseHeader404());}}}

然后,實現一個Httpserver

public class MyTomcat {static HashMap<String, HttpServlet> routes = TomcatRoute.routes; //tomcat路由\/*** 分發器*/public  void dispatch(HttpServletRequest request ,HttpServletResponse response) throws IOException {System.out.println("URL: " + request.getUrl());HttpServlet servlet = routes.get(request.getUrl());  //if(servlet!=null){ //說明請求的就是我們的servletSystem.out.println("找到匹配的Servlet: " + servlet.getClass().getName());servlet.service(request,response);}}/*** socket 啟動* @throws IOException*/public  void start() throws IOException {ServerSocket serverSocket = new ServerSocket(8080);  //1.指定監聽的端口號//2.對端口進行監聽while (true){Socket socket = serverSocket.accept();//阻塞監聽//3.打開輸入流,解析客戶端發來的內容InputStream inputStream = socket.getInputStream(); //輸入流HttpServletRequest request = new HttpServletRequest();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));  //將字節流轉換成字符流String str = reader.readLine();//分割request.setMethod(str.split("\\s")[0]);request.setUrl(str.split("\\s")[1]);//4.打開輸出流OutputStream outputStream = socket.getOutputStream();HttpServletResponse response = new HttpServletResponse(outputStream);//分發器dispatch(request,response);socket.close();//socket在這里關閉}}//socketpublic static void main(String[] args) throws IOException {MyTomcat myTomcat = new MyTomcat();myTomcat.start();}
}

然后,自定義一個Servlet

@CYServlet(url = "/myServlet")
public class MyFirstServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) {super.doPost(request, response);}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("Hello World!");System.out.println("Servlet實例: " + this);response.write(ResponseUtil.getResponseHeader200("hello world  hhhhh"));}
}

最后,啟動服務并測試

public static void main(String[] args) throws IOException {MyTomcat myTomcat = new MyTomcat();myTomcat.start();}

訪問瀏覽器localhost:8080會得到:

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

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

相關文章

智能體賦能效率,企業知識庫沉淀價值:UMI企業智腦的雙輪驅動!

智能體企業知識庫&#xff1a;UMI企業智腦的核心功能與價值 在人工智能技術飛速發展的今天&#xff0c;企業智能化轉型已經成為不可逆轉的趨勢。作為企業級AI智能體開發平臺的佼佼者&#xff0c;優秘智能推出的UMI企業智腦&#xff0c;以其強大的智能體開發能力和全面的企業知…

與 PyCharm 官方溝通解決開發環境問題記錄(進展:官方已推出2個新的修復版本)

??????主題&#xff1a;有關 PyCharm 中終端和環境激活問題的反饋&#xff1a;PY-81233 前言 目前進展&#xff1a; 官方已有2個修復版本推出測試。 更新方法&#xff1a; 使用JetBrains Toolbox App&#xff0c;如下圖所示&#xff0c;從“其他版本”進入查看更新。…

LINUX安裝運行jeelowcode后端項目(命令行)

環境準備 運行環境&#xff1a;JDK1.8開發工具&#xff1a; Idea、Maven默認已啟動中間件&#xff1a;&#xff08;推薦使用寶塔&#xff09;Mysql8.0、Redis、Minio第一步&#xff1a;下載JeelowCode項目并導入IDEA中 第二步&#xff1a;導入數據庫文件到mysql中&#xff0c;…

Android開機向導定制(2)開機向導配置

先貼lineage_wizard_script_user.xml的代碼&#xff1a; <WizardScript xmlns:wizard"http://schemas.android.com/apk/res/com.google.android.setupwizard"wizard:firstAction"welcome"><WizardAction wizard:uri"intent:#Intent;actiono…

守護電動“心臟”!仿真APP在汽車電池包隨機振動分析中的應用

汽車電動化、智能化、綠色化發展已成為全球各國應對氣候變化、實現低碳發展的共同選擇。在此背景下&#xff0c;新能源汽車持續高速發展。電池包作為新能源汽車的“心臟”&#xff0c;是其主要動力來源&#xff0c;直接影響車輛的續航里程與行駛安全。電池包結構的安全可靠性對…

實習面經(JAVA)

目錄 鎖升級 notify和notifyAll區別 Sleep和Wait的區別 ArrayList和ListedList區別 HashMap擴容原理 ConcurrentHashMap StringBuffer 和 StringBuilder 事務等級 索引結構 三次握手四次揮手&#xff0c;為什么是三次和四次 Java中重寫和重載的區別和應用場景 ArrayLis…

計算機網絡-WebSocket/DNS/Cookie/Session/Token/Jwt/Nginx

文章目錄 WebSocketDNS什么是dns域名解析底層協議 cookie/sessionToken/JWTNginx WebSocket 一種網絡通信協議&#xff0c;允許在單個 TCP&#xff08;半雙工&#xff09; 連接上進行全雙工通信&#xff08;客戶端和服務器可同時雙向傳輸數據&#xff09;。 HTTP是基于請求-響…

單片機如何快速實現查看實時數據

在用 Keil 做調試的時候&#xff0c;最讓人頭禿的是什么&#xff1f; 不是寫代碼的BUG&#xff0c;而是&#xff1a;這個條件變量是什么情況&#xff1f;為什么沒進入這個判斷&#xff1f;我代碼跑到哪里了&#xff1f; 其實本質上都是通過變量判斷代碼的執行順序有沒有問題 …

vue3:橫線無限滾動(向左/向右),自定義UI

子組件 <template><div class"single-scroll-container" ref"container" mouseenter"pause" mouseleave"resume"><divclass"single-scroll-content":style"{ transform: translateX(${translateX}px) }…

Anthropic公司近日發布了兩款新一代大型語言模型Claude Opus 4與Claude Sonnet 4

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

【機器人】復現 Embodied-Reasoner 具身推理 | 具身任務 深度推理模型 多模態場景 長遠決策 多輪互動

Embodied-Reasoner 是一個多模態具身模型&#xff0c;它將 o1 的深度推理能力擴展到具身交互任務。 可以在 AI2THOR 仿真中執行復雜的任務&#xff0c;例如搜索隱藏物體、操縱 和 運輸物品 具有以下的功能&#xff1a; &#x1f914; 深度推理能力&#xff0c;例如分析、空間…

使用 Qemu 調試 LoongArch 應用程序

1.編譯 Qemu OS:Ubuntu 22.04 下載Qemu源碼 git clone --depth1 https://gitlab.com/qemu-project/qemu.git編譯 cd qemu mkdir build cd build ../configure --target-listloongarch64-linux-user,loongarch64-softmmu --prefixpwd/__install make && make instal…

Unity 游戲優化(持續更新中...)

垃圾回收 是什么&#xff1f; 垃圾回收&#xff08;Garbage Collection&#xff09;GC 工作機制 1、Unity 為用戶生成的代碼和腳本采用了自動內存管理。 2、小塊數據&#xff08;如值類型的局部變量&#xff09;分配在棧上。大塊數據和長期存儲分配在托管堆上。 3、垃圾收集…

python和java差異:關鍵數據類型與容器

2.0. 對象的類型&#xff1a;可變 (Mutable) 與不可變 (Immutable) 在Python中&#xff0c;理解對象的可變性 (mutability) 是至關重要的&#xff0c;它影響著變量如何被修改、函數參數如何傳遞以及數據結構的行為。 不可變對象 (Immutable Objects): 大白話定義&#xff1a;…

DAY 33

知識點回顧&#xff1a; 1. PyTorch和cuda的安裝 2. 查看顯卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3. cuda的檢查 4. 簡單神經網絡的流程 a. 數據預處理&#xff08;歸一化、轉換成張量&#xff09; b. 模型的定義 i. 繼承nn.Module類 ii. 定義…

Minktec 柔性彎曲傳感器,靈敏捕捉坐姿弓背、精準監測行走姿態,守護兒童背部健康,為科學健身提供數據支撐,開啟職業健康與背痛 AI 干預新方向。

Minktec彎曲形變傳感器通過創新的技術設計&#xff0c;為各種彎曲和形變檢測需求提供了精確的解決方案。其核心技術基于薄膜柔性傳感器的應用&#xff0c;能夠捕捉物體在三維空間中的動態變化。傳感器內部結合了多點排列的應變元件和專有算法&#xff0c;實現了形狀的實時重建。…

快遞鳥接口費用解析:中小電商成本控制方案

中小電商企業在物流環節的成本控制&#xff0c;直接影響著整體運營效率和利潤空間。作為國內主流的物流數據服務商&#xff0c;快遞鳥API接口憑借其聚合查詢、電子面單、軌跡跟蹤等功能&#xff0c;成為眾多電商企業的選擇。但如何精準解析其收費模式&#xff0c;并制定科學的成…

maven 最短路徑依賴優先

問題描述&#xff1a; 項目在升級大版本后出現了&#xff0c;兩個不同模塊所引用的同一個依賴包版本不同 module A 引用了 module B&#xff0c;module B 引用了 A_1.0.jar->B_1.0.jar->C_1.0.jar(C 為B 里面的包) 在執行 mvn dependency:tree 后發現&#xff1a; modul…

游戲引擎學習第314天:將精靈拆分成多個層

回顧并為今天的工作做準備 我們今天繼續昨天開始的工作&#xff0c;現在我們要回到渲染中處理 Z 值的最終環節。我們目前已經有一個我們認為還算合理的排序方式&#xff0c;雖然可能還需要在接下來的過程中進行一些調整&#xff0c;但總體上已經有了一個明確的方向。 我們已經…

HashSet的基本概念

ashSet的基本概念 - HashSet 是C#中用于存儲唯一元素的泛型集合類&#xff0c;它基于哈希表實現&#xff0c;具有快速查找、添加和刪除元素的特性。 - 核心特點&#xff1a; - 不允許存儲重復元素 - 元素無序排列 - 查找、添加、刪除操作的平均時間復雜度為O(1) - 實現了 IEnum…