最早支持Servlet技術的是JavaSoft的Java Web Server。此後,一些其它的基於Java的Web Server開始支持標準的Servlet API。
一、Servlet的特點
Servlet是Java技術對CGI編程的回答。Servlet程式在伺服器端運行,動態地生成Web頁面。與傳統的CGI和許多其他類似CGI的技術相比,Java Servlet具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資(更重要的是, Servlet程式設計師收入要比Perl程式設計師高:-)
高效
在傳統的CGI中,每個請求都要啟動一個新的進程,如果CGI程式本身的執行時間較短,啟動進程所需要的開銷很可能反而超過實際執行時間。而在Servlet中,每個請求由一個輕量級的Java執行緒處理(而不是重量級的作業系統進程)。在傳統CGI中,如果有N個並發的對同一CGI程式的請求,則該CGI程式的代碼在記憶體中重複裝載了N次;而對於Servlet,處理請求的是N個執行緒,只需要一份Servlet類代碼。在性能最佳化方面,Servlet也比CGI有著更多的選擇,比如緩衝以前的計算結果,保持資料庫連線的活動,等等。
方便
Servlet提供了大量的實用工具例程,例如自動地解析和解碼HTML表單數據、讀取和設定HTTP頭、處理Cookie、跟蹤會話狀態等。
功能強大
在Servlet中,許多使用傳統CGI程式很難完成的任務都可以輕鬆地完成。例如,Servlet能夠直接和Web伺服器互動,而普通的CGI程式不能。Servlet還能夠在各個程式之間共享數據,使得資料庫連線池之類的功能很容易實現。
可移植性好
Servlet用Java編寫,Servlet API具有完善的標準。因此,為I-Planet Enterprise Server寫的Servlet無需任何實質上的改動即可移植到Apache、Microsoft IIS或者WebStar。幾乎所有的主流伺服器都直接或通過外掛程式支持Servlet。
節省投資
不僅有許多廉價甚至免費的Web伺服器可供個人或小規模網站使用,而且對於現有的伺服器,如果它不支持Servlet的話,要加上這部分功能也往往是免費的(或只需要極少的投資)。
二、Servlet的主要功能
Servlet的主要功能在於互動式地瀏覽和修改數據,生成動態Web內容。這個過程為:
客戶端傳送請求至伺服器端;
伺服器將請求信息傳送至Servlet
Servlet生成回響內容並將其傳給Server。回響內容動態生成,通常取決於客戶端的請求
伺服器將回響返回給客戶端
Servlet看起來像是通常的Java程式。Servlet導入特定的屬於Java Servlet API的包。因為是對象位元組碼,可動態地從網路載入,可以說Servlet對Server就如同Applet對Client一樣,但是,由於Servlet運行於Server中,它們並不需要一個圖形用戶界面。從這個角度講,Servlet也被稱為faceless Object。
三、JAVA Servlet的優勢
Servlet可以和其他資源(檔案、資料庫、Applet、Java應用程式等)互動,以生成返回給客戶端的回響內容。如果需要,還可以保存請求-回響過程中的信息。
採用Servlet,伺服器可以完全授權對本地資源的訪問(如資料庫),並且Servlet自身將會控制外部用戶的訪問數量及訪問性質
Servlet可以是其它服務的客戶端程式,例如,它們可以用於分散式的套用系統中,可以從本地硬碟,或者通過網路從遠端硬碟激活Servlet。
Servlet可被連結(chain)。一個Servlet可以調用另一個或一系列Servlet,即成為它的客戶端。
採用Servlet Tag技術,可以在HTML頁面中動態調用Servlet。
Servlet API與協定無關。它並不對傳遞它的協定有任何假設。
像所有的Java程式一樣,Servlet擁有面向對象Java語言的所有優勢
Servlet提供了Java應用程式的所有優勢——可移植、穩健、易開發。使用Servlet 的Tag技術,Servlet能夠生成嵌於靜態HTML頁面中的動態內容。
一個Servlet被客戶端傳送的第一個請求激活,然後它將繼續運行於後台,等待以後的請求。每個請求將生成一個新的執行緒,而不是一個完整的進程。多個客戶能夠在同一個進程中同時得到服務。一般來說,Servlet進程只是在Web Server卸載時被卸載。
四、Servlet生命周期
裝載Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet。
Server創建一個Servlet的實例
Server調用Servlet的init()方法
一個客戶端的請求到達Server
Server創建一個請求對象
Server創建一個回響對象
Server激活Servlet的service()方法,傳遞請求和回響對象作為參數
service()方法獲得關於請求對象的信息,處理請求,訪問其他資源,獲得需要的信息
service()方法使用回響對象的方法,將回響傳回Server,最終到達客戶端。service()方法可能激活其它方法以處理請求,如doGet()或doPost()或程式設計師自己開發的新的方法
對於更多的客戶端請求,Server創建新的請求和回響對象,仍然激活此Servlet的service()方法,將這兩個對象作為參數傳遞給它。如此重複以上的循環,但無需再次調用init()方法。一般Servlet只初始化一次 ,當Server不再需要Servlet時(一般當Server關閉時),Server調用Servlet的Destroy()方法。
在美國,EJB+Servlet+JSP幾乎成為電子商務的開發標準。本來 ASP 也很有希望,但微軟最近可能把精力都集中在打官司和Win2000上, 因此電子商務發展得太少。PHP由於其模式和一些天生缺陷,毫無希望。 在美國,很少有商業站點用PHP的。
下面的一番解釋也值得一看:
首先,既然是Java Servlets,Java的特性它都具備,比如“一次編寫,多平台運行”,而且它肯定是用Java語言來寫的,所以,學習Servlets必須要有一定的Java語言基礎。如果沒有,恐怕您會對以下內容失望的。
從Servlets的工作機制上看,它比較象CGI(Common Gateway Interface)通用網關接口,比如:和CGI程式一樣,Servlets可以回響用戶的指令(提交一個FORM等等),也可以象CGI程式一樣,收集用戶表單的信息並給予動態反饋(簡單的註冊信息錄入和檢查錯誤)。
然而,Servlets的機制並不僅僅是這樣簡單的與用戶表單進行互動。傳統技術中,動態的網頁建立和顯示都是通過CGI來實現的,但是,有了Servlets,您可以大膽的放棄所有CGI(perl?php?甚至asp!),利用Servlets代替CGI,進行程式編寫。(千萬別懷疑,接著看)
對比一:當用戶瀏覽器發出一個Http/CGI的請求,或者說調用一個CGI程式的時候,伺服器端就要新啟用一個進程(而且是每次都要調用),調用CGI程式越多(特別是訪問量高的時候),就要消耗系統越多的處理時間,只剩下越來越少的系統資源,對於用戶來說,只能是漫長的等待伺服器端的返回頁面了,這對於電子商務激烈發展的今天來說,不能不說是一種技術上的遺憾。
而Servlets充分發揮了伺服器端的資源並高效的利用。每次調用Servlets時並不是新啟用一個進程,而是在一個Web伺服器的進程中共享和分離執行緒,而執行緒最大的好處在於可以共享一個數據源,使系統資源被有效利用。
對比二:傳統的CGI程式,不具備平台無關性特徵,系統環境發生變化,CGI程式就要癱瘓,而Servlets具備Java的平台無關性,在系統開發過程中保持了系統的可擴展性、高效性。
對比三:傳統技術中,一般大都為二層的系統架構,即Web伺服器+資料庫伺服器,導致網站訪問量大的時候,無法克服CGI程式與資料庫建立連線時速度慢的瓶頸,從而當機、資料庫死鎖現象頻繁發生。而我們的Servlets(現在可以這么叫了吧,算是妮稱,ok!)有連結池的概念,它可以利用多執行緒的優點,在系統快取中事先建立好若干與資料庫的連結,到時候若想和資料庫打交道可以隨時跟系統"要"一個連結即可,反應速度可想而知。
在與傳統技術的對比中,Java的伺服器(至少三層架構)提出了一種“中間件”的概念,可能中間件的範圍太廣,本文又是Servlets的概貌了解,就不涉及太多。不過套用伺服器的廣泛套用,特別是在電子商務的時代,網站沒有用到套用伺服器的還真是讓我感到奇怪?因為Sevlets技術是套用伺服器的重要組成部分之一,在此簡單提過。