使用Java语言编写CGI程序

公共网关界面(CGI)是一种编程标准,符合标准的程序(CGI程序),通过WEB服务器与 运行WEB浏览器的客户进行交互。这些程序允许WEB开发者通过浏览器传送动态信 息(通常嵌于HT ML中)。CGI程序可用WEB浏览器能运行的任何语言来书写,其中包 括Java。CGI程序通常用于加入搜索机制、客户登记应用程序、数据库查询机制、 交互式用户论坛和其它一些WEB站点的交互式应用程序。   CGI程序必须解释发送给它的信息,并以某种方式处理这些信息,生成相应结果 回送给客户。   CGI规定了一组标准的环境变量和参数格式,CGI程序的绝大多数输入通过环境 变量传入程序内部。本文将演示如何把环境变量传递给一个Java程序。除环境变 量之外的输入作为标准输入可直接被程序读取。   CGI程序的处理过程可能很简单,也可能象从一个数据库中请求数据那么复杂 。这由具体处理需要而定。   CGI程序可以返回多种类型的文档。因此必须在输出内容中放置一个短的文档 头(HEADE R)(ASCII码文本),使客户知道该如何解释它生成的信息。CGI程序最常 生成的是HTML文档。生成文档头之后,CGI程序以它的本机格式生成输出中的体(B ODY)。在下文中我们将使用一个预先编制的Java库,它包含生成HTML文档头的方法 header()。   一、将CGI环境变量传递给Java程序   编写CGI Java程序较为容易。首先Java程序需要包在另一个脚本中运行。实 际嵌入服务器的脚本将是能把环境变量传入Java程序的UNIX外壳脚本或Windows批 处理文件。   由于Java不再提供直接访问环境变量的方法(最新的JDK版本取消system.get env()方法),因此,建议使用Java解释器的-D命令行参数传递CGI的每个环境变量。 下面将介绍如何使用D参数。   Java使用方法system.getproperty()来访问命令行参数。Java程序需要的任 何一个CGI 环境变量,均可用上述方法来访问。例如,访问server-name环境变量, 可写下行:     string server-name = system.getproperty("cgi.server-name");   下面是一个名为hello.cgi的UNIX脚本文件,它调用名为hello的Java程序。注 意-D命令行参数把CGI环境变量传入Java程序: #!/bin/sh java \ -Dcgi.content-length=$CONTENT-LENGTH \ -Dcgi.request-method=$REQUEST-METHOD \ -Dcgi.query-string=$QUERY-STRING \ -Dcgi.server-name=$SERVER-NAME \ -Dcgi.server-port=$SERVER-PORT \ -Dcgi.script-name=$SCRIPT-NAME \ -Dcgi.path-info=$PATH-INFO \ hello   上述方案不能在Windows 95和Windows NT平台上很好地实现,因为它们在命令 行长度上有限制。但可以把环境变量名及其相关的值写入一个临时文件,然后将该 文件名传递给Java 程序,Java程序读此文件并从中分析出环境变量/值对。   二、JAVA CGI库   为避免重复工作,简化编制程序的过程,可先将一些常用的或固定的处理写成 函数或方法,组成函数库。以后编制CGI程序时,只需考虑主要的处理过程。下文中 使用的方法Header() 和ReadParse假设已在名为cgi-lib.java的函数库中。   三、编制JAVA CGI程序   下面以编制第一节中被hello.cgi调用的hello.java程序为例,说明如何编制 CGI程序。我们将编制一个简单程序来处理"Hello There"格式。它提示用户NAME 和EMAIL地址。要处理的格式(名为hello.html)为:

Hello and Welcome


What is your name?

What is your email address?


  下面开始编制处理"Hello There"格式的Java CGI程序,它实现与客户的交互 。步骤如下:   1.首先,让客户知道该CGI程序将要生成HTML格式。在cgi-lib.java中方法He ader()将生成所需的字符串,因此,Java程序将调用Header()方法及使用system.o ut.println系统调用打印字符串。 // // 打印所需的CGI头 // system.out.println( cgi-lib.Header( ) );   2.其次,要处理通过浏览器发送来的数据。在cgi-lib.java中ReadParse方法 完成这方面的工作,并回送结果到一个哈希表中。本例中,经分析后哈希表的每项 包括两个关键项值。一个是"name"输入域,另一个是"email"输入域。这两个域的 值即是用户在"Hello There"格式中输入的内容。 // // 分析格式中数据后将其放入哈希表中(HashTable) // Hashtable form-data=cgi-lib.ReadParse(system.in)   3.在分析并获取格式数据后,就可以根据需要处理这些数据。完成所需的处 理后再生成HTML文档回送到用户浏览器。为简单起见,本例将不对这些数据作任何 处理,仅仅把它们回送给发数据的用户。我们将对哈希表对象使用get方法,以选取 格式数据值赋给字符串,供程序使用。下例说明如何选取name的值(由用户键入)给 一个字符串对象。     string name=(str ing)form-data.get("name");   综合以上三步,可以生成一个简单程序,即下述用于处理"Hello There"格式的 Java应用程序(hello.java): import java.util.*; import java.io.*; class hello public static void main( string args[ ]) // // Here is a minimalistic CGI program that uses cgi-li b // // // Print the required CGI header. // system.out.println( cgi-lib.Header( ) ); // // Parse the form data into a Hashtable. // Hashtable form-data=cgi-lib.ReadParse(system.in); // // Create the top of the returned HTML page // string name=(string)form-data.get("name"); system.out.println(cgi-lib.Htmltop("Hello There"+name+ "!")); system.out.println("

Hello There"+name + "!

"); system.out.println("Here are the name/value pairs from the form:"); // // Print the name/value pairs sent from browser. // system.out.println(cgi-lib.Variables(form-data)); // // Print the Environment variables sent in form the un ix script. // system.out.println("Here are the CGIenvironment variab les/value pairs"+ "Passed in form the UNIX script:"); system.out.println( cgi-lib.Environment( ) ); // // Create the Bottom of rturned HTML page to close it cleanly. // system.out.println( cgi-lib.HtmlBot( ) );   四、结论   在初步掌握了用Java编写CGI程序的方法之后,我们可以在自己的Web应用中, 以更为适合的方式开发服务器端的应用程序。同时加深对CGI协议的理解,正是CG I协议为客户浏览器和服务器提供了这种通迅途径,使客户可以和Web服务器进行交 互。
posted @ 2010-01-29 17:55  留心_frankliujava  阅读(3633)  评论(0编辑  收藏  举报