tomcat中Servlet的工作機(jī)制詳細(xì)介紹
tomcat中Servlet的工作機(jī)制
在研究Servlet在tomcat中的工作機(jī)制前必須先看看Servlet規(guī)范的一些重要的相關(guān)規(guī)定,規(guī)范提供了一個(gè)Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化時(shí)要調(diào)用init方法,在銷毀時(shí)要調(diào)用destroy方法,而對客戶端請求處理時(shí)則調(diào)用service方法。對于這些機(jī)制的支持都必須由Tomcat內(nèi)部去支持,具體則是由Wrapper容器提供支持。
在tomcat中消息流的流轉(zhuǎn)機(jī)制是通過四個(gè)不同級別的容器管道機(jī)制進(jìn)行流轉(zhuǎn)的,對于每個(gè)請求都是一層一層處理的。如下圖,當(dāng)客戶端請求到達(dá)服務(wù)端后請求被抽象成request對象后向四個(gè)容器進(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方法隊(duì)請求進(jìn)行處理,然后對客戶端響應(yīng)。
下面更深入了解下StandardWrapperValve閥門調(diào)用Servlet的過程。
web應(yīng)用的Servlet類都是根據(jù)Servlet接口,例如一般我們在寫業(yè)務(wù)處理Servlet類時(shí)都會(huì)繼承HttpServlet類,為了遵循Servlet規(guī)范,它其實(shí)最終也是實(shí)現(xiàn)了Servlet接口,只是HttpServlet定義了HTTP協(xié)議的Servlet,將協(xié)議共性的東西抽離出來復(fù)用。Servlet處理客戶端請求的核心方法為service方法,所以對于HttpServlet來說,它需要針對http協(xié)議的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等請求方法做出不同的分發(fā)處理,為方便理解,下面用個(gè)簡化的代碼展示:
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的工作其實(shí)就是通過反射機(jī)制實(shí)現(xiàn)對Servlet對象的控制,例如在不配置load-on-startup情況下,客戶端首次訪問該Servlet時(shí)由于還不存在該Servlet對象,需要通過反射機(jī)制實(shí)例化出該Servlet對象,并且調(diào)用初始化方法,所以這也是為什么第一次訪問某個(gè)Servlet時(shí)會(huì)比較耗時(shí)的原因,后面客戶端再對該Servlet訪問時(shí)都會(huì)使用該Servlet對象,無需再做實(shí)例化和初始化操作。有了Servlet對象后調(diào)用其service方法即完成了對客戶端請求的處理。
實(shí)際上通過反射機(jī)制實(shí)例化Servlet對象是一個(gè)比較復(fù)雜的過程,它除了完成實(shí)例化和初始化工作外還要解析該Servlet類包含的各種注解并作處理,另外,對于實(shí)現(xiàn)了SingleThreadModel接口的Servlet類,它還要維護(hù)一個(gè)該Servlet對象池。
綜上所述,Servlet工作機(jī)制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 實(shí)例化并初始化Servlet對象 -> 調(diào)用該Servlet對象的service方法 -> response。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署的實(shí)現(xiàn)
- IDEA2021 tomcat10 servlet 較新版本踩坑問題
- 深入了解tomcat中servlet的創(chuàng)建方式實(shí)現(xiàn)
- tomcat關(guān)于配置servlet的url-pattern的問題思路詳解
- 詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的
- 詳解如何通過tomcat的ManagerServlet遠(yuǎn)程部署項(xiàng)目
- Tomcat怎么實(shí)現(xiàn)異步Servlet
- Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解
相關(guān)文章
Tomcat CentOS安裝實(shí)現(xiàn)過程圖解
這篇文章主要介紹了Tomcat CentOS安裝實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09解決運(yùn)行Tomcat之后仍然出現(xiàn)404的問題
這篇文章主要介紹了解決運(yùn)行Tomcat之后仍然出現(xiàn)404的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11cemtos 7 linux 安裝與卸載 tomcat 7的教程
這篇文章主要介紹了cemtos 7 linux 安裝與卸載 tomcat 7的教程,需要的朋友可以參考下2017-10-10Tomcat7.0設(shè)置虛擬目錄配置虛擬路徑的方法講解
今天小編就為大家分享一篇關(guān)于Tomcat7.0設(shè)置虛擬目錄配置虛擬路徑的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03idea搭建項(xiàng)目找不到Tomcat的解決方法(圖文教程)
今天在公司中導(dǎo)入公司項(xiàng)目,需要配置tomcat,結(jié)果發(fā)現(xiàn)找不到,所以這篇文章主要給大家介紹了關(guān)于idea搭建項(xiàng)目找不到Tomcat的解決方法,需要的朋友可以參考下2023-07-07修改Tomcat服務(wù)器默認(rèn)端口號的實(shí)現(xiàn)方法
這篇文章主要介紹了修改Tomcat服務(wù)器默認(rèn)端口號的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-09-09