tomcat中Servlet的工作機(jī)制詳細(xì)介紹
tomcat中Servlet的工作機(jī)制
在研究Servlet在tomcat中的工作機(jī)制前必須先看看Servlet規(guī)范的一些重要的相關(guān)規(guī)定,規(guī)范提供了一個Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化時要調(diào)用init方法,在銷毀時要調(diào)用destroy方法,而對客戶端請求處理時則調(diào)用service方法。對于這些機(jī)制的支持都必須由Tomcat內(nèi)部去支持,具體則是由Wrapper容器提供支持。
在tomcat中消息流的流轉(zhuǎn)機(jī)制是通過四個不同級別的容器管道機(jī)制進(jìn)行流轉(zhuǎn)的,對于每個請求都是一層一層處理的。如下圖,當(dāng)客戶端請求到達(dá)服務(wù)端后請求被抽象成request對象后向四個容器進(jìn)行傳遞,首先經(jīng)過Engine容器的管道通過若干閥門,最后通過StandardEngineValve閥門流轉(zhuǎn)到Host容器的管道,處理后繼續(xù)往下流轉(zhuǎn),通過StandardHostValve閥門流轉(zhuǎn)到Context容器的管道,繼續(xù)往下流轉(zhuǎn),通過StandardContextValve閥門流轉(zhuǎn)到Wrapper容器的管道,而對Servlet的核心處理也正是在StandardWrapperValve閥門中。StandardWrapperValve閥門調(diào)用Servlet的service方法隊請求進(jìn)行處理,然后對客戶端響應(yīng)。

下面更深入了解下StandardWrapperValve閥門調(diào)用Servlet的過程。
web應(yīng)用的Servlet類都是根據(jù)Servlet接口,例如一般我們在寫業(yè)務(wù)處理Servlet類時都會繼承HttpServlet類,為了遵循Servlet規(guī)范,它其實最終也是實現(xiàn)了Servlet接口,只是HttpServlet定義了HTTP協(xié)議的Servlet,將協(xié)議共性的東西抽離出來復(fù)用。Servlet處理客戶端請求的核心方法為service方法,所以對于HttpServlet來說,它需要針對http協(xié)議的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等請求方法做出不同的分發(fā)處理,為方便理解,下面用個簡化的代碼展示:
public abstract class HttpServlet extends Servlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String method = req.getMethod();
if (method.equals("GET")) {
doGet(request, response);
}else if (method.equals("POST")) {
doPost(request, response);
}else if (method.equals("HEAD")) {
doHead(request, response);
}
}
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
service方法將請求對象和響應(yīng)對象轉(zhuǎn)換成HttpServletRequest和HttpServletResponse,然后獲取請求方法,根據(jù)請求方法調(diào)用不同的處理方法,例如如果為GET方法則調(diào)用doGet方法,那么在繼承了HttpServlet類的Servlet只需重寫doGet或doPost方法完成業(yè)務(wù)邏輯處理,這就是我們熟悉的Servlet了。
這樣一來,StandardWrapperValve閥門調(diào)用Servlet的工作其實就是通過反射機(jī)制實現(xiàn)對Servlet對象的控制,例如在不配置load-on-startup情況下,客戶端首次訪問該Servlet時由于還不存在該Servlet對象,需要通過反射機(jī)制實例化出該Servlet對象,并且調(diào)用初始化方法,所以這也是為什么第一次訪問某個Servlet時會比較耗時的原因,后面客戶端再對該Servlet訪問時都會使用該Servlet對象,無需再做實例化和初始化操作。有了Servlet對象后調(diào)用其service方法即完成了對客戶端請求的處理。
實際上通過反射機(jī)制實例化Servlet對象是一個比較復(fù)雜的過程,它除了完成實例化和初始化工作外還要解析該Servlet類包含的各種注解并作處理,另外,對于實現(xiàn)了SingleThreadModel接口的Servlet類,它還要維護(hù)一個該Servlet對象池。
綜上所述,Servlet工作機(jī)制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 實例化并初始化Servlet對象 -> 調(diào)用該Servlet對象的service方法 -> response。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署的實現(xiàn)
- IDEA2021 tomcat10 servlet 較新版本踩坑問題
- 深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn)
- tomcat關(guān)于配置servlet的url-pattern的問題思路詳解
- 詳解Tomcat是如何實現(xiàn)異步Servlet的
- 詳解如何通過tomcat的ManagerServlet遠(yuǎn)程部署項目
- Tomcat怎么實現(xiàn)異步Servlet
- Tomcat架構(gòu)設(shè)計及Servlet作用規(guī)范講解
相關(guān)文章
IDEA2022創(chuàng)建Web項目配置Tomcat的詳細(xì)圖文說明
因為學(xué)習(xí)JavaEE需要配置Tomcat,所以抽出時間對IDEA進(jìn)行配置與創(chuàng)建,下面這篇文章主要給大家介紹了關(guān)于IDEA2022創(chuàng)建Web項目配置Tomcat的詳細(xì)圖文說明,需要的朋友可以參考下2023-04-04
eclipse配置Tomcat和Tomcat出現(xiàn)無效端口解決辦法
本文主要介紹了eclipse配置Tomcat和Tomcat出現(xiàn)無效端口解決辦法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
Linux上tomcat的虛擬主機(jī)IP映射配置(圖片服務(wù)器)
有時候我們會使用tomcat作為一個圖片資源服務(wù)器,本文主要介紹了Linux上tomcat的虛擬主機(jī)IP映射配置,通過tomcat服務(wù)器來訪問我們的圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
項目啟動tomcat失敗的幾種可能原因和解決方法(小結(jié))
本文主要介紹了項目啟動tomcat失敗的幾種可能原因和解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
詳述 tomcat 中的 server.xml 配置文件示例
本文將通過實例,介紹server.xml中各個組件的配置,并詳細(xì)說明 Tomcat 各個核心組件的作用以及各個組件之間的相互關(guān)系。對tomcat server.xml 配置文件相關(guān)知識感興趣的朋友一起看看吧2017-08-08
怎么減少本地調(diào)試tomcat重啟次數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了怎么減少本地調(diào)試tomcat重啟次數(shù),使用Groovy,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
org.apache.tomcat.util.http.fileupload.IOUtils報錯對應(yīng)jar問題
這篇文章主要介紹了org.apache.tomcat.util.http.fileupload.IOUtils報錯對應(yīng)jar問題,通過本文學(xué)習(xí)知道jar位置為tomcat8.0?引入lib下的jar包:tomcat-coyote.jar,文中通過圖例給大家講解需要的朋友可以參考下2022-11-11

