1. 程式人生 > >理解Servlet和Servlet容器、Web容器等概念

理解Servlet和Servlet容器、Web容器等概念

Tomcat容器屬於web容器的一種,web容器還包括weblogic容器、JBoss容器等;而Tcomcat、webLogic等包含servlet容器。

web容器:可以部署多個WEB應用程式的環境。

Tomcat容器:是Java Servlet,JavaServer Pages,Java Expression Language和Java WebSocket(Java EE)技術的開源實現。

Servlet容器:全稱server applet,意為服務程式。主要作用是給上級容器(Tomcat)提供doGet()和doPost()等方法。其生命週期例項化、初始化、呼叫、銷燬受控於Tomcat容器。

Web技術

隨著網際網路技術的發展,基於HTTP和HTML的web應用急速增長。早期的web應用主要用於瀏覽新聞等靜態頁面,使用者通過HTTP協議請求服務 器上的靜態頁面,伺服器上的web伺服器軟體接收到請求後,讀取URI標示的資源,再加上訊息報頭髮送給客戶端瀏覽器,瀏覽器負責解析HTML,將結果呈 現出來。

然而隨著時間發展,使用者已經不滿足於僅瀏覽靜態頁面。使用者需要一些互動操作,獲取一些動態結果。如果基於HTTP協議實現伺服器端軟體增強功能太過 複雜,所以需要一些擴充套件機制來實現使用者想要的功能。早期使用的Web伺服器擴充套件機制是CGI(Common Gateway Interface,公共閘道器介面)。使用這種方法,使用者單擊某個連結或輸入網址來訪問CGI程式,web伺服器收到請求後,執行該CGI程式,對使用者請 求進行處理,緊接著將處理結果併產生一個響應,該響應被返回給web伺服器,web伺服器對響應進行包裝,以HTTP響應的方式返回給瀏覽器。

CGI程式在一定程度上解決了使用者需求。不過還存在一些不足之處,如CGI程式編寫困難,響應時間較長,以程序方式執行導致效能受限。於是1997年,sun公司推出了Servlet技術,作為java陣營的CGI解決方案。

servlet與servlet容器

Java Servlet(Java伺服器小程式)是一個基於Java技術的Web元件,執行在伺服器端,它由Servlet容器所管理,用於生成動態的內容。 Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯為平臺獨立 的位元組碼,可以被動態地載入到支援Java技術的Web伺服器中執行。  Servlet容器也叫做Servlet引擎,是Web伺服器或應用程式伺服器的一部分,用於在傳送的請求和響應之上提供網路服務,解碼基於 MIME的請求,格式化基於MIME的響應。Servlet沒有main方法,不能獨立執行,它必須被部署到Servlet容器中,由容器來例項化和呼叫 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命週期內包容和管理Servlet。在JSP技術 推出後,管理和執行Servlet/JSP的容器也稱為Web容器。

(注:常用的MIME型別:text/html,application/pdf,video/quicktime,application /java,image/jpeg,application/jar,application/octet-stream,application/x- zip)

有了servlet之後,使用者通過單擊某個連結或者直接在瀏覽器的位址列中輸入URL來訪問Servlet,Web伺服器接收到該請求後,並不是將 請求直接交給Servlet,而是交給Servlet容器。Servlet容器例項化Servlet,呼叫Servlet的一個特定方法對請求進行處理, 併產生一個響應。這個響應由Servlet容器返回給Web伺服器,Web伺服器包裝這個響應,以HTTP響應的形式傳送給Web瀏覽器。

servlet容器能提供什麼?

我們知道需要由servlet容器來管理和執行servlet,但是為什麼要這樣做呢?使用servlet容器的原因有:

通訊支援:利用容器提供的方法,你能輕鬆的讓servlet與web伺服器對話,而不用自己建立serversocket、監聽某個埠、建立流等 等。容器知道自己與web伺服器之間的協議,所以你的servlet不用擔心web伺服器(如Apache)和你自己的web程式碼之間的API,只需要考 慮如何在servlet中實現業務邏輯(如處理一個訂單)。  生命週期管理:servlet容器控制著servlet的生與死,它負責載入類、例項化和初始化servlet,呼叫servlet方法,以及使servlet例項被垃圾回收,有了servlet容器,你不需要太多的考慮資源管理。  多執行緒支援:容器會自動為它所接收的每個servlet請求建立一個新的java執行緒。針對使用者的請求,如果servlet已經執行完相應的http服務方法,這個執行緒就會結束。這並不是說你不需要考慮執行緒安全性,其實你還會遇到同步問題,不過這樣能使你少做很多工作。  宣告方式實現安全:利用servlet容器,你可以使用xml部署描述檔案來配置和修改安全性,而不必將其硬編碼寫到servlet類程式碼中。  JSP支援:servlet容器負責將jsp程式碼翻譯為真正的java程式碼。

用與CGI程式相比,Servlet具有以下優點:

Servlet是單例項多執行緒的執行方式,每個請求在一個獨立的執行緒中執行,而提供服務的Servlet例項只有一個。  Servlet具有可升級性,能響應更多的請求,因為Servlet容器使用一個執行緒而不是作業系統程序,而執行緒僅佔用有限的系統資源。  Servlet使用標準的API,被更多的Web伺服器所支援。  Servlet使用Java語言編寫,因此擁有Java程式語言的所有優點,包括容易開發和平臺獨立性。  Servlet可以訪問Java平臺豐富的類庫,使得各種應用的開發更為容易。  Servlet容器給Servlet提供額外的功能,如錯誤處理和安全。  Servlet容器的分類

根據Servlet容器工作模式的不同,可以將Servlet容器分為以下三類:

1)獨立的Servlet容器

當我們使用基於Java技術的Web伺服器時,Servlet容器作為構成Web伺服器的一部分而存在。然而大多數的Web伺服器並非基於Java,因此,就有了下面兩種Servlet容器的工作模式。

2)程序內的Servlet容器

Servlet容器由Web伺服器外掛和Java容器兩部分的實現組成。Web伺服器外掛在某個Web伺服器內部地址空間中開啟一個 JVM(Java虛擬機器),使得Java容器可以在此JVM中載入並執行Servlet。如有客戶端呼叫Servlet的請求到來,外掛取得對此請求的控 制並將它傳遞(使用JNI技術)給Java容器,然後由Java容器將此請求交由Servlet進行處理。程序內的Servlet容器對於單程序、多執行緒 的伺服器非常適合,提供了較高的執行速度,但伸縮性有所不足。

3)程序外的Servlet容器

Servlet容器運行於Web伺服器之外的地址空間,它也是由Web伺服器外掛和Java容器兩部分的實現組成的。Web伺服器外掛和Java容 器(在外部JVM中執行)使用IPC機制(通常是TCP/IP)進行通訊。當一個呼叫Servlet的請求到達時,外掛取得對此請求的控制並將其傳遞(使 用IPC機制)給Java容器。程序外Servlet容器對客戶請求的響應速度不如程序內的Servlet容器,但程序外容器具有更好的伸縮性和穩定性。

Tomcat

學習Servlet技術,就需要有一個Servlet執行環境,也就是需要有一個Servlet容器,本文用的是Tomcat。

Tomcat是一個免費的開放原始碼的Servlet容器,它是Apache軟體基金會(Apache Software Foundation)的一個頂級專案,由Apache、Sun和其他一些公司及個人共同開發而成。由於有了Sun的參與和支援,最新的Servlet和 JSP規範總是能在Tomcat中得到體現,Tomcat 6支援最新的Servlet 2.5和JSP 2.1規範。因為Tomcat技術先進、效能穩定,而且免費,因而深受Java愛好者的喜愛,並得到了部分軟體開發商的認可,成為目前比較流行的Web服 務器。

Tomcat和IIS、Apache等Web伺服器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的 Servlet容器是Tomcat的預設模式。不過,Tomcat處理靜態HTML的能力不如Apache,我們可以將Apache和Tomcat整合在 一起使用,Apache作為HTTP Web伺服器,Tomcat作為Web容器。

Tomcat伺服器接受客戶請求並做出響應的過程如下:

1)客戶端(通常都是瀏覽器)訪問Web伺服器,傳送HTTP請求。  2)Web伺服器接收到請求後,傳遞給Servlet容器。  3)Servlet容器載入Servlet,產生Servlet例項後,向其傳遞表示請求和響應的物件。  4)Servlet例項使用請求物件得到客戶端的請求資訊,然後進行相應的處理。  5)Servlet例項將處理結果通過響應物件傳送回客戶端,容器負責確保響應正確送出,同時將控制返回給Web伺服器。