今天,大多数Web站点都采用CGI技术来生成和传递动态内容。CGI是在Web服务器端的一个通用接口,用来调用外部程序进行计数、查询数据库、生成定制的图像,或完成其他任务。
本书讲述了怎么样使用CGI在网站上传递动态内容。在畅销的上一版的基础上,新版进行了完整的更新,以阐述当前与CGI.pm模块和最新版本的Perl相关的技术。本书从解释CGI和底层HTTP协议如何工作开始,迅速转入开发CGI程序的重要细节。
第一章 绪论 \r\n历史 \r\nCGI简介 \r\n可选技术 \r\nWeb服务器的配置 \r\n第二章 HTTP \r\nURLHTTP 浏览器请求 \r\n服务器响应 \r\n代理服务器 \r\n内容协商 \r\n总结\r\n第三章 CGI \r\nCGI环境环境变量 \r\nCGI输出 \r\n示例 \r\n第四章 表单和CGI发送数据到服务器 \r\n表单标签 \r\n解码表单输入 \r\n第五章 CGI.pm \r\n概述 \r\n使用CGI.pm处理输入 \r\n使用CGI.pm生成输出 \r\n生成输出的选择 \r\n处理错误 \r\n第六章 HTML模板 \r\n使用模板的理由 \r\nSSI(Server Side Include)\r\nHTML::Template \r\nEmbperl \r\nMason \r\n第七章 JavaScript \r\n背景 \r\n表单 \r\n数据交换 \r\n书签簿 \r\n第八章 安全性 \r\nWeb安全的重要性 \r\n处理用户输入 \r\n加密 \r\nPerl的taint模式 \r\n数据存储 \r\n小结 \r\n第九章 发送电子邮件 \r\n安全性 \r\n电子邮件地址 \r\nInternet电子邮件的结构\r\nsendmail \r\nmailx和mailPerl邮件处理器 \r\nprocmail \r\n第十章 数据保持 \r\n文本文件 \r\nDBM文件 \r\nSQL简介 \r\nDBI \r\n第十一章 维持状态 \r\n查询字符串和附加路径信息 \r\n隐含字段 \r\n客户端cookie \r\n第十二章 搜索Web服务器 \r\n顺序搜索引擎 \r\n两种改进的顺序搜索引擎 \r\n反索引搜索引擎 \r\n第十三章 动态生成图像 \r\n文件格式 \r\n输出图像数据 \r\n用GD生成PNG \r\n附加的GD模块 \r\nPerlMagick\r\n第十四章 中间件和XML \r\n与其他服务器进行通信 \r\nXML介绍 DTD \r\n编写XML语法分析程序\r\n从CGI网关到XML中间件\r\n第十五章 调试CGI应用程序常见错误 \r\nPerl编码技巧 \r\n调试工具 \r\n第十六章 CGI应用程序编程指南 \r\n结构指南 \r\n编码指南 \r\n第十七章 效率和优化 \r\n十条基本的Perl提示 \r\nFastCGI mod_Perl \r\n附录一 参考书籍和相关读物\r\n附录二 Perl模块 词汇表
本书的第一版早在1996年就出版了. 那时的网络与现在的网络大不相同:网络主机的数目只有100000, 而Netscape Navigator 2. 0(第一个支持JavaScript的浏览器)才刚刚发行, 同时Java只有不到一年的历史, 并且主要用于编写applet(Java小程序). 那时的Web还很年轻, 但发展很快.
在1996年, CGI是唯一一种能在网页上生成动态内容的方法, 它稳定而且易于理解. 然而, 很少有网站能充分发挥出它的全部潜能. Shishir在第一版中写到:
当今的计算机用户希望对其感兴趣的问题能有专门的解答. 人们满意于计算机中心的工作人员给所有用户分发单一. 通用报表的日子已经一去不复返了. 取而代之的是, 每个售货员. 管理者和工程技术人员都想输入特定的查询并且得到及时的回复. 如果一台单独的计算机能做到这一点, 为什么网络做不到?
这就是CGI的承诺. 用户能像专门的工作人员所要求的那样, 使用漂亮的饼图或曲线图来按月显示某一特定商品的销售情况, 能够使消费者输入关键字来寻找关于商品的信息.
在1996年, 这些只是大胆的设想. 而今天, 它们用来描述商业事务已经是稀松平常的事情. CGI的承诺被完全实现了.
这本书不只涉及到编写CGI脚本, 它也涉及了Web编程. 虽然我们着重讨论使用Perl进行CGI编程(所以这一版改变了书名)这一专题, 但我们涉及的许多概念对所有服务器端的web开发是通用的. 即使读者将来使用其他技术进行开发工作, 现在学习CGI也会受益非浅.
本书内容
因为CGI在最近的几年里有了巨大的改变, 所以反映这些改变就成了本书唯一正确的选择. 因此, 本书的大部分内容写的都是新主题, 包括CGI. pm. HTML模板. 安全性. JavaScript. XML. 搜索引擎. 风格建议以及与CGI兼容的. 高效的替代技术. 以前的主题, 例如会话变量管理. Email. 动态图像和关系数据库, 我们进行了扩充和更新. 最后, 我们更改了CGI的叙述方式, 以讨论HTTP(Web的底层语言)作为开始. 对HTTP的理解将会有助于更加深入地了解CGI.
尽管有了这些改变, 本书的初衷仍然保持未变:教给读者所需要知道的一切东西, 使读者能够成为一个优秀的CGI开发者. 这不是一本通过范例进行学习的书——它并不是围绕着大量CGI脚本进行讨论, 并阐述每一个脚本是如何执行的. 对于CGI来说, 已经有很多类似的书可读. 这些书当然是很有用的, 尤其当其中的某一个范例对应着读者正面临的实际困难的时候更有用, 但是, 它们通常只告诉读者“怎么做”而没有解释“为什么”. 这本书的目的就是:通过阐述基本的原理使读者能够编写CGI脚本并且能够解决任何困难. 不过, 读者不用担心, 我们仍将看到很多范例. 但是, 我们的范例是为了演示阐述过程, 而不是为了其他目的.
首先要承认的是这本书侧重于Unix平台. Perl和CGI都是最先从Unix平台转化而来, 因此Unix仍然是进行Perl和CGI开发的最流行的平台. 当然, Perl和CGl支持很多其他的平台, 其中包括微软公司广为流行的32位Windows系统:Windows 95. Windows 98. Windows NT和Windows 2000(此后统称为Win32). 就全书而言, 我们将着眼于Unix平台, 但是我们也会指出那些在非Unix兼容系统上进行开发所需要注意的问题.
我们使用Apache Web服务器实现了全部范例. 这有以下几个原因:它是当前最流行的Web服务器, 可用于大多数平台, 另外它是免费的开源软件, 并且还支持许多模块(例如mod_perl和mod_fastcgi). 这些特性都增强了Perl在进行Web开发时的能力和性能.
读者需知
读者应该已经适应了Perl. 虽然本书第一版涉及了其他编程语言, 但是这一版只集中在Perl上. CGI广泛支持不同的编程语言, 但Perl肯定是首选.
如果读者还不了解Perl, 那么由Randal Schwartz和Tom Christiansen编写的《Learning Perl》第二版(O'Reilly公司出版)将是一个比较好的入门教材(译注1). 一旦读者掌握了基本知识, 我们强烈推荐读者买一本《Programming Perl》第三版(是深受喜爱的骆驼图书), 它由Larry Wall, Tom Christiansen和Jon Orwant编写(O'Reilly公司出版), 是各地Perl开发者所使用的权威参考书. 在附录一中列出了更多的Perl资料.
我们将会论述很多从Comprehensive Perl Archive Network(也就是综合Perl文档网络)得来的模块. 如果读者从前未曾从CPAN下载和安装过模块, 请参考附录二.
读者也应该熟悉严Perldoc, 它是浏览Perl文件的最好工具. perldoc十分有用, 有以下两个理由. 第一, 它能使用户方便地打开Perl编写的大量文件. 第二, 对于读者学习使用从CPAN下载的模块是必需的. perldoc在附录二中也有介绍.
本书结构
第一章概述了CGI, 包括它的历史. Web服务器配置和一个CGI脚本的范例.
第二章到第四章讲述了CGI的基础. 我们从HTTP的慨述开始着手, 然后看看怎样在它上面构建CGI程序, 最后讲解HTML表单, 这是传递信息给CGI脚本的通用方法.
第五章到第六章介绍了几个常用的模块, 可用来帮助我们更加容易地编写CGI脚本. 也比较了几种不同的生成动态HTML输出的技术.
第七章讲述JavaScript这种不同的技术如何与CGI脚本结合使用, 从而生成功能更为强大的方法.
第八章到第十三章给出了CGI脚本通常遇到的难题和任务及其解决方法. 这些章节包括一些常见主题, 例如在线的安全性. 存储永久数据和跨页面跟踪用户信息, 还包括一些其他的专题, 如发送Email. 允许用户搜索你的站点和创建动态图像.
第十四章介绍中间件和XML, 它们使读者的CGI脚本能够提供一个到其他信息服务器的接口.
第十五章到十七章通过讲解调试CGI脚本的方法以及指导用户编写良好的代码, 来阐述怎样编写更好的CGI脚本. 另外我们还讨论了如何提高系统的性能.
本书还包括两个附录, 其中的一个附录给读者提供了更多关于CGI信息的资源列表和关于从CPAN下载代码的信息.
排版约定
等宽字体(Constant Width)
用作HTTP首部. 状态码. MIME内容类型. 配置文件中的指令(directive). 数组. 操作符. 变量名(范例中的除外)和计算机的文本输出.
斜体(Italic)
用作文件名. 路径名. 新闻组名. 术语第一次介绍时. 命令. 选项/按钮. 程序名. 子程序名. 函数. 方法和主机名.
大写字母(ALL CAPS)
用作环境变量. HTML属性和HTML标签(在尖括弧<>内的内容).
建议与评论
本书的内容都经过测试, 尽管我们做了最大的努力, 但错误和疏忽仍然是在所难免的. 如果你发现有什么错误, 或者是对将来的版本有什么建议, 请通过下面的地址告诉我们:
美国:
O'Reilly&Associates, Inc.
101 Morris Street
Sebastopol, CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司
询问技术问题或对本书的评论, 请发电子邮件到:
info⑥mail. oreillv. com. cn
如果要寻求技术支持或对本书作出评论, 请发电子邮件到:
bookquestions@oreilly.com
我们为本书设立了一个站点, 在那里我们列出了范例. 勘误表以及对未来版本的一些计划. 读者可通过下面这个地址进入这个站点:
http://www.oreilly.com/catalog/cgi2/
最后, 你可以在WWW上找到我们:
http://www.oreilly.com
http://www.oreilly.com.cn