WebSphere Application Server作為e-Business應用的核心,提供了基於Java Servlet技術的引擎,它把基本的HTTP Server擴充成為基於Java的應用服務器,提供了比CGI技術更優的性能。本文旨在對Java Servlet技術作一般性的介紹,並與傳統的CGI技術進行比較。
Servlet是用Java編寫的Server端程序,它與協議和平台無關。Servlet運行於Java-enabled Web Server中。Java Servlet可以動態地擴展Server的能力,並采用請求-響應模式提供Web服務。
最早支持Servlet技術的是JavaSoft的Java Web Server。此後,一些其它的基於Java的Web Server開始支持標准的Servlet API。Servlet的主要功能在於交互式地浏覽和修改數據,生成動態Web內容。這個過程為:
客戶端發送請求至服務器端;
服務器將請求信息發送至Servlet;
Servlet生成響應內容並將其傳給Server。響應內容動態生成,通常取決於客戶端的請求;
服務器將響應返回給客戶端。
Servlet看起來像是通常的Java程序。Servlet導入特定的屬於Java Servlet API的包。因為是對象字節碼,可動態地從網絡加載,可以說Servlet對Server就如同Applet對ClIEnt一樣,但是,由於Servlet運行於Server中,它們並不需要一個圖形用戶界面。從這個角度講,Servlet也被稱為Faceless Object。
Servlet的優勢
Java Servlet提供了許多優勢:
Servlet可以和其他資源(文件、數據庫、Applet、Java應用程序等)交互,以生成返回給客戶端的響應內容。如果需要,還可以保存請求-響應過程中的信息。
采用Servlet,服務器可以完全授權對本地資源的訪問(如數據庫),並且Servlet自身將會控制外部用戶的訪問數量及訪問性質。
Servlet可以是其它服務的客戶端程序,例如,它們可以用於分布式的應用系統中。
可以從本地硬盤,或者通過網絡從遠端硬盤激活Servlet。
Servlet可被鏈接(chain)。一個Servlet可以調用另一個或一系列Servlet,即成為它的客戶端。
采用Servlet Tag技術,可以在Html頁面中動態調用Servlet。
Servlet API與協議無關。它並不對傳遞它的協議有任何假設。
像所有的Java程序一樣,Servlet擁有面向對象Java語言的所有優勢。
Servlet與CGI-BIN
概括來講,Servlet可以完成和CGI相同的功能。
CGI應用開發比較困難,因為它要求程序員有處理參數傳遞的知識,這不是一種通用的技能。CGI不可移植,為某一特定平台編寫的CGI應用只能運行於這一環境中。每一個CGI應用存在於一個由客戶端請求激活的進程中,並且在請求被服務後被卸載。這種模式將引起很高的內存、CPU開銷,而且在同一進程中不能服務多個客戶。
Servlet提供了Java應用程序的所有優勢――可移植、穩健、易開發。使用Servlet Tag技術,Servlet能夠生成嵌於靜態Html頁面中的動態內容。
Servlet對CGI的最主要優勢在於一個Servlet被客戶端發送的第一個請求激活,然後它將繼續運行於後台,等待以後的請求。每個請求將生成一個新的線程,而不是一個完整的進程。多個客戶能夠在同一個進程中同時得到服務。一般來說,Servlet進程只是在Web Server卸載時被卸載。
Servlet生命周期
Servlet的生命周期可以被歸納為以下幾點:
裝載Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet(1);
Server創建一個Servlet的實例(2);
Server調用Servlet的init()方法(3);
一個客戶端的請求到達Server(1);
Server創建一個請求對象(4);
Server創建一個響應對象(5);
Server激活Servlet的service()方法(6),傳遞請求(7)和響應(8)對象作為參數;
service()方法獲得關於請求對象的信息,處理請求,訪問其他資源(9),獲得需要的信息(10);
service()方法使用響應對象的方法,將響應傳回Server(11)、(12),最終到達客戶端(13)。service()方法可能激活其它方法以處理請求,如doGet()或doPost()或程序員自己開發的新的方法;
對於更多的客戶端請求,Server創建新的請求和響應對象,仍然激活此Servlet的service()方法,將這兩個對象作為參數傳遞給它。如此重復以上的循環,但無需再次調用init()方法。一般Servlet只初始化一次;
當Server不再需要Servlet時(一般當Server關閉時),Server調用Servlet的Destroy()方法。
Servlet與CGI程序的比較
CGI(Common Gateway Interface)程序,主要用Perl、Shell Script或C編寫,能夠向客戶端提供動態內容,即每次客戶端浏覽器訪問某一頁面時,可以看到不同的內容。這裡對完成相同功能的CGI程序和Java Servlet程序作一比較,以便更清楚地看到Servlet的簡單特性。
這裡CGI和Servlet程序的功能均為獲得客戶端在浏覽器表單中輸入的參數(Firstname,Lastname),並將返回給客戶端。相應的CGI程序和Servlet程序分別如下:
CGI程序(Perl):
$query―string=$ENV{?QUERY―STRING?};
$query―string=As/%([dA-Fa-f][dA-Fa-f])/pack(″C″,hex()$1))/eg;$query―string=As/+//g;
@pairs=split(/&/,$query―string);
foreach $pair(@pairs) {
($key,$value)=split(/=/,$pair);
$form―data{$key}=$value;
}
$firstname=$form―data{″firstname″};
$lastname=$form―data{″lastname″};
print ″Hello,$firstname $lastname. Thank you for your visit! ″;
Servlet程序:
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletExeption,IOExeption
{
ServletOutputStreamout=response.getOutputStream();
response.setContentType(″text/Html″);
String firstname=request.getParameter(″firstname″);
String lastname=request.getParameter(″lastname″);
out.println(″Hello,″+firstname+″ ″+lastname+″.″);
out.println(″Thank you for your visit!″);
out.lose()
}
可以很明顯地看到Java Servlet源代碼比相應的CGI Perl Script簡單許多。這裡需要導入三個package:javax.servlet、javax.servlet.http和Java.io。定義Servlet的類擴展了HttpServlet class,而不是GenericServlet class,因為此Servlet需要與Html form進行交互。
在CGI程序中有很大一部分用於處理對參數的提取和解碼過程,而在Servlet程序中,解碼傳遞的參數部分並不需要額外編寫。從HttpServlet class繼承來的基本函數可以自動完成解碼的過程。因此,程序員可以在Servlet service()方法中直接獲取由客戶端創建和編碼的Key-value對。解碼後的Key-value對可以直接從HttpServlet class的service()方法的第一個參數中獲得。這將極大地減少程序員的勞動量和重復的代碼勞動,並降低編碼難度。
綜上所述,Servlet在性能、編寫難度、可移植性等方面比CGI有明顯優勢。在WebSphere Application Server中提供了功能強大的Servlet API,它們比JSDK擁有更多的功能和更優的性能,為Servlet的編程提供了很好的支持。隨著WAS的日益推廣和Java技術的普及,可以預見,Servlet技術將取代CGI,成為對Web Server功能擴充的標准技術。