模擬tomcat接收GET、POST請求

訪問: http://localhost:10086/mytomcat


MyTomcat/
└── src/└── com/└── zhang/├── MyServer.java├── MyRequest.java├── MyResponse.java├── MyMapping.java├── MyServlet.java└── MyHttpServlet.java

核心類功能說明

  1. MyServer.java
  • 服務器主類,負責啟動并監聽端口(默認10086)
  • 接受客戶端請求,創建 MyRequest 和 MyResponse 對象
  • 根據URL映射找到對應的Servlet進行處理
  1. MyRequest.java

    • 請求處理類,解析HTTP請求中的方法(GET/POST)和URL
    • 提供getter/setter方法訪問請求信息
  2. MyResponse.java

    • 響應處理類,構建HTTP響應
    • 提供 write 方法發送HTML響應內容到客戶端
  3. MyMapping.java

  • URL映射配置類,維護URL到Servlet類的映射關系
  • 目前配置了: /mytomcat -> com.zhang.MyServlet
  1. MyHttpServlet.java
  • Servlet抽象基類,定義了處理GET和POST請求的抽象方法
  • 提供 service 方法根據請求類型調用對應的處理方法
  1. MyServlet.java
  • 具體的Servlet實現類,繼承自 MyHttpServlet
  • 實現了 doGet 和 doPost 方法,返回不同的響應內容

工作流程

  1. 啟動服務器:運行 MyServer.main 方法,服務器在端口10086啟動
  2. 客戶端請求:當訪問 http://localhost:10086/mytomcat 時
  3. 請求解析: MyServer 創建 MyRequest 和 MyResponse 對象
  4. 映射查找:通過 MyMapping 找到對應的 MyServlet 類
  5. 請求處理:調用 MyServlet 的 service 方法,根據請求類型調用 doGet 或 doPost
  6. 響應發送: MyResponse 構建并發送HTTP響應到客戶端

訪問測試

  • 可以通過瀏覽器訪問 http://localhost:10086/mytomcat 來測試GET請求
  • 對于POST請求,可以使用curl或其他工具發送請求
    這個簡單的Tomcat模擬實現了基本的HTTP請求處理和Servlet機制,展示了Web服務器的核心工作原理。

代碼

MyHttpServlet.java

package com.zhang;public abstract class MyHttpServlet {//定義常量public static final String METHOD_GET = "GET";public static final String METHOD_POST = "POST";public abstract void doGet(MyRequest request, MyResponse response) throws Exception;public abstract void doPost(MyRequest request, MyResponse response)throws Exception;/*** 根據請求方式來判斷使用那種處理方法** @param request* @param response*/public void service(MyRequest request, MyResponse response) throws Exception{if (METHOD_GET.equals(request.getRequestMethod())) {System.out.println(METHOD_GET  + "請求");doGet(request, response);} else if (METHOD_POST.equals(request.getRequestMethod())) {System.out.println(METHOD_POST  + "請求");doPost(request, response);}}
}
MyMapping
package com.zhang;import java.util.HashMap;public class MyMapping {public static HashMap<String, String> mapping = new HashMap<String, String>();static {
//        http://localhost:10086/mytomcat 可以運行mapping.put("/mytomcat", "com.zhang.MyServlet");}public HashMap<String, String> getMapping() {return mapping;}
}
MyRequest
package com.zhang;import java.io.IOException;
import java.io.InputStream;/*** 請求對象*/
public class MyRequest {//請求方法  GET、POSTprivate String requestMethod;//請求地址private String requestUrl;//構造方法public MyRequest(InputStream inputStream) throws IOException {//緩沖空間byte[] buffer = new byte[1024];//讀取數據的長度int len = 0;//定義請求的變量String str = null;if ((len = inputStream.read(buffer)) > 0) {str = new String(buffer, 0, len);}//GET  /HTTP  /1.1String data=str.split("\n")[0];String [] params=data.split(" ");this.requestMethod=params[0];this.requestUrl=params[1];}public String getRequestMethod() {return requestMethod;}public void setRequestMethod(String requestMethod) {this.requestMethod = requestMethod;}public String getRequestUrl() {return requestUrl;}public void setRequestUrl(String requestUrl) {this.requestUrl = requestUrl;}
}
MyResponse
package com.zhang;import java.io.IOException;
import java.io.OutputStream;public class MyResponse {private OutputStream outputStream;//輸出public MyResponse(OutputStream outputStream) {this.outputStream = outputStream;}public void write(String str) throws IOException {StringBuilder builder = new StringBuilder();builder.append("Http/1.1 200 ok\n").append("Content-Type:text/html\n").append("<html>").append("<body>").append("<h1>" + str + "</h1>").append("</body>").append("</html>");this.outputStream.write(builder.toString().getBytes());this.outputStream.flush();this.outputStream.close();}
}
MyServer
package com.zhang;import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class MyServer {/*** 定義服務器的接受程序,接受socket請求** @param port*/public static void StartServer(int port) throws Exception {//定義服務端套接字ServerSocket serverSocket = new ServerSocket(port);//定義客戶端套接字Socket socket = null;while (true) {socket = serverSocket.accept();//獲取輸入流和輸出流InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();//定義請求對象MyRequest request = new MyRequest(inputStream);MyResponse response = new MyResponse(outputStream);String clazz = new MyMapping().getMapping().get(request.getRequestUrl());if (clazz != null) {Class<MyServlet> myServletClass = (Class<MyServlet>) Class.forName(clazz);//根據myServletClass創建對象MyServlet myServlet = myServletClass.newInstance();myServlet.service(request, response);}}}public static void main(String[] args) {try {StartServer(10086);} catch (Exception e) {e.printStackTrace();}}
}
MyServlet
package com.zhang;public class MyServlet extends MyHttpServlet{@Overridepublic void doGet(MyRequest request, MyResponse response) throws Exception{response.write("get myTomcat 哈哈哈");}@Overridepublic void doPost(MyRequest request, MyResponse response)throws Exception {response.write("post myTomcat");}
}

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

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

相關文章

氯化釔:科技與高性能材料的核心元素

氯化釔是釔元素的氯化物&#xff0c;廣泛應用于高性能材料、催化劑、光電技術等領域。作為稀土元素之一&#xff0c;釔因其獨特的物理和化學特性&#xff0c;在現代工業中具有重要地位&#xff0c;而氯化釔則是其中的關鍵化合物之一。氯化釔的優勢與特點1. 化學穩定性強氯化釔具…

【數據結構初階】--排序(五):計數排序,排序算法復雜度對比和穩定性分析

&#x1f618;個人主頁&#xff1a;Cx330? &#x1f440;個人簡介&#xff1a;一個正在努力奮斗逆天改命的二本覺悟生 &#x1f4d6;個人專欄&#xff1a;《C語言》《LeetCode刷題集》《數據結構-初階》 前言&#xff1a;今天這篇博客就給大家將一個計數排序&#xff0c;然乎就…

Incredibuild 新增 Unity 支持:擊破構建時間過長的痛點

任何開發過復雜 Unity 項目的團隊都會告訴你&#xff1a;構建速度已成為生產流程中的核心痛點。Unity 靈活且強大&#xff0c;但隨著項目規模擴大&#xff08;尤其是包含 3D 資源、復雜著色器和龐大內容管線的項目&#xff09;&#xff0c;構建過程會逐漸變成一項隱性成本。 多…

大數據接口 - 收入評估(社保評級)API

請求端點 {"post": "https://api.tianyuanapi.com/api/v1/JRZQ09J8?t13位時間戳" }請求頭字段名類型必填描述Access-Idstring是賬號的 Access-Id對于業務請求參數 通過加密后得到 Base64 字符串&#xff0c;將其放入到請求體中&#xff0c;字段名為 data&…

C++八股 —— 設計模式

文章目錄一、創建型模式1. 單例模式2. 工廠模式二、結構型模式1. 裝飾器模式2. 代理模式三、行為型模式1. 觀察者模式2. 策略模式一、創建型模式 1. 單例模式 C八股 —— 單例模式_c 單例模式-CSDN博客 2. 工廠模式 參考&#xff1a;【設計模式】工廠模式詳解-----簡單工廠…

在openeuler中如何使用 firewalld 開放指定端口

在 OpenEuler 中使用 firewalld 開放指定端口的操作步驟如下&#xff0c;需區分臨時開放&#xff08;重啟后失效&#xff09;和永久開放&#xff08;重啟后保留&#xff09;兩種場景&#xff1a;一、查詢端口當前狀態首先確認端口是否已開放&#xff0c;避免重復配置&#xff1…

【Java進階】Java JIT 編譯器深度解析與優化實踐

Java JIT 編譯器深度解析與優化實踐Java JIT 編譯器深度解析與優化實踐一、JIT 編譯器核心原理1. JIT 工作流程2. 熱點代碼檢測機制二、Java 8 JIT 優化升級1. 分層編譯優化2. 方法內聯增強3. 循環優化升級4. 逃逸分析增強5. 向量化支持三、JIT友好代碼設計原則1. 方法設計優化…

【本地部署問答軟件Apache Answer】Answer開源平臺搭建:cpolar內網穿透服務助力全球用戶社區構建

文章目錄前言1. 本地安裝Docker2. 本地部署Apache Answer2.1 設置語言選擇簡體中文2.2 配置數據庫2.3 創建配置文件2.4 填寫基本信息3. 如何使用Apache Answer3.1 后臺管理3.2 提問與回答3.3 查看主頁回答情況4. 公網遠程訪問本地 Apache Answer4.1 內網穿透工具安裝4.2 創建遠…

華為數通認證學習

1、華為人才認證官網&#xff0c;https://e.huawei.com/cn/talent/portal/#/ 很全面的網站&#xff0c;包含了概述、了解認證、參加考試、學習資源、認證資訊四個板塊。可以了解華為認證的整個流程、下載學習資源&#xff08;培訓教材、視頻課程等&#xff09;&#xff0c;以及…

Android-ContentProvider的跨應用通信學習總結

一、ContentProvider的概念1. ContentProvider 是什么&#xff1f;&#xff08;核心概念&#xff09;ContentProvider 是 Android 四大組件之一。它的核心職責是管理和共享應用的結構化數據。我們可以把它想象成一個應用的**“數據大使館”**。在一個國家里&#xff08;Android…

Java數據結構第二十六期:解密位圖,海量數據處理的 “空間魔法”

專欄&#xff1a;Java數據結構秘籍 個人主頁&#xff1a;手握風云 目錄 一、位圖 1.1. 概念 1.2. 面試題 1.3. 位圖的實現 1.4. 位圖的應用 一、位圖 1.1. 概念 在數據結構中&#xff0c;位圖&#xff08;也稱為位數組、位向量或位集&#xff09;是一種緊湊的方式來表示一…

芯科科技即將重磅亮相IOTE 2025深圳物聯網展,以全面的無線技術及生態覆蓋賦能萬物智聯

作為低功耗無線連接領域的創新性領導廠商&#xff0c;Silicon Labs&#xff08;亦稱“芯科科技”&#xff09;將于8月27至29日攜其最前沿的人工智能&#xff08;AI&#xff09;和物聯網&#xff08;IoT&#xff09;解決方案在深圳舉辦的IOTE 2025國際物聯網展中盛大展出。這場亞…

Linux上安裝多個JDK版本,需要配置環境變量嗎

簡短回答&#xff1a;不需要同時配置多個 JDK 的 JAVA_HOME 和 PATH&#xff0c;但你可以安裝多個版本&#xff0c;并通過靈活的方式在它們之間切換。 文章目錄? 正確做法&#xff1a;安裝多個 JDK&#xff0c;但只讓一個生效&#xff08;通過環境變量或 alternatives&#xf…

MySQL有哪些高可用方案

大家好&#xff0c;我是鋒哥。今天分享關于【MySQL有哪些高可用方案】面試題。希望對大家有幫助&#xff1b; MySQL有哪些高可用方案? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; MySQL 高可用方案是指確保 MySQL 數據庫在面對硬件故障、網絡故障、負載過重等…

【Windows】Windows平臺基于加速地址安裝vcpkg并集成到Visual Studio 2017

基礎運行環境 啟動&#xff1a; 適用于 VS 2017 的 x64 本機工具命令提示 ninja 下載壓縮包 https://gh-proxy.com/https:/github.com/ninja-build/ninja/releases/download/v1.13.1/ninja-win.zip 直接解壓到c:/Windows (無需配置環境變量) CMake 下載安裝包 https://gh-proxy…

LLMs之MCP:Chrome MCP的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之MCP&#xff1a;Chrome MCP的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 Chrome MCP的簡介 1、特點 2、與類似項目的比較 Chrome MCP的安裝和使用方法 1、安裝 2、使用方法 加載 Chrome 擴展 與 MCP 協議客戶端一起使用 使用 STDIO 連接&#xff08;替代方…

【Java EE】多線程-初階 synchronized 關鍵字 - 監視器鎖 monitor lock

synchronized 關鍵字 - 監視器鎖 monitor lock5. synchronized 關鍵字 - 監視器鎖 monitor lock5.1 synchronized 的特性5.2 synchronized 使??例5.3 Java 標準庫中的線程安全類本節?標? 掌握 synchronized關鍵字5. synchronized 關鍵字 - 監視器鎖 monitor lock &#xf…

Java多線程:從基礎到實戰

引言多線程是Java并發編程的核心技術之一&#xff0c;廣泛應用于服務器開發、數據處理、實時系統等領域。通過多線程&#xff0c;程序可以充分利用CPU資源&#xff0c;提高執行效率&#xff0c;同時處理多個任務。本文將從多線程的基本概念、實現方式、線程狀態、同步與通信到常…

list集合可以一邊遍歷一遍修改元素嗎?

今天看來一下Java中list集合部分的八股&#xff0c;發現了一個以前沒注意過的問題&#xff0c;記錄一下list可以一邊遍歷一邊修改元素嗎&#xff1f;答&#xff1a;在 Java 中&#xff0c;List在遍歷過程中是否可以修改元素取決于遍歷方式和具體的List實現類。①&#xff1a;對…

Infusing fine-grained visual knowledge to Vision-Language Models

Infusing fine-grained visual knowledge to Vision-Language Models Authors: Nikolaos-Antonios Ypsilantis, Kaifeng Chen, Andr Araujo, Ond?ej Chum Deep-Dive Summary: 視覺-語言模型中注入細粒度視覺知識 摘要 大規模對比預訓練產生了強大的視覺-語言模型&#xf…