Servlet原理

?Servlet 體系結構的類層次關系

  1. Servlet(接口):定義了 Servlet 的核心生命周期方法(如?init()service()destroy()),是所有 Servlet 的頂層規范,任何 Servlet 都需實現該接口。
  2. GenericServlet(抽象類):實現了?Servlet?接口,提供了與協議無關的通用功能(如初始化、銷毀等),但未具體處理 HTTP 協議相關邏輯,保留抽象方法。
  3. HttpServlet(抽象類):繼承?GenericServlet,針對 HTTP 協議進行擴展,實現了基于 HTTP 方法(如 GET、POST)的請求分發邏輯(如?doGet()doPost()?等方法),專注于處理 HTTP 場景。
  4. 自定義 Servlet 類:通過繼承?HttpServlet,重寫對應的方法(如?doGet()doPost()),實現具體的業務邏輯,以處理客戶端的 HTTP 請求。

Servlet資源準備

1、Servlet接口:

  • Servlet接口的作用:實現Servlet生命周期,定義init()、service(request,response)和destroy()方法。
  • 接口中的方法全都是抽象方法,只定義不實現,方法頭默認為public abstract。
import com.qcby.Servlet.req.HttpServletRequest;
import com.qcby.Servlet.req.HttpServletResponse;public interface Servlet {void init();void service(HttpServletRequest request, HttpServletResponse response) throws Exception;void destroy();
}
  • init()?方法

    • 功能:初始化 Servlet 實例。
    • 調用時機:Servlet 容器(如 Tomcat)創建 Servlet 實例后立即調用,通常用于資源初始化(如加載配置文件、建立數據庫連接等)。
    • 注意事項:該方法在 Servlet 的生命周期中僅調用一次。
  • service(HttpServletRequest request, HttpServletResponse response)?方法

    • 功能:處理客戶端請求并返回響應。
    • 參數:
      • HttpServletRequest:封裝客戶端請求信息(如請求頭、請求參數、URL 等)。
      • HttpServletResponse:封裝服務器響應信息(如狀態碼、響應頭、響應體等)。
    • 異常處理:聲明拋出?Exception,允許實現類處理各類異常(如 IO 異常、業務異常等)。
    • 調用時機:每次接收到客戶端請求時,容器會調用該方法。
  • destroy()?方法

    • 功能:銷毀 Servlet 實例。
    • 調用時機:Servlet 容器關閉或重新加載 Servlet 時調用,通常用于資源釋放(如關閉數據庫連接、釋放文件句柄等)。
    • 注意事項:該方法在 Servlet 的生命周期中僅調用一次。

2、GenericServlet抽象類

  • ?GenericServlet抽象類實現Servlet接口中的init()方法destroy()方法

為什么GenericServlet類是抽象類?

? 我們知道當一個普通類繼承一個接口時,需要對接口中的所有方法進行實現,但這里我們不實現Servlet接口中的service(request,response)方法,因此我們需要把GenericServlet類變成抽象類,因為抽象類不必實現接口中的全部方法

public abstract class GenericServlet implements Servlet {public void init(){System.out.println("初始化成功");}public void destroy(){System.out.println("銷毀成功");}
}

3、HttpServlet抽象類


HttpServlet抽象類實現Servlet接口中的service(request,response)方法


為什么HttpServlet類也是抽象類?

? 之所以HttpServlet類也是抽象類,是因為普通類中必須對方法進行實現,而在HttpServlet類中,實現service(request,response)方法的邏輯為:如果接收到GET請求,那么執行doGet方法;如果接收到POST請求,那么執行doPost方法。在此我們只需要對doGet和doPost方法進行定義不需要實現,所以HttpServlet只有成為抽象類,才不必實現doGet和doPost方法。

import com.qcby.Servlet.req.HttpServletRequest;
import com.qcby.Servlet.req.HttpServletResponse;public abstract class HttpServlet  extends GenericServlet {//實現Servlet生命周期的service方法public void service(HttpServletRequest request, HttpServletResponse response) throws Exception {//如果接收到GET請求,那么執行doGet方法if(request.getMethod().equals("GET")){doGet(request,response);}//如果接收到POST請求,那么執行doPost方法else if(request.getMethod().equals("POST")){doPost(request,response);}}protected abstract void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception;protected abstract void doPost(HttpServletRequest request,HttpServletResponse response)throws Exception;
}

4、HttpRequest類

  • HttpRequest類實現請求路徑請求方法的獲取與輸出。
public class HttpServletRequest {private String path;private String method;public String getPath(){return path;};public void setPath(String path){this.path = path;}public String getMethod(){return method;}public void setMethod(String method){this.method = method;}
}

5、HttpResponse類

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;public class HttpServletResponse {private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}public void writeServlet(String context) throws IOException{outputStream.write(context.getBytes());}
}

I/0請求


?


? 客戶端向瀏覽器發出的請求,瀏覽器不會主動向客戶端發送請求

1、請求方式
? HTTP協議的請求方式有很多,在這里我們只介紹GET請求和POST請求。

(1)GET請求
通過URL傳遞參數,URL與參數之間用?隔開,多個參數用&隔開,也是表單的默認提交方式。
GET傳送的數據量較小,這主要是因為受到URL長度的限制。
GET會將數據顯示到URL當中不安全。
基于以上三個特點,GET一般用于直接獲取數據,提高查詢速度。

?請求頭

  • Accept-Encoding:gzip,deflate,br----瀏覽器所使用的語言?
  • Host:www.baidu.com----遠程主機
  • Cookie----cookie
  • User-Agent----瀏覽器類型

請求正文

? 即我們想要請求的信息。

??Socket

Socket(套接字)是計算機網絡編程中用于實現網絡通信的關鍵編程接口(API),它是對底層網絡協議(如 TCP/IP)的封裝,為開發者提供了便捷的網絡通信能力,屏蔽了協議底層的復雜實現細節。

一、Socket 的核心作用

  • 標識進程通信:網絡中主機靠 IP 地址唯一標識,而主機內的進程通信依賴 “協議 + 端口”。Socket 結合 IP 地址與端口號(如?IP 地址:端口號),唯一標識網絡中的進程,實現不同主機進程間的數據交互。
  • 提供通信能力:如同 “發動機”,為程序提供發送和接收數據的網絡通信基礎能力,支持多種網絡協議的應用開發。

二、Socket 的常見類型

  1. 流式套接字(SOCK_STREAM
    • 基于?TCP 協議,提供面向連接、可靠的數據傳輸。
    • 確保數據無差錯、無重復發送,并按順序接收,內置流量控制(如網頁瀏覽、文件傳輸)。
  2. 數據包套接字(SOCK_DGRAM
    • 基于?UDP 協議,提供無連接服務。
    • 不保證數據傳輸的可靠性,可能丟失、重復或亂序(如視頻會議、在線游戲)。
  3. 原始套接字(SOCK_RAW
    • 允許直接訪問較低層次協議(如 IP、ICMP),用于網絡底層機制調試、新協議開發或網絡監聽。

三、Socket 的工作流程

  • 服務端
    1. 初始化 Socket 對象,指定協議族(如?AF_INET?表示 IPv4)和套接字類型(如?SOCK_STREAM)。
    2. 綁定(bind)服務端的 IP 地址和端口號。
    3. 對端口進行監聽(listen),等待客戶端連接。
    4. 接受連接(accept),與客戶端建立通信鏈路后,通過讀寫操作(如?read/writerecv/send)傳輸數據。
    5. 通信結束后關閉連接。
  • 客戶端
    1. 初始化 Socket 對象。
    2. 連接(connect)到服務端的 IP 地址和端口。
    3. 連接成功后,發送請求數據并接收響應。
    4. 通信結束后關閉連接。

四、Socket 與協議的關系

  • Socket 是工具層:它是網絡通信的編程接口,而非具體協議,支持基于 TCP、UDP 等協議的通信。
  • TCP 和 UDP 是實現方式
    • TCP 是面向連接的可靠協議,適合對數據準確性要求高的場景。
    • UDP 是無連接的輕量級協議,適合對實時性要求高、容忍少量丟包的場景。

五、通俗比喻輔助理解

將 Socket 比作 “郵局”:

  • 每個程序(進程)如同 “城市”,需通過 “郵局(Socket)” 收發信息(數據)。
  • 郵局(Socket)負責處理郵件(數據)發送的復雜細節(如分類、路由),程序員無需關心底層網絡協議(如 TCP/IP)的復雜實現,只需通過簡單接口(如發信、收信操作)即可完成通信。
  • 不同的郵寄方式(如普通信件、快遞)類似 Socket 支持的不同協議(TCP 可靠、UDP 快速但不保證送達)。
package Servlet.test;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {// 使用try-with-resources自動關閉ServerSockettry (ServerSocket serverSocket = new ServerSocket(8080)) {System.out.println("服務器啟動,監聽端口: 8080");// 循環監聽多個客戶端連接while (true) {try (Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {System.out.println("客戶端連接成功: " + socket.getInetAddress());// 讀取HTTP請求String line;while ((line = reader.readLine()) != null) {if (line.isEmpty()) { // 空行表示HTTP請求頭結束break;}System.out.println("請求行: " + line);}// 返回簡單的HTTP響應String response = "HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" +"<html><body><h1>Hello, World!</h1></body></html>";socket.getOutputStream().write(response.getBytes("UTF-8"));} catch (IOException e) {System.err.println("處理客戶端連接時發生異常: " + e.getMessage());e.printStackTrace();}}} catch (IOException e) {System.err.println("服務器啟動失敗: " + e.getMessage());e.printStackTrace();}}
}
  1. 創建 ServerSocket 并綁定 8080 端口
  2. 監聽客戶端連接(accept 方法會阻塞)
  3. 獲取客戶端輸入流并讀取數據
  4. 將接收到的字節數據按 UTF-8 編碼轉換為字符串輸出

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

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

相關文章

數據科學和機器學習的“看家兵器”——pandas模塊 之五

目錄 4.5 pandas 高級數據處理與分析 一、課程目標 二、對數據表格進行處理 (一)行列轉置 (二)將數據表轉換為樹形結構 三、數據表的拼接 (一)merge () 函數的運用 (二)concat () 函數的運用 (三)append () 函數的運用 四、對數據表格的同級運算 五、計算數據表格中數…

組合問題(去重)

40. 組合總和 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used)…

論QT6多線程技術

前言 以前我多線程使用傳統的繼承qthread重寫run()或者繼承qrunable類把對象丟到線程池解決。經過昨天的面試讓我了解到新的技術&#xff0c;我之前看到過只不過沒有詳細的去了解movetotread技術&#xff0c;這個技術是qt5推出的&#xff0c;qt6還在延續使用 代碼結構 以下是…

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端點&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;網絡中的關鍵組件&#xff0c;用于處理 VXLAN 流量的封裝和解封裝。以下以可讀的 Markdown 格式詳細解釋 VTEP 的定義、功能、實現方式以…

antdv3 Tabs.TabPane 右上角增加一個角標Badge

1、Tabs官方說明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角標官方效果圖 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要實現的效果 4、代碼 <Tabs v-m…

淺析 Spring 啟動過程:從源碼到核心方法

淺析 Spring 啟動過程&#xff1a;從源碼到核心方法 一、Spring 注解方式啟動類 Demo二、Spring 啟動過程源碼解析?AnnotationConfigApplicationContext構造函數refresh()方法詳解 三、refresh()的核心方法/步驟obtainFreshBeanFactory() - 獲取Bean工廠prepareBeanFactory(be…

貝葉斯優化Transformer融合支持向量機多變量回歸預測,附相關性氣泡圖、散點密度圖,Matlab實現

貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現 目錄 貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現效果一覽基本介紹程序設計參考資料…

智慧化系統安全分析報告

智慧化系統的安全背景與現狀 一、政策法規背景 &#xff08;一&#xff09;全球主要國家/地區政策對比 地區政策名稱核心內容實施時間特點中國《生成式人工智能服務管理暫行辦法》明確服務提供者責任&#xff0c;強調數據合法、隱私保護&#xff0c;禁止生成違法內容2023年8…

【學習筆記】點云自動化聚類簡要總結

聚類是將將具有相似特征劃分為相同點集的操作。 基于空間鄰近性的方法 核心思想&#xff1a;依據點的空間距離進行分組 歐式聚類&#xff08;DBSCAN&#xff0c;KD-tree) 原理&#xff1a;基于半徑搜索和最小點數擴展簇。 優點&#xff1a;適應不規則形狀&#xff0c;無需預…

全志F10c200開發筆記——移植uboot

相關資料&#xff1a; &#xff08;二&#xff09;uboot移植--從零開始自制linux掌上電腦&#xff08;F1C200S)&#xff1c;嵌入式項目&#xff1e;-CSDN博客 F1C200S挖坑日記&#xff08;3&#xff09;——Uboot編譯篇_f1c200s uboot-CSDN博客 一、安裝編譯器 Linaro Rele…

常見WEB漏洞----暴力破解

什么是暴力破解 暴力破解 (Brue Force) 是一種攻擊方法 (窮舉法)&#xff0c;簡稱為“爆破”&#xff0c;黑客通過反復猜解和實驗&#xff0c;旨在以暴力手段登入、訪問目標主機獲取服務&#xff0c;破壞系統安全&#xff0c;其屬于 ATT&CK技術中的一種&#xff0c;常利用…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令變體4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…

2.安卓逆向2-adb指令

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

Obsidian Callouts標注框語法

Obsidian 從 0.14 版本開始原生支持 Callouts&#xff1a; 語法基于 Markdown 引用塊&#xff08;>&#xff09;擴展&#xff1a; 語法格式如下&#xff1a; > [!類型] 可選標題 > 內容支持 **Markdown 格式**、[[內部鏈接]] 和嵌入文件。預覽 可選類型一覽&#xf…

nt!MiAllocateWsle函數分析之設置Wsle[WorkingSetIndex]

第一部分&#xff1a; 1: kd> p nt!MiAddValidPageToWorkingSet0xa9: 80a83c13 e8da9afcff call nt!MiAllocateWsle (80a4d6f2) 1: kd> t nt!MiAllocateWsle: 80a4d6f2 55 push ebp 1: kd> dv WsInfo 0x8953a1f8 PointerPte …

docker 命令操作大全

1 Docker Hello World 簡單命令 docker run ubuntu:15.10 /bin/echo "Hello world" docker run&#xff1a;啟動一個新容器。 ubuntu:15.10&#xff1a;使用的 Docker 鏡像&#xff08;Ubuntu 15.10 版本&#xff09;。 Docker 首先從本地主機上查找鏡像是否存在&a…

【軟件工程】基于機器學習的多缺陷定位

基于機器學習的多缺陷定位&#xff08;Multi-Dault Localization, MDL&#xff09;是軟件工程和自動化測試領域的重要研究方向&#xff0c;旨在通過機器學習技術高效識別代碼中多個潛在缺陷的位置。以下從方法、挑戰、應用場景及未來方向展開分析&#xff1a; 一、核心方法 監督…

用MCP往ppt文件里插入系統架構圖

文章目錄 一、技術架構解析1. Markdown解析模塊(markdown_to_hierarchy)2. 動態布局引擎(give_hierarchy_positions)3. PPTX生成模塊(generate_pptx)二、核心技術亮點1. 自適應布局算法2. MCP服務集成三、工程實踐建議1. 性能優化方向2. 樣式擴展方案3. 部署實踐四、應用…

CS016-2-unity ecs

目錄 【23】射擊改進 【24】僵尸生成器 ?編輯【25】隨機行走 【27】射擊光效 【23】射擊改進 a. 當距離目標太遠的時候&#xff0c;要繼續移動。而當距離目標到達攻擊距離之后&#xff0c;則停止移動。 上圖中的if&#xff1a;判斷自身和目標的距離是否大于攻擊距離&#…

新能源汽車制動系統建模全解析——從理論到工程應用

《純電動輕卡制動系統建模全解析&#xff1a;車速-阻力擬合、剎車力模型與旋轉質量轉換系數優化》 摘要 本文以純電動輕卡為研究對象&#xff0c;系統解析制動系統建模核心參數優化方法&#xff0c;涵蓋&#xff1a; 車速-阻力曲線擬合&#xff08;MATLAB實現與模型驗證&…