您的位置:首页 > 编程语言 > Java开发

使用Java语言编写CGI程序

2008-05-21 02:52 183 查看
google_ad_client = "pub-8800625213955058";

/* 336x280, 创建于 07-11-21 */

google_ad_slot = "0989131976";

google_ad_width = 336;

google_ad_height = 280;

//

公共网关界面(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!

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服务器进行交

互。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: