国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Web服務器 > 正文

tomcat中Servlet的工作機制詳細介紹

2024-09-01 13:49:57
字體:
來源:轉載
供稿:網友

tomcat中Servlet的工作機制

在研究Servlet在tomcat中的工作機制前必須先看看Servlet規范的一些重要的相關規定,規范提供了一個Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化時要調用init方法,在銷毀時要調用destroy方法,而對客戶端請求處理時則調用service方法。對于這些機制的支持都必須由Tomcat內部去支持,具體則是由Wrapper容器提供支持。

在tomcat中消息流的流轉機制是通過四個不同級別的容器管道機制進行流轉的,對于每個請求都是一層一層處理的。如下圖,當客戶端請求到達服務端后請求被抽象成request對象后向四個容器進行傳遞,首先經過Engine容器的管道通過若干閥門,最后通過StandardEngineValve閥門流轉到Host容器的管道,處理后繼續往下流轉,通過StandardHostValve閥門流轉到Context容器的管道,繼續往下流轉,通過StandardContextValve閥門流轉到Wrapper容器的管道,而對Servlet的核心處理也正是在StandardWrapperValve閥門中。StandardWrapperValve閥門調用Servlet的service方法隊請求進行處理,然后對客戶端響應。

tomcat中Servlet工作原理,tomcat中Servlet工作機制詳解,tomcat,Servlet

下面更深入了解下StandardWrapperValve閥門調用Servlet的過程。

web應用的Servlet類都是根據Servlet接口,例如一般我們在寫業務處理Servlet類時都會繼承HttpServlet類,為了遵循Servlet規范,它其實最終也是實現了Servlet接口,只是HttpServlet定義了HTTP協議的Servlet,將協議共性的東西抽離出來復用。Servlet處理客戶端請求的核心方法為service方法,所以對于HttpServlet來說,它需要針對http協議的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等請求方法做出不同的分發處理,為方便理解,下面用個簡化的代碼展示:

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方法將請求對象和響應對象轉換成HttpServletRequest和HttpServletResponse,然后獲取請求方法,根據請求方法調用不同的處理方法,例如如果為GET方法則調用doGet方法,那么在繼承了HttpServlet類的Servlet只需重寫doGet或doPost方法完成業務邏輯處理,這就是我們熟悉的Servlet了。

這樣一來,StandardWrapperValve閥門調用Servlet的工作其實就是通過反射機制實現對Servlet對象的控制,例如在不配置load-on-startup情況下,客戶端首次訪問該Servlet時由于還不存在該Servlet對象,需要通過反射機制實例化出該Servlet對象,并且調用初始化方法,所以這也是為什么第一次訪問某個Servlet時會比較耗時的原因,后面客戶端再對該Servlet訪問時都會使用該Servlet對象,無需再做實例化和初始化操作。有了Servlet對象后調用其service方法即完成了對客戶端請求的處理。

實際上通過反射機制實例化Servlet對象是一個比較復雜的過程,它除了完成實例化和初始化工作外還要解析該Servlet類包含的各種注解并作處理,另外,對于實現了SingleThreadModel接口的Servlet類,它還要維護一個該Servlet對象池。

綜上所述,Servlet工作機制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 實例化并初始化Servlet對象 -> 調用該Servlet對象的service方法 -> response。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白朗县| 宜阳县| 孟村| 北川| 湘西| 巫山县| 酒泉市| 深圳市| 乌兰县| 定安县| 永年县| 巴彦县| 苍山县| 赤峰市| 涟水县| 玉田县| 晋中市| 蓝田县| 日喀则市| 岐山县| 连山| 巴彦县| 荥阳市| 英超| 罗定市| 唐海县| 五寨县| 高密市| 彭山县| 维西| 龙里县| 枣强县| 闻喜县| 靖远县| 郑州市| 武定县| 桂东县| 舒城县| 同心县| 旬阳县| 保定市|