公共网关接口(CGI)
如前节所述,Tomcat主要充当servlet/JSP容器,不过它却含有大量的功能可以与传统的 Web服务器相媲美,对公共网关接口(Common Gateway Interface,CGI)的支持就是其中之一。传统的Web服务器为了相应浏览器的请求,提供了运行外挂程序的一种方式, 典型地用于处理基于Web的表单。这种机制叫做CGI。CGI之所以称为通用,是因为它几乎可以调用所有编程或脚本语言:Perl、Python、awk、Unix shell脚本,甚至还可以选 择性地支持Java。实际上,由于启动负荷过载,恷可能不会将Java应用程序当成CGI来 执行;而设计servlet规范的起因就是为了消除这种系统负载过载。Servlet几乎永远都比 CGI高效,因为每次当有人点击链接或按钮时,并不会启动新的操作系统级进程,如欲 了解编写CGI脚本的细节,读者可以自行参考关干网站管理方面的书。
Tomcat包含了一个可选的CGI servlet,以便执行遗留的CGI脚本,前提是假设大多数新 的后端处理都由用户自定义的servlet与JSP来完成。示例2-13为一简单的CGI。
示例2-13:CGI的示例
#! /usr/bin/python # CGI demo之旅 print "content-type: text/html" print "" print "<html><head>Welcome</head>" print "<body><h1>Welcorie to the output of a CGI under Tomcat</h1>" print "<p>The subject says all.</p>" print "</body></html>"
笔者已提过,您几乎可以用任何语言来编写脚本。笔者选择Python作为示例,而第一行有点Unix的味道,用来告诉操作系统要使用何种解释器来处理脚本。在Windows上,文 件名称则必须符合某些样式,以获得相同的效果,头几个语句会打印网页内容 的类型(当然对浏览器有用),并用空行分隔HTTP标题与主体其余的语句则会打印 HTML的内容。这是典型的CGI脚本当然,大多数的CGI脚本也会进行某种表单处理, 不过,这部分内容留给读者做练习。前提是您的CGI脚本已能据此以任意语言运行了。
CGI servlet接受一些init-param元素,以控制其行为。这些元素列于表2-9中。
表2-9: CGI servlet的初始化参数
参数名 | 意义 | 默认值 |
---|---|---|
cgiPathPrefix | 脚本文件的目录 | WEB-INF/cgi |
clientInputTimeout | 放弃读文件输人之前所等待的时间{以毫秒计 input | 100 |
debug | 调试等级 | 0 |
让soviet寻找实际脚本的默认目录是WEB-INF/cgi。如前所述,WEB-INF目录已受到保 护,可防范浏览器的偷窥,因此这是放置CGI脚本的好地方,而这些脚本可能会包含密码或其他机密信息。