国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Servlet技術(shù)及其與CGI的比較

2019-11-18 15:08:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  WebSphere application Server作為e-Business應(yīng)用的核心,提供了基于java Servlet技術(shù)的引擎,它把基本的HTTP Server擴(kuò)充成為基于Java的應(yīng)用服務(wù)器,提供了比CGI技術(shù)更優(yōu)的性能。本文旨在對(duì)Java Servlet技術(shù)作一般性的介紹,并與傳統(tǒng)的CGI技術(shù)進(jìn)行比較。
  Servlet是用Java編寫的Server端程序,它與協(xié)議和平臺(tái)無(wú)關(guān)。Servlet運(yùn)行于Java-enabled Web Server中。Java Servlet可以動(dòng)態(tài)地?cái)U(kuò)展Server的能力,并采用請(qǐng)求-響應(yīng)模式提供Web服務(wù)。

  最早支持Servlet技術(shù)的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web Server開始支持標(biāo)準(zhǔn)的Servlet API。Servlet的主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。這個(gè)過程為:

  ?客戶端發(fā)送請(qǐng)求至服務(wù)器端;

  ?服務(wù)器將請(qǐng)求信息發(fā)送至Servlet;

  ?Servlet生成響應(yīng)內(nèi)容并將其傳給Server。響應(yīng)內(nèi)容動(dòng)態(tài)生成,通常取決于客戶端的請(qǐng)求;

  ?服務(wù)器將響應(yīng)返回給客戶端。

  Servlet看起來(lái)像是通常的Java程序。Servlet導(dǎo)入特定的屬于Java Servlet API的包。因?yàn)槭菍?duì)象字節(jié)碼,可動(dòng)態(tài)地從網(wǎng)絡(luò)加載,可以說(shuō)Servlet對(duì)Server就如同Applet對(duì)Client一樣,但是,由于Servlet運(yùn)行于Server中,它們并不需要一個(gè)圖形用戶界面。從這個(gè)角度講,Servlet也被稱為Faceless Object。

  Servlet的優(yōu)勢(shì)

  Java Servlet提供了許多優(yōu)勢(shì):

  ?Servlet可以和其他資源(文件、數(shù)據(jù)庫(kù)、Applet、Java應(yīng)用程序等)交互,以生成返回給客戶端的響應(yīng)內(nèi)容。假如需要,還可以保存請(qǐng)求-響應(yīng)過程中的信息。

  ?采用Servlet,服務(wù)器可以完全授權(quán)對(duì)本地資源的訪問(如數(shù)據(jù)庫(kù)),并且Servlet自身將會(huì)控制外部用戶的訪問數(shù)量及訪問性質(zhì)。

  ?Servlet可以是其它服務(wù)的客戶端程序,例如,它們可以用于分布式的應(yīng)用系統(tǒng)中。

  ?可以從本地硬盤,或者通過網(wǎng)絡(luò)從遠(yuǎn)端硬盤激活Servlet。

  ?Servlet可被鏈接(chain)。一個(gè)Servlet可以調(diào)用另一個(gè)或一系列Servlet,即成為它的客戶端。

  ?采用Servlet Tag技術(shù),可以在Html頁(yè)面中動(dòng)態(tài)調(diào)用Servlet。

  ?Servlet API與協(xié)議無(wú)關(guān)。它并不對(duì)傳遞它的協(xié)議有任何假設(shè)。

  ?像所有的Java程序一樣,Servlet擁有面向?qū)ο驤ava語(yǔ)言的所有優(yōu)勢(shì)。

  Servlet與CGI-BIN

  概括來(lái)講,Servlet可以完成和CGI相同的功能。

  CGI應(yīng)用開發(fā)比較困難,因?yàn)樗蟪绦騿T有處理參數(shù)傳遞的知識(shí),這不是一種通用的技能。CGI不可移植,為某一特定平臺(tái)編寫的CGI應(yīng)用只能運(yùn)行于這一環(huán)境中。每一個(gè)CGI應(yīng)用存在于一個(gè)由客戶端請(qǐng)求激活的進(jìn)程中,并且在請(qǐng)求被服務(wù)后被卸載。這種模式將引起很高的內(nèi)存、CPU開銷,而且在同一進(jìn)程中不能服務(wù)多個(gè)客戶。

  Servlet提供了Java應(yīng)用程序的所有優(yōu)勢(shì)??可移植、穩(wěn)健、易開發(fā)。使用Servlet Tag技術(shù),Servlet能夠生成嵌于靜態(tài)HTML頁(yè)面中的動(dòng)態(tài)內(nèi)容。

  Servlet對(duì)CGI的最主要優(yōu)勢(shì)在于一個(gè)Servlet被客戶端發(fā)送的第一個(gè)請(qǐng)求激活,然后它將繼續(xù)運(yùn)行于后臺(tái),等待以后的請(qǐng)求。每個(gè)請(qǐng)求將生成一個(gè)新的線程,而不是一個(gè)完整的進(jìn)程。多個(gè)客戶能夠在同一個(gè)進(jìn)程中同時(shí)得到服務(wù)。一般來(lái)說(shuō),Servlet進(jìn)程只是在Web Server卸載時(shí)被卸載。(見圖1)

  圖1 Servlet運(yùn)行模式

  圖2 Servlet生命周期

  Servlet生命周期

  Servlet的生命周期(見圖2)可以被歸納為以下幾點(diǎn):

  ?裝載Servlet。這項(xiàng)操作一般是動(dòng)態(tài)執(zhí)行的。然而,Server通常會(huì)提供一個(gè)治理的選項(xiàng),用于在Server啟動(dòng)時(shí)強(qiáng)制裝載和初始化特定的Servlet(1);

  ?Server創(chuàng)建一個(gè)Servlet的實(shí)例(2);

  ?Server調(diào)用Servlet的init()方法(3);

  ?一個(gè)客戶端的請(qǐng)求到達(dá)Server(1);

  ?Server創(chuàng)建一個(gè)請(qǐng)求對(duì)象(4);

  ?Server創(chuàng)建一個(gè)響應(yīng)對(duì)象(5);

  ?Server激活Servlet的service()方法(6),傳遞請(qǐng)求(7)和響應(yīng)(8)對(duì)象作為參數(shù);

  ?service()方法獲得關(guān)于請(qǐng)求對(duì)象的信息,處理請(qǐng)求,訪問其他資源(9),獲得需要的信息(10);

  ?service()方法使用響應(yīng)對(duì)象的方法,將響應(yīng)傳回Server(11)、(12),最終到達(dá)客戶端(13)。service()方法可能激活其它方法以處理請(qǐng)求,如doGet()或doPost()或程序員自己開發(fā)的新的方法;

  ?對(duì)于更多的客戶端請(qǐng)求,Server創(chuàng)建新的請(qǐng)求和響應(yīng)對(duì)象,仍然激活此Servlet的service()方法,將這兩個(gè)對(duì)象作為參數(shù)傳遞給它。如此重復(fù)以上的循環(huán),但無(wú)需再次調(diào)用init()方法。一般Servlet只初始化一次;

  ?當(dāng)Server不再需要Servlet時(shí)(一般當(dāng)Server關(guān)閉時(shí)),Server調(diào)用Servlet的Destroy()方法。

  Servlet與CGI程序的比較

  CGI(Common Gateway Interface)程序,主要用Perl、Shell Script或C編寫,能夠向客戶端提供動(dòng)態(tài)內(nèi)容,即每次客戶端瀏覽器訪問某一頁(yè)面時(shí),可以看到不同的內(nèi)容。這里對(duì)完成相同功能的CGI程序和Java Servlet程序作一比較,以便更清楚地看到Servlet的簡(jiǎn)單特性。

  這里CGI和Servlet程序的功能均為獲得客戶端在瀏覽器表單中輸入的參數(shù)(Firstname,Lastname),并將返回給客戶端。相應(yīng)的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源代碼比相應(yīng)的CGI Perl Script簡(jiǎn)單許多。這里需要導(dǎo)入三個(gè)package:javax.servlet、javax.servlet.http和java.io。定義Servlet的類擴(kuò)展了HttpServlet class,而不是GenericServlet class,因?yàn)榇薙ervlet需要與HTML form進(jìn)行交互。

  在CGI程序中有很大一部分用于處理對(duì)參數(shù)的提取和解碼過程,而在Servlet程序中,解碼傳遞的參數(shù)部分并不需要額外編寫。從HttpServlet class繼續(xù)來(lái)的基本函數(shù)可以自動(dòng)完成解碼的過程。因此,程序員可以在Servlet service()方法中直接獲取由客戶端創(chuàng)建和編碼的Key-value對(duì)。解碼后的Key-value對(duì)可以直接從HttpServlet class的service()方法的第一個(gè)參數(shù)中獲得。這將極大地減少程序員的勞動(dòng)量和重復(fù)的代碼勞動(dòng),并降低編碼難度。

  綜上所述,Servlet在性能、編寫難度、可移植性等方面比CGI有明顯優(yōu)勢(shì)。在WebSphere Application Server中提供了功能強(qiáng)大的Servlet API,它們比JSDK擁有更多的功能和更優(yōu)的性能,為Servlet的編程提供了很好的支持。隨著WAS的日益推廣和Java技術(shù)的普及,可以預(yù)見,Servlet技術(shù)將取代CGI,成為對(duì)Web Server功能擴(kuò)充的標(biāo)準(zhǔn)技術(shù)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河曲县| 郴州市| 台州市| 渑池县| 错那县| 枣强县| 红原县| 昌都县| 汝阳县| 宣汉县| 兴业县| 远安县| 中牟县| 缙云县| 曲水县| 溆浦县| 霞浦县| 甘孜| 安宁市| 濮阳县| 科技| 玛沁县| 六安市| 团风县| 梓潼县| 彰化市| 邢台市| 临沭县| 西昌市| 大邑县| 遵义县| 自治县| 黔西县| 文昌市| 福州市| 乡宁县| 兴安县| 望江县| 广东省| 达州市| 文安县|