程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> How Tomcat Works讀書筆記2

How Tomcat Works讀書筆記2

編輯:C++入門知識

How Tomcat Works讀書筆記2


我們回顧一下,第一章實現的Web服務器類圖大致如下:
這裡寫圖片描述

其中HttpServer中的await()方法會使用一個ServerSocket來監聽8080端口,用來接收客戶端的請求。當接收到用戶請求後會創建一個Socket對象,通過與Socket關聯的InputStream來創建並填充一個Request對象(這裡只是簡單的填充了Uri)。然後用Socket關聯的OutputStream創建一個Response對象,並持有一個Request對象。最後通過調用Response對象中的sendStaticResource()方法來向客戶端發送靜態頁面(其中根據request.getUri()來決定返回哪個頁面)。

而第二章實現的Web服務器有什麼改進的地方?
首先摒棄了第一章中自定義的ResponseRequest類,而是根據Servlet標准提供的接口來定義類。Servlet 編程是通過 javax.servletjavax.servlet.http 這兩個包的類和接口來實現的。其中一個至關重要的就是javax.servlet.Servlet 接口了。所有的 servlet 必須實現實現或者繼承實現該接口的類。Servlet接口有五個方法:


public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

其中initservicedestoryServlet的生命周期方法。init只會在Servlet實例化完成後被調用一次,service會在每次請求該Servlet時被調用,而destory會在該Servlet卸載時被調用,這通常發生在Servlet容器正在被關閉或者Servlet容器需要一些空閒內存的時候。

在第二章中實現的Web服務器將會以Servlet容器的角度來編程。總的來說,一個全功能的Servlet容器會為servlet的每個HTTP請求做下面一些工作:

當第一次調用Servlet的時候,加載該Servlet類並調用Servletinit方法(僅一次) 對每次請求,構造一個javax.servlet.ServletRequest實例和一個javax.servlet.ServletResponse實例 調用servletservice方法,並傳入ServletRequestServletReponse實例 當servlet容器被關閉時,調用servletdestory方法並卸載servlet

那麼如何加載Servlet類呢,我們可以用

Class.forName(xxx)

來加載一個類。也可以用java.net.URLClassLoader類,它是java.lang.ClassLoader類的一個直接子類。擁有一個URLClassLoader實例,那麼就可以直接使用它的loadClass方法去加載Servlet類了。這裡我們就直接用URLClassLoader最簡單的構造函數:URLClassLoader(URL[] urls),這裡的URL數組就指定了類所在的目錄位置(通常叫repository)。不過由於雙親加載機制,如果在classpath下已經存在某個類,就加載不到repository中的對應類了。

剛才說了這裡會摒棄第一章的RequestResponse類。而新的RequestResponse類分別實現了 javax.servlet.ServletRequest接口和javax.servlet.ServletResponse接口,只不過在目前很多方法都留空了。第二章的類圖大致如下:
這裡寫圖片描述

HttpServer依舊監聽8080端口等待客戶端連接,根據請求內容創建並填充Request對象,並創建Response對象。RequestResponse類中的大多數方法都是留空的。然後會根據請求內容來判斷是創建ServletProcessor實例還是創建StaticResourceProcessor實例,對了,這裡的話我個人覺得在兩個Processor之上再創建一個Processor接口並讓它們實現這個接口更加好一些。如果是StaticResourceProcessor,那麼直接返回請求的靜態內容。而如果是ServletProcessor,那麼則去加載請求的Servlet類,然後調用ServletdoService方法來進行處理並響應給客戶端。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved