1. 程式人生 > >servlet、servlet容器和web容器

servlet、servlet容器和web容器

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容器。

自從計算機軟體開發進入網路時代,就開始涉及到通訊問題。在客戶/伺服器(也叫C/S應用)時期,每個軟體都有自己的客戶端和伺服器端軟體。並且客戶端和伺服器端之間的通訊協議差別也很大。後來隨著網際網路的發展,基於瀏覽器/伺服器的應用逐漸成為主流,通訊協議也統一到HTTP協議。但是,在HTTP協議之上,如何處理來自客戶端的請求資訊,以及如何對請求進行迴應,則經歷了很長時間也沒有統一下來。目前,對於這個問題的解決方案主要有兩種,一個是CGI,另一個是Servlet。

CGI(Common Gateway Interface),通用閘道器介面

通用閘道器介面,簡稱CGI,是一種根據請求資訊動態產生迴應內容的技術。通過CGI,Web 伺服器可以將根據請求不同啟動不同的外部程式,並將請求內容轉發給該程式,在程式執行結束後,將執行結果作為迴應返回給客戶端。也就是說,對於每個請求,都要產生一個新的程序進行處理。因為每個程序都會佔有很多伺服器的資源和時間,這就導致伺服器無法同時處理很多的併發請求。另外CGI程式都是與作業系統平臺相關的,雖然在網際網路爆發的初期,CGI為開發網際網路應用做出了很大的貢獻,但是隨著技術的發展,開始逐漸衰落。

Servlet

Servlet最初是在1995年由James Gosling 提出的,因為使用該技術需要複雜的Web伺服器支援,所以當時並沒有得到重視,也就放棄了。後來隨著Web應用複雜度的提升,並要求提供更高的併發處理能力,Servlet被重新撿起,並在Java平臺上得到實現,現在提起Servlet,指的都是Java Servlet。Java Servlet要求必須執行在Web伺服器當中,與Web伺服器之間屬於分工和互補關係。確切的說,在實際執行的時候Java Servlet與Web伺服器會融為一體,如同一個程式一樣執行在同一個Java虛擬機器(JVM)當中。與CGI不同的是,Servlet對每個請求都是單獨啟動一個執行緒,而不是程序。這種處理方式大幅度地降低了系統裡的程序數量,提高了系統的併發處理能力。另外因為Java Servlet是執行在虛擬機器之上的,也就解決了跨平臺問題。如果沒有Servlet的出現,也就沒有網際網路的今天。

在Servlet出現之後,隨著使用範圍的擴大,人們發現了它的一個很大的一個弊端。那就是為了能夠輸出HTML格式內容,需要編寫大量重複程式碼,造成不必要的重複勞動。為了解決這個問題,基於Servlet技術產生了JavaServet Pages技術,也就是JSP。Servlet和JSP兩者分工協作,Servlet側重於解決運算和業務邏輯問題,JSP則側重於解決展示問題。Servlet與JSP一起為Web應用開發帶來了巨大的貢獻,後來出現的眾多Java Web應用開發框架都是基於這兩種技術的,更確切的說,都是基於Servlet技術的。

Java Servlet與Web容器之間的關係

Java是一種動態載入和執行的語言。也就是說當應用程式持有一個類的地址(CLASSPATH)和名稱(包名和類名)的情況下,可以在程式執行期間任何時候載入這個類,並建立和使用該類的物件。Servlet就是基於這個機制與Web容器融合在一起的。目前已知的所有支援Java Servlet的Web容器都是採用Java開發的。當Web容器接收到來自客戶端的請求資訊之後,會根據URL中的Web元件地址資訊到Servlet佇列中查詢對應的Servlet物件,如果找到則直接使用,如果沒有找到則載入對應的類,並建立物件。也就是說,Servlet物件是在第一次被使用的時候才建立的,並且一旦建立就會被反覆使用,不再建立新的物件。所有創建出的Servlet物件會在Web伺服器停止執行的時候統一進行垃圾回收。

為了解決客戶端請求地址與Java Servlet之間對應關係問題,Web容器需要一個用來描述這種對應關係的檔案,一般是web.xml檔案。如果一個Web應用程式中存在很多個Servlet,那麼web.xml會變得非常龐大。在Servlet 3.0規範推出之後,允許在Servlet程式碼中使用宣告式語法來代替web.xml中的描述資訊,這才讓web.xml瘦身下來。

Web伺服器與Web應用層屬於不容兩個範疇,為了讓他們兩寫作,首先應用中介方當制定Web應用與Web伺服器進行協作的標準介面,Servlet就是其中一個主要的協議、介面。

Web應用與Web伺服器進行協作的一系列標準Java介面,統稱Java Servlet API。另外還有一些Servlet規範。Servlet規範把能夠與釋出和執行Java Web應用容器的Web伺服器稱為Servlet容器。