Java的Tomcat和Servlet的運(yùn)行原理詳解
在從前的時(shí)候,想要運(yùn)行一個(gè)Java代碼,就必須要實(shí)現(xiàn)main方法,這是程序的入口,通過初識(shí) Servlet 就會(huì)發(fā)現(xiàn)沒有實(shí)現(xiàn) main 方法,程序就被成功調(diào)用,并且還能夠在瀏覽器除看見想要看見的結(jié)果,這是為什么呢?
事實(shí)就是,main 方法在Tomcat 中,Servlet 程序是配合Tomcat上運(yùn)行的,Tomcat 就有了main 方法,就會(huì)拖著 Servlet 運(yùn)行起來。

Servlet 是上是Tomcat 提供的一組API,因此其代碼的實(shí)現(xiàn)是基于 Tomcat 的。Tomcat 通過 HTTP協(xié)議來和瀏覽器進(jìn)行交互,交互主要分成三個(gè)步驟:請(qǐng)求接收、處理請(qǐng)求、返回響應(yīng)
一、客戶端(瀏覽器)與服務(wù)器之間的交互
請(qǐng)求接收:
1.當(dāng)用戶在瀏覽器端輸入一個(gè)網(wǎng)址后,瀏覽器就會(huì)構(gòu)造一個(gè)HTTP請(qǐng)求
2.該HTTP請(qǐng)求就會(huì)通過種種手段轉(zhuǎn)換成光電信號(hào)被傳輸?shù)椒?wù)器端(具體的轉(zhuǎn)換涉及通信知識(shí))
3.服務(wù)器主機(jī)接收到這些光電信號(hào)后對(duì)其進(jìn)行解析,還原成原本的HTTP請(qǐng)求,并交給Tomcat 進(jìn)行處理
4.Tomcat 對(duì)HTTP請(qǐng)求進(jìn)行解析,把請(qǐng)求交給 Servlet的代碼進(jìn)行處理
處理請(qǐng)求:
1.Tomcat 會(huì)通過 Content Path和Servlet Path來確定到某webapp的某類,在根據(jù)請(qǐng)求的方法(doXXX方法)來確定調(diào)用該類的具體方法,代碼中的HttpServletRequest對(duì)象就包含著HTTP請(qǐng)求的詳細(xì)內(nèi)容,根據(jù)代碼進(jìn)行結(jié)果的計(jì)算
返回響應(yīng):
1.Servlet 根據(jù)代碼計(jì)算生成響應(yīng)對(duì)象(HttpServletResponse)
2.Tomcat 在把該響應(yīng)對(duì)象構(gòu)造成HTTP響應(yīng),通過光電信號(hào)的方式傳輸?shù)綖g覽器主機(jī)
3.瀏覽器主機(jī)在對(duì)光電信號(hào)進(jìn)行解析還原成原本的HTTP響應(yīng),交給瀏覽器進(jìn)行處理
4.瀏覽器解析該HTTP響應(yīng),將數(shù)據(jù)顯示在界面上
二、Tomcat啟動(dòng)過程
1.首先,我們實(shí)現(xiàn)的 Servlet 代碼,只是單純的創(chuàng)建了Servlet類而已,想要讓這些類真正的被使用,需要Tomcat進(jìn)行實(shí)例化,Tomcat就會(huì)根據(jù)@WebServlet注解來獲取到需要被實(shí)例化的類,通過反射的方式創(chuàng)建實(shí)例,并集中放在一數(shù)組中。
2.Tomcat持有了Servlet實(shí)例后,需要調(diào)用 Servlet 中的init()方法進(jìn)行初始化操作(只會(huì)進(jìn)行一次初始化操作)
3.然后進(jìn)行綁定端口號(hào),創(chuàng)建線程池,來并發(fā)的處理請(qǐng)求
4.在服務(wù)器運(yùn)行結(jié)束前,就會(huì)調(diào)用 Servlet對(duì)象中的destroy()方法,進(jìn)行資源回收操作
三、Tomcat處理請(qǐng)求過程
1.Tomcat 接收到請(qǐng)求之后,就會(huì)按照 HTTP協(xié)議的格式將其構(gòu)造成 HttpServletRequest對(duì)象
2.Tomcat 根據(jù) URL 來判斷該請(qǐng)求書否為一靜態(tài)資源(比如圖片、HTML文件之類的),如果是,就直接返回該靜態(tài)資源,如果是動(dòng)態(tài)資源就執(zhí)行接下來的Servlet 部分
3.根據(jù) Content Path 和 Servlet Path來找到請(qǐng)求的Servlet對(duì)象,并調(diào)用Servlet中的service方法判斷請(qǐng)求類型,調(diào)用到程序員自己寫的doXXX方法
四、Servlet的service方法
偽代碼:
class Servlet {
public void service(HttpServletRequest req, HttpServletResponse resp) {
String method = req.getMethod();
if (method.equals("GET")) {
doGet(req, resp);
} else if (method.equals("POST")) {
doPost(req, resp);
} else if (method.equals("PUT")) {
doPut(req, resp);
} else if (method.equals("DELETE")) {
doDelete(req, resp);
}
......
}
}
service 會(huì)根據(jù)請(qǐng)求的方法,調(diào)用對(duì)應(yīng)的方法,當(dāng)調(diào)用doXXX方法時(shí),觸發(fā)多態(tài)機(jī)制,執(zhí)行到程序員自己寫的代碼。
程序員自己寫的 Servlet 類繼承自 HttpServlet 類,HttpServlet 類繼承自 Servlet 類,因此程序員寫的類是 Servlet 的子類。在前面有介紹到 Tomcat 在啟動(dòng)時(shí)會(huì)將需要被實(shí)例化的類都放在了Servlet數(shù)組中,因此實(shí)際上我們是通過父類的引用來獲取到被實(shí)例化的類的,從而觸發(fā)多態(tài)。
類似于
Servlet ins = new HelloServlet();//HelloServlet 類是程序員自己實(shí)現(xiàn)的類的類名 ins.doGet(req,resp);
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java ApiPost請(qǐng)求返回406狀態(tài)碼問題的解決方案
APIPost是一款專為開發(fā)者和測(cè)試人員設(shè)計(jì)的API測(cè)試工具,類似于Postman,但提供了更多的團(tuán)隊(duì)協(xié)作和文檔管理功能,它可以幫助你更好地進(jìn)行接口調(diào)試和集成測(cè)試,但遇到了請(qǐng)求后返回的是406狀態(tài),所以本文給大家介紹了Java ApiPost請(qǐng)求返回406狀態(tài)碼問題的解決方案2025-04-04
SpringData關(guān)鍵字查詢實(shí)現(xiàn)方法詳解
這篇文章主要介紹了SpringData關(guān)鍵字查詢實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Maven發(fā)布項(xiàng)目 (jar包) 到Nexus私服中的操作
這篇文章主要介紹了Maven發(fā)布項(xiàng)目 (jar包) 到Nexus私服中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
基于Java?Agent的premain方式實(shí)現(xiàn)方法耗時(shí)監(jiān)控問題
javaagent是在JDK5之后提供的新特性,也可以叫java代理,這篇文章主要介紹了基于Java?Agent的premain方式實(shí)現(xiàn)方法耗時(shí)監(jiān)控問題,需要的朋友可以參考下2022-10-10
Spring中@Import的各種用法以及ImportAware接口詳解
這篇文章主要介紹了Spring中@Import的各種用法以及ImportAware接口詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
spring配置文件解析失敗報(bào)”cvc-elt.1: 找不到元素 ''''beans'''' 的聲明”異常解決
這篇文章主要給大家介紹了關(guān)于spring配置文件解析失敗報(bào)”cvc-elt.1: 找不到元素 'beans' 的聲明”異常的解決方法,需要的朋友可以參考下2020-08-08
在SpringBoot項(xiàng)目中使用Java8函數(shù)式接口的方法示例
在Spring Boot項(xiàng)目中,Java 8 的函數(shù)式接口廣泛用于實(shí)現(xiàn)各種功能,如自定義配置、數(shù)據(jù)處理等,函數(shù)式接口在Spring Boot中非常有用,本文展示了在SpringBoot項(xiàng)目中使用Java8的函數(shù)式接口的方法示例,需要的朋友可以參考下2024-03-03
selenium4.0版本在springboot中的使用問題的坑
本文主要介紹了selenium4.0版本在springboot中的使用問題的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

