使用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 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 and Welcome
下面开始编制处理"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("