![]() 新的网站设计人员在建立网站之后经常问到一个问题就是:“什么是CGI脚本,如何在我的网站上使用它?”或“如何在我的网站上创建交互式表单?”。 在本文中,我们将回答有关CGI脚本的问题,并演示如何创建自己的脚本。 在此过程中,您还将了解有关Web服务器的一些知识。让我们开始吧! Web服务器 如Web服务器工作原理一文中所述,Web服务器相当简单。从根本上说,Web服务器只是从磁盘中检索出文件,并通过网络将其发送到发出请求的浏览器。假设您键入URL:http://www./books/tg2rw/author.htm。Web服务器将会获得一个针对文件/books/tg2rw/author.htm的请求。查看下图,您可以了解服务器是如何解决该请求的:
在安装过程中,Web服务器已被告知c:My Documentswww是服务器的根目录。然后,该服务器会从根目录中找出/books/tg2rw/author.htm。当您请求URL http://www./books/tg2rw/时,该服务器就会知道您正在查找该目录的默认文件。它会查找一些不同的文件名以试图找到默认文件:index.html、index.htm、default.html和default.htm。根据服务器的不同,它也可以查找其他文件名。因此,该服务器会将 http://www./books/tg2rw/转换为 http://www./books/tg2rw/index.htm并传送该文件。所有其他文件必须通过明确给出文件名来指定。 这就是所有Web服务器处理静态文件的方式。大多数Web服务器还可以通过称作通用网关接口(CGI)的机制处理动态文件。您已经在Web上的各种地方看到过CGI,只不过您当时可能对它并不了解。例如:
所有这些动态页面使用的都是CGI。 CGI机制 在大多数Web服务器上,通过以下方式使CGI机制标准化。在服务器视为根目录的普通目录树中,可以创建一个名为cgi-bin的子目录。(可以在上一页的图示中查看此目录。)然后,服务器了解到不应只是读取和发送从特殊cgi-bin目录中请求的任何文件,而应执行它们。执行的程序的输出内容是它实际发送给请求该页的浏览器的内容。一般来说,可执行程序既可以是一个纯可执行程序(就像C编译器的输出),也可以是一个PERL脚本。PERL是一种用于CGI脚本的最流行的语言。 假设您在浏览器中键入URL:http://www./cgi-bin/search.pl。由于服务器了解到search.pl位于cgi-bin目录中,因此它会执行search.pl(一个PERL脚本),并将执行的输出内容发送到浏览器。 您可以编写自己的脚本并试验CGI,前提是:
简单的CGI脚本 假定您对cgi-bin目录拥有访问权限(请参阅上一节),了解C编程语言或PERL,则可以使用CGI执行一系列有趣的试验。让我们从创建最简单的CGI脚本开始。 在网页基础知识一文中,我们研究了可能存在的最简单的HTML网页。这个网页的形式如下: 这个可能存在的最简单的CGI脚本在执行时,将会创建上述的简单的静态页面作为其输出。以下是用C语言编写此CGI程序的形式: 在Web服务器上,将此程序输入到文件simplest.c中,然后通过以下命令进行编译: (有关如何编译C语言程序的详细信息,请参见C语言入门教程。) 将simplest.cgi放置在cgi-bin目录中,它就可以执行了。您现在就可以通过键入或单击此URL来尝试一下:http://www./cgi-bin/simplest.cgi。您可以看到,该脚本所做的全部工作就是生成显示“Hello there!”的页面。唯一没有预料到的部分就是下面这行内容: “Content-type:text/htmlnn”这行内容是一段特殊的文本,任何CGI脚本必须首先将它发送给浏览器。只要您记住这一点,就一切ok了。如果您忘记了这一点,则浏览器将拒绝输出脚本。 您可以在PERL中执行相同的操作。将下面这段PERL代码键入到一个名为simplest.pl的文件中: 将该文件放置到cgi-bin目录中。在UNIX计算机上,键入以下内容也许会有用: 这将告知UNIX该脚本是可执行的。您现在就可以通过键入或单击此URL来尝试一下:http://www./cgi-bin/simplest.pl。 您现在已经了解了CGI脚本的基本概念。相当简单!实际上就是,执行一个程序,然后将程序的输出发送到调用脚本的浏览器。发送给stdout的正常输出就是发送给浏览器的输出。 不过,CGI脚本的重点在于创建动态内容——每次执行脚本时,输出应该是不同。毕竟,如果每次运行脚本时的输出都是相同的,您也可以使用静态页面。以下C语言程序演示了非常简单的动态内容: 使用一个文本编辑器,将此程序键入到一个名为count.c的文件中。通过键入以下命令对其进行编译: 创建另一个名为count.txt的文本文件,并在其中放入一个零。将counter.cgi和count.txt放置在cgi-bin目录中,即可以运行脚本。您现在就可以通过键入或单击此URL来尝试一下:http://www./cgi-bin/count.cgi。您可以看到,脚本所做的全部工作就是生成一个显示“The current count is:X”的页面。运行一次脚本,其中的X就会递增一次。尝试将脚本运行几次,并注意观察页面内容的变化! count.txt文件保留当前计数,同时小的incrementcount()函数使count.txt文件中的计数递增。此函数将打开count.txt文件、从中读取数字、递增数字并将其写回到文件中。实际上,此函数会尝试打开文件两次。这样做是为了防止两个用户试图同时访问该文件。这项技术并非万无一失,但对于这类简单情况还是有效的。如果在第二次尝试时无法打开文件,则将为调用者返回错误值-1。更加完善的程序将识别返回值-1,并会生成相应的错误提示。
gcc count.c -o count.cgi
HTML表单 我们已了解到CGI脚本的创建过程相当简单。Web服务器执行放置在cgi-bin目录中的任何可执行程序,并且可执行程序发送给 stdout的任何输出都将出现在调用该脚本的浏览器中。现在,我们需要找到一种用于将输入发送到脚本的方法。发送输入的一般方法是使用HTML表单。 表单在网络上随处可见。可以接受内容输入的任何页面都是表单。您可以在搜索引擎、留言簿、问卷等上面看到这些表单。您在HTML页上创建表单,并在表单的HTML标记中指定CGI脚本的名称,当用户单击表单上的Submit按钮时将调用该脚本。用户输入到表单中的值将会进行打包并发送到CGI脚本,这样脚本就可以随意使用这些值。 实际上,上述情况是很常见的,只是您可能没有意识到而已。例如,转到 http://www.,在“Search for:”框中键入“test”一词并按“Go Get It!”按钮。结果页的 URL 类似于下面这样: 您会发现Lycos主页就是一个表单。Lycos在cgi-bin目录中有一个名为pursuit的脚本。表单会向此脚本发送五个参数:
第三个参数正是我们输入的搜索字符串。其他四个参数也为脚本提供了一些信息。CGI脚本在Lycos数据库中查询“test”一词,然后返回结果。这就是任何搜索引擎的核心! 让我们创建一个简单的表单进行试验。创建一个名为simpleform.htm的文件,然后在其中输入以下 HTML: 可以单击此URL进行试验:http://www./simpleform.htm。 您可以看到,HTML代码指定创建一个使用GET方法的表单,并将该方法发送给http://www./cgi-bin/simpleform.cgi上的CGI脚本。该表单内包含一个文本输入区域以及标准的“Submit”和“Reset”按钮。 该表单引用的文件http://www./cgi-bin/simpleform.cgi是一个C程序。它开始是作为一段C代码放置在名为simpleform.c的文件中: 使用以下命令对这段代码进行编译: 然后,将其放置在cgi-bin目录中。此程序只是收集表单发送的值并显示出来。例如,您可能会看到以下内容: Name是表单中的文本输入字段的标识符(表单上的每个输入字段都应具有唯一的标识符),John+Smith是可能在表单上输入的典型姓名。请注意,“+”将替换空白字符。 通过本示例,您可以看出设置表单并将表单中的数据发送到CGI脚本中的基本过程是相当简单的。有几个细节需要注意:
提到QUERY_STRING环境变量,有必要在此大致介绍一下环境变量。您可以在CGI 脚本中看到大量环境变量,其中包括:
这些环境变量中隐藏了许多有用的信息,其中包括输入字符串的长度 (CONTENT_LENGTH)、使用的METHOD(GET 或 POST -- REQUEST_METHOD可让您清楚是在STDIN 中还是在QUERY_STRING中查找输入)、用户计算机的IP地址 (REMOTE_ADDR),等等。有关这些变量的完整说明,请参阅CGI环境变量。 The value entered was:Name=John+Smith gcc simpleform.c -o simpleform.cgi #include http://www./cgi-bin/pursuit?matchmode=and andcat=lycosandquery 创建真实表单 一个真实的表单将包含各种输入区域,并需要在脚本中编写一些代码来撤消字符映射并分析出单个字符串。让我们先看看表单上的标准输入控件。这些控件包括:
以下的一些示例演示了如何使用不同的控件标记: 单行编辑 Enter Name:<input name=andquot;Nameandquot; size=30 maxlength=50 value=andquot;Sampleandquot;> 通常,输入区域的前面是一段静态文本,用于标识输入字段的用途。此处显示的是静态文本“Enter Name:”。 可以添加值“type=int”,以便将输入限制为整数值。默认情况下,值的类型为“text”,可接受任何字符。 多行编辑 <textarea name=andquot;Company Addressandquot; cols=30 rows=4></textarea> 复选框 <input type=checkbox name=andquot;Includeandquot; value=1> 如果选中复选框,则将返回值。 单选按钮 Choose the search area:<br> <input type=radio CHECKED name=universe value=US-STOCK> Stocks <input type=radio name=universe value=CA-STOCK> Canadian Stocks <input type=radio name=universe value=MMF> Money Markets <input type=radio name=universe value=MUTUAL> Mutual Funds 请注意,可以用 CHECKED 一词来标记默认的单选按钮。还请注意,同一组中的所有单选按钮的名称是相同的。 选择列表 Select an Option<br> <SELECT size=2 NAME=andquot;Optionandquot;> <OPTION> Option 1 <OPTION> Option 2 <OPTION> Option 3 <OPTION> Option 4 </SELECT> MULTIPLE 一词将创建多选功能。 专用按钮 <INPUT TYPE=submit value=andquot;Submitandquot;> <INPUT TYPE=reset value=andquot;Resetandquot;> 示例:创建网页问卷 假设您要为某个网页创建一份简单的问卷。例如,您想要询问读者的姓名、性别、年龄和意见,然后在CGI脚本中进行处理。HTML表单可能存在于一个名为http://www./survey.htm的文件中,形式如下: <html> 此表单引用的CGI脚本将接收四条不同的数据:提交表单的读者的姓名、年龄、性别和意见。脚本将对这四个值进行分析并处理所有字符转换。文件http://www./survey.c用于创建脚本survey.cgi,其长度可能为100行。 关于CGI的一些知识 在这个关于CGI脚本的简明教程中,我们已了解到:
|
|
来自: ldjsld > 《电脑手机及电子技术》