Servlet和CGI的區別

AND_YOU_with_ME發表於2017-04-07

       Servlet被伺服器例項化後,容器執行其init方法,請求到達時執行其service方法,service方法自動派遣執行與請求對應的doXXX方法(doGetdoPost)等,當伺服器決定將例項銷燬的時候呼叫其destroy方法。

servlet處於伺服器程式中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程式,服務完成後就銷燬,所以效率上低於servlet

概括來講,Servlet可以完成和CGI相同的功能。

CGI應用開發比較困難,因為它要求程式設計師有處理引數傳遞的知識,這不是一種通用的技能。CGI不可移植,為某一特定平臺編寫的CGI應用只能執行於這一環境中。每一個CGI應用存在於一個由客戶端請求啟用的程式中,並且在請求被服務後被解除安裝。這種模式將引起很高的記憶體、CPU開銷,而且在同一程式中不能服務多個客戶。

Servlet提供了Java應用程式的所有優勢——可移植、穩健、易開發。使用Servlet Tag技術,Servlet能夠生成嵌於靜態HTML頁面中的動態內容。

ServletCGI的最主要優勢在於一個Servlet被客戶端傳送的第一個請求啟用,然後它將繼續執行於後臺,等待以後的請求。每個請求將生成一個新的執行緒,而不是一個完整的程式。多個客戶能夠在同一個程式中同時得到服務。一般來說,Servlet程式只是在Web Server解除安裝時被解除安裝。

Servlet在效能、編寫難度、可移植性等方面比CGI有明顯優勢。在WebSphere Application Server中提供了功能強大的Servlet API,它們比JSDK擁有更多的功能和更優的效能,為Servlet的程式設計提供了很好的支援。隨著WAS的日益推廣和Java技術的普及,可以預見,Servlet技術將取代CGI,成為對Web Server功能擴充的標準技術。

最早支援Servlet技術的是JavaSoftJava Web Server。此後,一些其它的基於JavaWeb Server開始支援標準的Servlet APIServlet的主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。這個過程為:

·客戶端傳送請求至伺服器端;

·伺服器將請求資訊傳送至Servlet

·Servlet生成響應內容並將其傳給Server。響應內容動態生成,通常取決於客戶端的請求;

·伺服器將響應返回給客戶端。

Servlet看起來像是通常的Java程式。Servlet匯入特定的屬於Java Servlet API的包。因為是物件位元組碼,可動態地從網路載入,可以說ServletServer就如同AppletClient一樣,但是,由於Servlet執行於Server中,它們並不需要一個圖形使用者介面。從這個角度講,Servlet也被稱為Faceless Object


Servlet的優勢


Java Servlet提供了許多優勢:

·Servlet可以和其他資源(檔案、資料庫、AppletJava應用程式等)互動,以生成返回給客戶端的響應內容。如果需要,還可以儲存請求-響應過程中的資訊。

·採用Servlet,伺服器可以完全授權對本地資源的訪問(如資料庫),並且Servlet自身將會控制外部使用者的訪問數量及訪問性質。

·Servlet可以是其它服務的客戶端程式,例如,它們可以用於分散式的應用系統中。

·可以從本地硬碟,或者通過網路從遠端硬碟啟用Servlet

·Servlet可被連結(chain)。一個Servlet可以呼叫另一個或一系列Servlet,即成為它的客戶端。

·採用Servlet Tag技術,可以在HTML頁面中動態呼叫Servlet

·Servlet API與協議無關。它並不對傳遞它的協議有任何假設。

·像所有的Java程式一樣,Servlet擁有物件導向Java語言的所有優勢。


ServletCGIBIN


  概括來講,Servlet可以完成和CGI相同的功能。

CGI應用開發比較困難,因為它要求程式設計師有處理引數傳遞的知識,這不是一種通用的技能。CGI不可移植,為某一特定平臺編寫的CGI應用只能執行於這 一環境中。每一個CGI應用存在於一個由客戶端請求啟用的程式中,並且在請求被服務後被解除安裝。這種模式將引起很高的記憶體、CPU開銷,而且在同一程式中不 能服務多個客戶。

Servlet提供了Java應用程式的所有優勢——可移植、穩健、易開發。使用Servlet Tag技術,Servlet能夠生成嵌於靜態HTML頁面中的動態內容。

ServletCGI的最主要優勢在於一個Servlet被客戶端傳送的第一個請求啟用,然後它將繼續執行於後臺,等待以後的請求。每個請求將生成一 個新的執行緒,而不是一個完整的程式。多個客戶能夠在同一個程式中同時得到服務。一般來說,Servlet程式只是在Web Server解除安裝時被解除安裝。
Servlet的生命週期(見圖2)可以被歸納為以下幾點:

·裝載Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet(1)

·Server建立一個Servlet的例項(2)

·Server呼叫Servletinit()方法(3)

·一個客戶端的請求到達Server(1)

·Server建立一個請求物件(4)

·Server建立一個響應物件(5)

·Server啟用Servletservice()方法(6),傳遞請求(7)和響應(8)物件作為引數;

·service()方法獲得關於請求物件的資訊,處理請求,訪問其他資源(9),獲得需要的資訊(10)

·service()方法使用響應物件的方法,將響應傳回Server(11)(12),最終到達客戶端(13)service()方法可能啟用其它方法以處理請求,如doGet()doPost()或程式設計師自己開發的新的方法;

·對於更多的客戶端請求,Server建立新的請求和響應物件,仍然啟用此Servletservice()方法,將這兩個物件作為引數傳遞給它。如此重複以上的迴圈,但無需再次呼叫init()方法。一般Servlet只初始化一次;

·Server不再需要Servlet(一般當Server關閉時)Server呼叫ServletDestroy()方法。
ServletCGI程式的比較
CGI(Common Gateway Interface)程式,主要用PerlShell ScriptC編寫,能夠向客戶端提供動態內容,即每次客戶端瀏覽器訪問某一頁面時,可以看到不同的內容。這裡對完成相同功能的CGI程式和Java Servlet程式作一比較,以便更清楚地看到Servlet的簡單特性。

相關文章