程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Servlet技術及其與CGI的比較

Servlet技術及其與CGI的比較

編輯:關於JAVA

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功能擴充的標准技術。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved