服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

servlet技术及其与cgi的比较


  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卸载时被卸载。(见图1)

  图1 servlet运行模式

  图2 servlet生命周期

  servlet生命周期

  servlet的生命周期(见图2)可以被归纳为以下几点:

  ?装载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功能扩充的标准技术。

扫描关注微信公众号