WEB开发技术-第四章-CGI编程原理_第1页
WEB开发技术-第四章-CGI编程原理_第2页
WEB开发技术-第四章-CGI编程原理_第3页
WEB开发技术-第四章-CGI编程原理_第4页
WEB开发技术-第四章-CGI编程原理_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章CGI编程原理HTTP原理CGI的基础知识CGI的工作原理CGI编程HTTP概要超文本传输协议HTTP(HypertextTransportProtocol)是Web浏览器与Web服务器之间进行数据传输的应用层通信协议,它建立在TCP/IP协议的基础上,用以传输超文本文档(它是网络上最主要的资源)。2/69基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。HTTP原理3/69HTTP在TCP/IP协议族中的位置TCP/IP模型TCP/IP参考模型是4层结构:网络接口层:也称数据链路层,通常包括操作系统中的设备驱动程序和计算机中的网卡,一起处理与电缆(或其他任何传输媒介)的物理接口细节互联网层:也称网络层,其作用是处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(互联网控制报文协议),以及IGMP协议(互联组管理协议)4/69TCP/IP模型传输层:主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信,UDP则为应用层提供一种低可靠的简单服务。5/69TCP/IP模型应用层:包括所有的高层协议。早期的应用层有远程登录协议(telnet)、文件传输协议(FTP)和简单邮件传输协议(SMTP)等协议。最近几年出现了一些新的应用层协议,如用于将网络中的主机的名字地址映射成网络地址的域名服务(DNS),用于传输网络新闻的协议(NNTP)和用于从WWW网上读取页面信息的超文本传输协议(HTTP)等。6/69HTTP协议基于请求/响应模式(相当于C/S)一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME(多用途的网际邮件扩充协议)信息,包括请求修饰符、客户机信息和可能的内容服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可能的内容7/698/69MIME意为多目的Internet邮件扩展(MultipurposeInternetMailExtensions),它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

常见的MIME类型:

超文本标记语言文本.htm,.html text/html普通文本.txt text/plainRTF文本.rtf application/rtfGIF图形.gif image/gifJPEG图形.ipeg,.jpg image/jpegau声音文件.au audio/basicMIDI音乐文件mid,.midi audio/midi,audio/x-midiRealAudio音乐文件.ra,.ram audio/x-pn-realaudioMPEG文件.mpg,.mpeg video/mpegAVI文件.avi video/x-msvideoGZIP文件.gz application/x-gzipTAR文件.tar application/x-tar

返回9/69富文本格式(RichTextFormat,RTF)是一种文件格式,它使你能在不同的操作系统下的不同的文字处理软件间更换文本文件。比如,你可以在Windows98下用MicrosoftWord创建一个文件,把它存为RTF文件(文件名后缀为“.rtf”),然后你可以将文件发给一个在Windows3.1下使用WordPerfect6.0的人,他是可以打开这个文件阅读它的。(在某些情况下,RTF性能可以被做到文字处理软件中。而在其他情况下可能需要一个独立的阅读器或编辑器。)10/69HTTP工作原理示意图11/69浏览器服务器发出请求返回HTML文档HTTP12/69HTTP原理详解一个客户端应用(如Web浏览器)打开到Web服务器的HTTP端口的一个“套接字”(缺省为80)。

例如:http://localhost:8080/internet4.htmlHTTP规范:Internet工程制定组织(IETF)发布的RFC指定Internet标准。RFC:RequestForComments的简称,是Internet的标准(草案),多是一些技术标准文档,可在/rfc.htm找到。大多数的网络协议最初都是以RFC文档发布的,最终确立为协议。RFC用编号来区分。HTTP的几个重要RFC:

RFC1945

HTTP

1.0

描述

RFC2068

HTTP

1.1

初步描述

RFC2616

HTTP

1.1

标准资源标识符URI(Uniform

Resource

Identifter,URI)1.连接至Web服务器13/69注:1)套接字(Socket)是IP地址和端口的组合,用于进行网络通讯,任何应用程序需要和网络上的其他应用程序进行通信时,必须具有相应的套接字,例如Web站点侦听客户的HTTP请求,那么它就绑定在相应的套接字(IP地址和端口,例如端口为标准的TCP80)上。2)TCP层用端口号来区别不同的会话。用户程序通常使用或多或少的随机产生的端口号,特定的端口号被指派给等待请求的程序。14/69通过连接,客户端写一个ASCII文本请求行,后跟0或多个HTTP头标,一个空行和实现请求的任意数据。一个请求由四个部分组成:请求行、请求头标、空行和请求数据。2.发送HTTP请求1)请求行由三个标记组成:请求方法、请求URI和HTTP版本,它们用空格分隔。

例如:GET/index.htmlHTTP/1.1HOST:两次回车发送请求(用telnet做实验)15/69HTTP规范定义了8种可能的请求方法:GET

检索URI中标识资源的一个简单请求HEAD

与GET方法相同,服务器只返回状态行和头标,并不返回请求文档POST

服务器接受被写入客户端输出流中的数据的请求PUT

服务器保存请求数据作为指定URI新内容的请求DELETE

服务器删除URI中命名的资源的请求OPTIONS

关于服务器支持的请求方法信息的请求TRACE

Web服务器反馈Http请求和其头标的请求CONNECT

已文档化但当前未实现的一个方法,预留做隧道处理16/692)请求头标由“关键字:值”对组成,每行一对,关键字和值用冒号(:)分隔。请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有:

User-Agent

客户端厂家和版本

Accept

客户端可识别的内容类型列表

Content-Length

附加到请求的数据字节数

3)空行最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标。

4)请求数据使用POST传送数据,最常使用的是Content-Type和Content-Length头标。17/69Web服务器解析请求,定位指定资源。服务器将资源副本写至套接字,在此处由客户端读取。一个响应由四个部分组成;状态行、响应头标、空行、响应数据。1)状态行由三个标记组成:HTTP版本、响应代码和响应描述。

HTTP版本:向客户端指明其可理解的最高版本。响应代码:3位的数字代码,指出请求的成功或失败,如果失败则指出原因。HTTP响应码:

1xx:信息,请求收到,继续处理

2xx:成功,行为被成功地接受、理解和采纳

3xx:重定向,为了完成请求,必须进一步执行的动作

4xx:客户端错误响应描述:为响应代码的可读性解释。例如:HTTP/1.1

200

OK3.服务端接受请求并返回HTTP响应18/691)浏览器首先解析状态行,查看表明请求是否成功的状态代码2)然后解析每一个响应头标,头标告知HTML的位置3)读取响应数据HTML,根据HTML的语法和语义对其进行格式化,并在浏览器窗口中显示它4)一个HTML文档可能包含其它需要被载入的资源引用,浏览器识别这些引用,对其它的资源再进行额外的请求,此过程循环多次。2)响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节3)空行:最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标4)响应数据:HTML文档和图像等,也就是HTML本身无状态连接:HTTP模型是无状态的,在处理一个请求时,Web服务器并不记住来自同一客户端的请求。4.服务器关闭连接,浏览器解析响应19/6920/69HTTP的无状态特点HTTP协议的目的:支持超文本的传输支持资源的传输:发送请求和响应请求的过程客户端和服务器谁需要记录?一般而言:一个URL对应着唯一的超文本无论对谁,HTTP服务器都会根据接收到的URL请求返回相同的超文本该唯一性使得记录用户的行为状态变得毫无意义所以,HTTP协议被设计为无状态的连接协议符合它本身的需求。21/69

既然HTTP协议的目的在于支持超文本的传输,更加广义一些就是支持资源的传输,那么在客户端浏览器向HTTP服务器发送请求,继而HTTP服务器将相应的资源发回给客户端这样一个过程中,无论对于客户端还是服务器,都没有必要记录这个过程,因为每一次请求和响应都是相对独立的,就好像你在自动售货机前投下硬币购买商品一样,谁都不会也不需要记住这样一个交易过程。一般而言,一个URL对应着唯一的超文本,而HTTP服务器也绝对公平公正,不管你是Michael,还是Jordon,它都会根据接收到的URL请求返回相同的超文本。正是因为这样的唯一性,使得记录用户的行为状态变得毫无意义CGI的概念及功能CGI是CommonGatewayInterface的缩写,即通用网关接口。它是Web服务器的一部分,是外部扩展程序与WWW服务器交互的一个标准接口。按照CGI标准编写的外部扩展应用程序可以处理客户端输入的需要协同工作的数据,完成客户端与服务器的交互操作。通俗地说,CGI是一个运行在WWW服务器上,提供同客户端HTML页面接口的软件包。CGI的主要功能是在WWW环境下,提供客户端HTML页面接口,使客户与网页作者之间产生互动作用。CGI加入到WWW中,使得WWW的环境不仅有单向的信息浏览,更有双向的信息交流。22/69CGI的基础知识通过CGI,Web服务器可以调用(激活)一个程序,同时将用户提交的数据传给这个程序,随后,又将该程序的响应(输出)返回给浏览器。

23/69CGI的特点及运行环境CGI的特点:CGI程序可以用任何语言编写,可以在任何平台上开发,而且无须做太大的修改就可以在不同的平台间移植。CGI的主要运行环境有:WIN95/98/2000/NT/XP;UNIX;LINUX等。CGI运行的服务器主要有:

IIS;Sambar;ApacheWeb;OmniHTTPd服务器等。24/69CGI的调用方式CGI程序调用方式

1)通过URL直接调用。在浏览器的URL栏里直接写入程序的地址就可以调用该程序。

如:“82/cgi-win/cgiprogram.exe”2)通过交互式主页里的FORM栏调用,通常都是用户在填完一张输入信息主页后按“确认”按钮启动CGI程序。

系统设置1)IIS中要设置CGI目录的属性(XP):我的电脑-管理-服务和应用程序-Internet信息服务-网站-(默认网站)-属性:主目录-执行权限-脚本和可执行文件

2)Win2003:Web服务扩展-CGI扩展(允许)

3)C语言得到的exe文件可能需要把后缀改为”.cgi”25/69CGI的编程语言CGI的编程(脚本)语言有:Perl、TCL;C/C++、VisualBasic;JavaScript、VBScript、VisualJava++、Java;Fortran、Pascal、Delphi等等。解释型脚本语言,是一种不需要预先编译的语言,它完全依赖解释器来完成任务。其语言通俗易学,能够被广泛应用。缺点:因其源代码是ASCII码的文本文件,用户能够看到脚本,所以安全性较差。由于它都是在执行的时候才能进行解释,所以执行效率比较低。(例如Perl和TCL)编译型脚本语言,是一种需要预先编译、能够生成二进制代码的语言。由于其需要编译环境,所以它依赖于具体的操作平台,但是这种语言可以降低因装载解释器造成的服务器负载过量,同时,由于其生成的是二进制代码,所以安全性较高(例如C/C++)26/69解释型脚本语言Perl是近年来使用较广泛的CGI脚本语言之一。其前身是属于UNIX专用的高级语言,本身具有强大的字符串处理能力。Perl最大的特点是可以用在各种OS系统服务器平台上,并且可以免费从Internet网上下载。TCL是正在发展之中的CGI脚本语言,其主要用于Unix系统的服务器上,要求用户懂C语言,基本上可以说TCL是C语言程序的一个库。27/69返回编译型脚本语言C和C++是目前较为流行的CGI脚本语言,其语义简洁、紧凑,使用方便灵活,执行速度快。由于它们的运算符和数据结构丰富,所以它们具有相当强大的功能。C和C++在各种OS服务器平台上都可以移植,特别是C++采用OOP技术,提高程序开发的速度,同时编译型语言较之解释型语言更具有安全性。VisualBasic是MicrosoftWindow3.X/95/NT上的编程语言,VB用于CGI脚本的最大一特点是提供一个世界上最大的对象库,并且提供OLE对象链接和嵌入技术,所以VB是仅次于Perl的用于CGI脚本的语言。但VB最大的限制性是其设计的CGI脚本只可运行在基于Window系统的服务器平台上。28/69返回新式编译型脚本语言Java编程语言是由SunMicrosystem公司推行的,是现代国际互连网上的新生儿,Java的目标是改变用于HTML和Web服务器的交互性,另外Java程序实际上运行在客户端的浏览器中(IE/Netscape),通过由客户机和服务器共同分担数据处理的工作量,使得用Java开发的CGI脚本程序给服务器带来了负荷的解放。Java的另一个特点是不依赖于OS系统和硬件平台,Java编程语言开发CGI的局限性主要在于并非网上所有的游览器都支持JVM技术。JavaScript是Netscape公司推出的CGI脚本程序的补充,JavaScript小巧、跨不同平台,它基本上基于Java,可以看成是Java伴侣脚本语言,但其局限性是能运作在客户端的浏览器中。VBScript是VB在Web上应用的进一步发展,OLE技术的支持是VBScript的优点,这为CGI程序直接链接到客户端上的Window应用程序提供了方便,局限性只能在Window系统平台上。VisualJava++是Microsoft公司于1996年推出的一个能够帮助用户创建客户和服务器端的强大软体开发语言工具,它可以用于Internet上编写网上操作系统软件。29/69CGI与PHP、ASP的比较(一)30/69程序接口CGIPHPASP操作系统均可均可win32Web服务器均可数种IIS、PWS执行效率慢快快稳定性最高佳中等系统安全最佳佳极差函数支持一般多少网页结合一般佳佳编程语言多phpVB、JavaScriptCGI与PHP、ASP的比较(二)程序接口CGIPHPASP开发难度较高低低开发时间中等短短移植性最好好差使用站点最多多多31/69CGI的工作原理当客户端的用户完成了一定输入工作后,向服务器发出HTTP请求(称为CGI请求①)。服务器守护进程接受到该请求后,就创建一个子进程(称为CGI进程

②),该CGI子进程将CGI的有关数据设置成环境变量③

。CGI子进程在外部CGI程序与服务器间建立两条数据通道:标准I/O④

,然后启动URL指定的CGI程序

⑤,与该子进程保持同步,以检测CGI程序的执行状态。子进程通过标准输出流将处理结果传递给服务器守护进程⑥,守护进程再将处理结果作为应答信息回送给客户端。CGI程序通过环境变量、命令行参数、标准输入输出与WWW服务器进行通信。CGI两种调用方式--都要用HTTP请求--HTTP协议工作过程一致为什么要设置环境变量:为了通信32/69CGI工作原理示意图33/69浏览器服务器CGI程序⑤其他程序或DB发出请求①返回格式文档生成HTML文件⑥执行程序调用系统中的其他程序返回结果HTTPCGICGI进程

②环境变量③标准I/O④1.当客户端的用户完成了一定输入工作后,向服务器发出HTTP请求(称为CGI请求①)。2.服务器守护进程接受到该请求后,就创建一个子进程(称为CGI进程

②),该CGI子进程将CGI的有关数据设置成环境变量③

。3.CGI子进程在外部CGI程序与服务器间建立两条数据通道:标准I/O④

,然后启动URL指定的CGI程序

⑤,与该子进程保持同步,以检测CGI程序的执行状态。4.子进程通过标准输出流将处理结果传递给服务器守护进程⑥,守护进程再将处理结果作为应答信息回送给客户端。34/69CGI的方法CGI方法是指调用主机应用程序(简称CGI程序)时,Web服务器向其传递数据的方法和途径。主要采用的方法为GET和

POST无论是采用GET方法还是采用POST方法,CGI程序均通过标准输出STDOUT返回结果信息。最简单的CGI程序--例一,例二*程序中第一条标准输出语句告诉服务器传输内容的MIME类型,

TEXT类型是指文本类型,包括Plaintext(纯文本文件)、HTML文件*在VS2005中写最简单的CGI应用程序:文件-新建项目-VisualC++-win32控制台应用程序;编译;将生成的exe文件拷贝到wwwroot下相关的目录下35/69例1的cgi程序名为E:\SHU\JXiedir\教学\web开发技术\PPT\Chap4\CSource\consoletry\consoletry\consoletry,演示建立项目和编译应该对Wwwroot目录具有完全控制权限:1.打开我的电脑选择工具-文件夹选项-查看-在高级设置下找到使用简单文件共享取消打钩;2.再右键单击你想要打开的文件夹-属性-安全-看看组和用户名称下面有没有你当前登录的用户名如果没有就点添加输入你当前登录的用户名点确定选中刚才添加的用户名带下面把完全控制打钩再点确定(简单的办法是,添加所有用户的完全控制权限)36/69GET方法:数据的传送:将数据附加在URL信息上传送给WEB服务器,中间用“?”隔开,如:/cgi-bin/hello.exe?data,例数据的存储:服务器处理该请求时,将调用由URL所指明的CGI程序而将“?”之后的数据信息存入环境变量QUERY_STRING之中。数据的获取:CGI程序需从QUERY_STRING环境变量中以字符串的形式获取所需的数据。当传输的数据不太长(小于1024个字符)时,可采用GET方法。POST方法数据的传送:Web服务器通过标准输入(STDIN)将Form的输入信息进行包装,向CGI程序传输数据,而不是附加在Action所设定的URL之后。数据的读取:CGI程序从标准输入(STDIN)实际读取数据数据的长度在环境变量Content-Length中指明(Web服务器通过STDIN向CGI程序传输数据时,往往不在最后使用EOF结束标记)。当发送的数据要改变服务器上的数据或者想给CGI程序传递的数据很大(超过1024字节)时,用这种方法。37/69Web服务器通过STDIN向CGI程序传输数据时,往往不在最后使用EOF结束标记,因此,为了正确地读取STDIN,CGI应该使用CONTENT_LENGTH的值。38/69CGI实现交互式操作的方式基于文件(很少使用)使用FORMCGI传送的数据从哪里来?39/69基于文件基于文件的操作是由运行CGI程序而产生HTML的文件,在这种文件的语句中嵌入<ISINDEX>标识,其使用方法如下:

<ISINDEXACTION=“URL”>其中URL为需要执行的CGI程序所在的路径。在HTML文档中使用该语句将产生一个输入的窗口,让用户输入。用户输入的值作为查询字符串发给服务器,再次激活CGI程序,得到查询结果。

ISINDEX常常用在广域信息服务系统(WAIS)或用作档案的搜索。但在CGI应用中很少使用这种形式。40/69表单(FORM)HTML中的Form表单主要是为用户在屏幕上建立一张表格,表格中有明确的文字提示,使用户可以在表格上输入自己的信息,然后使用提交按纽,将用户的查询条件传送给服务器。表单是HTML文档的一部分,用于搜集用户信息表单没有处理数据的能力输入的信息将提交给Web服务器Web服务器上的CGI程序处理数据(存入数据文件/返回特定的信息)Form中的HTML代码要完成两件事:一是要指出CGI的路径和名称;二是将用户输入的信息传递给CGI。<FORM>标记的属性中最常用的是“ACTION”和“METHOD”。

“ACTION”指出要调用的CGI程序的URL地址。“METHOD”主要有“GET”(缺省值)和“POST”两种方法。41/69FORM表单的基本格式<FORMACTION="URL"METHOD="GET|POST">

表单元素(1)表单元素(2)表单元素(3)

......

</FORM>

42/69表单处理程序(即CGI程序)的URL地址。说明请求的CGI方法缺省设置,此时客户数据用问号附加于指定URL之后FORM表单的表单元素表单元素多数由<INPUT>标签引入。根据其属性“TYPE”的不同取值,可以引入不同的表单元素:

元素名

元素类型(TYPE)

单行文本输入框

TEXT(TEXTFIELD)或PASSWORD

复选框

CHECKBOX

单选框

RADIO

提交按钮

SUBMIT

重置按钮

RESET

文件上传

FILE<SELECT>标签引入选择列表<TEXTAREA>标签引入多行文本输入框43/69单行文本输入框基本格式:

<INPUT

TYPE=TEXT或PASSWORD

NAME="text_id"

[MAXLENGTH=n1]

[SIZE=n2]

[VALUE="defaulttext"]>由input引入,type为text或password

44/69是传递给CGI程序的“名值对"数据的"名"部分限定最多可输入的字符数指定文本框的长度(字符数),当MAXLENGTH值大于SIZE值时,文字会自动向左滚动指定文本框的缺省值例复选框<INPUTTYPE=CHECKBOX

NAME="checkbox_id"

VALUE="choice_id"

[CHECKED]>

*可以有多个框被选中,提交时产生多个“名-值”对。

例45/69选择项的名称该框预先被选中单选框

<INPUTTYPE=RADIO

NAME="group_id"

VALUE="choice_id"

[CHECKED]>

同一组内只能有一个单选按钮被选中

例46/69同一组内单选框的NAME属性值必须相同指定单选框的值表示预先被选中重置按钮基本格式:

<INPUTTYPE=RESET

[VALUE="Reset"]>

*重置按钮用于重置(清除)表单中的内容。*按钮的标签可由VALUE指明。缺省为Reset(中文IE为“重置”).47/69提交按钮基本格式:

<INPUTTYPE=SUBMIT

[VALUE="Submit"]>

*提交按钮用于提交表单中的内容。*按钮的标签可由VALUE指明。缺省标签为SubmitQuery(中文IE为“提交查询内容”)

例48/69隐含域基本格式:

<INPUTTYPE=HIDDENNAME="hidden_id"VALUE="data_id">

*采用隐含域,可将信息嵌入到表单中而用户却看不到*提交表单时,隐含域中的信息同样被送至CGI程序。*为什么需要隐含域?

当前的HTTP协议(HTTP1.0)是无状态的,这增加了CGI程序维护状态信息的负担。在多表单的应用场合,为了将一个表单的状态保留给另一个表单,可以采用隐含域方法。例:简单表单;例:含有隐含域的表单49/69这是一种特殊的表单元素即它不能记住前面的请求所获得的数据,记住这些数据是CGI程序的事从地址栏可以看出,表单隐含域中保存的数据也提交给CGI程序了图像按钮基本格式:

<INPUT

TYPE=IMAGE

NAME="image_id"

SRC="image_url"

[ALIGN=TOP|MIDDLE|BOTTOM]>

*当用户单击图象时,其作用如同提交按钮,将表单数据发送给表单处理程序。

*当用户单击图象时,该点的坐标(a,b)将以“名值对”:image_id.x=a和image_id.y=b的形式与其它数据一同发送。

50/69FILE元素基本格式:<inputtype="file"

value="初始文件名"

name="field_id"

size=可视区域长度

maxlength=容许的最大字符长度

accept=可选择的文件MIME类型列表,以逗号分隔>ACCEPT属性限制了在文件对话框中出现的文件的类型,如:ACCEPT=“image/*”就限制文件类型为图象文件,可用于上传图象文件。ENCTYPE=“multipart/form-data”用于表单里有图片上传:表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.

enctype="multipart/form-data"是上传二进制数据

51/69input标签的file元素让用户输入一个文件名或通过“Browse”按钮选取一个磁盘文件进行上载。选择列表选择列表在一个列表框中列出多个选项,基本格式:<SELECTNAME="list_id"[SIZE=n]

[MULTIPLE]>

<OPTION[VALUE="item_1"][SELECTED]>1stitem

<OPTION[VALUE="item_2"][SELECTED]>2nditem

<OPTION[VALUE="item_3"][SELECTED]>3rditem</SELECT>52/69指明可见选项的个数,如果:省略SIZE属性(即SIZE=1),列表就成了下拉列表;SIZE大于等于2,列表就成了显示可见项数的滚动窗口;SIZE大于等于项数时,列表就成了无滚动条的固定窗口。表示可以选择多项即多选列表指定选项的值,如果有多项被选中,提交时VALUE值将连成逗号分开的一串。如果省略VALUE属性,提交时就用选项的内容替代VALUE值。该项预先被选中例除了用input引入表单元素,也有个别元素不用input标签引入。其中一个就是选择列表,它用select标签引入<SELECT>表示一个选择框,类似单选按钮和复选框,在一个列表框中列出多个选项例子中的food可以用shift选多项多行文本输入域<TEXTAREA>表示一个多行文本输入框,其结构是

<TEXTAREANAME="field_id"[ROWS=n1]

[COLS=n2]

[WRAP]>

defaulttext

</TEXTAREA>除了用input引入表单元素,也有个别元素不用input标签引入53/69指定文本输入域的行数。指定文本输入域的列数。当用户的输入到达文本输入域的右边界时自动换到下一行。例数据的组织和编码(URL编码)编码规则:1)用“NAME=VALUE”形式组织客户端提交的数据。2)每个“NAME=VALUE”对用&符号分开,按表单元素的先后次序排列,如:Name1=Value1&Name2=Value2&Name3=Value3&etc3)对客户端输入的数据,除了英文字母、“@”符和阿拉伯数字外,其它输入符号包括汉字和中文图形符号,一律进行编码。西文字符用2位十六进制的ASCII码表示,中文字符用4位十六进制的汉字机内码表示,某些与保留字符相同的字符也将进行编码用“%”标记编码的开始,且每2位十六进制数一隔。被译码后的字符被表示成一个“%”和它们的十六进制数形式(即%HH)。空格用“+”表示例:search:30%=x在用户数据发往Web服务器之前,浏览器将对数据信息进行专门的处理,其中可能导致CGI程序出错的字符将被替换,并且将数据组织得便于获取。54/69NAME是表单元素的属性,是Form中表单元素的名字,由“Name”属性指定VALUE是表单元素的属性,存储客户在表单中输入的数据。如果客户没有输入数据,则VALUE存储表单定义的缺省值,如果没有缺省值,则为空值数据的组织和编码(URL编码)解码规则:解码的目的是将数据还原成客户端用户在Web页面上输入时的形式。URL解码过程与编码过程正好相反,它一般包括以下步骤:1)从浏览器用GET方法或POST方法传送来的数据中分离出“NAME=VALUE”对。2)如果VALUE属性中含有“+”号,则将其转换成空格3)将VALUE中存放的十六进制数(“%HH”)转换成相应的ASCII字符。CGI程序从环境变量“QUERY_STRING”或标准输入中读入的数据是经过浏览器URL译码过的,故在使用这些数据以前还必须对它们进行URL解码。55/69CGI的环境变量环境变量是由Web服务器执行CGI程序时所设置的与系统有关的变量服务器与CGI程序交换信息的协作方式是通过环境变量实现的。无论什么请求,CGI程序总能在特定位置找到某些信息。无论环境变量怎样定义,总有一些变量有着特定含义。环境变量是一个保存用户信息的内存区。在CGI程序前,服务器在特定的环境变量中放入信息,CGI程序可以从这些环境中读取所需的信息,并对其进行分析处理,从而实现客户端网页与服务数据交接。56/69与服务器相关的环境变量

GATEWAY_INTERFACE服务器遵守的CGI版本SERVER_NAME服务器的IP地址或域名SERVER_PORT主机的端口号SERVER_SOFTWARE服务器软件的名字和版本SERVER_PROTOCOL服务器用于处理请求的协议名及版本号例:取与服务器有关的环境变量57/69与客户机相关的环境变量HTTP_ACCEPT列出能被客户机接受的内容类型(MIME)列表如:image/gif,image/jpeg,text/html,text/plain等HTTP_USER_AGENT客户机浏览器软件的版本和名字如:Mozilla/4.0(compatible,MSIE4.0,Windows95)HTTP_REFERER访问CGI时,客户机所指向的HTML文档的URL如:/cgi11.html例:取与客户机有关的环境变量58/69与请求相关的环境变量CONTENT_LENGTHPOST方法中向标准输入(STDIN)发送的字节数COTNENT_TYPEPOST方法中客户机所发送数据的内容类型(MIME类型)QUERY_STRINGGET方法中传送给CGI程序的URL的问号(?)之后的那一部分REQUEST_METHOD

产生信息请求的CGI方法(GET/POST)例:取与请求有关的环境变量(GET方法,POST方法)注意:有的仅在post方法中使用,有的仅在get方法中使用59/69

CGI程序的基本结构初始化处理输出终止60/69初始化读取REQUEST_METHOD环境变量,分析其中的内容是GET还是POST。61/69#include<stdio.h>#include<stdlib.h>#include<string.h>main(){

char*pRequestMethod;

pRequestMethod=getenv("REQUEST_METHOD");

if

(pRequestMethod==NULL)

{

/*doerrorprocessing*/

}else

if

(strcmp(pRequestMethod,"GET")==0)

{

/*doGETprocessing*/

}else

if

(strcmp(pRequestMethod,"POST")==0)

{

/*doPOSTprocessing*/

}else

{

/*doerrorprocessing*/

}

}如果是GET方法,则读取,分析并解码QUERY_STRING

环境变量。CONTENT_TYPE的内容类型为application/x-www-form-urlencoded,则分析并解码从STDIN中读取的数据,数据长度在环境变量CONTENT_LENGTH中指明。如果CONTENT_TYPE

的值为NULL,表明数据是没有经过编码处理。几个自定义的常用函数voidreadGetData(char**aString)

读取QUERY_STRING数据到数组

62/69#include<stdio.h>#include<stdlib.h>#defineMAX_LENGTH1000

charInputBuffer[MAX_LENGTH];voidreadGetData(char**aString){

char*pQueryString;

inti=0;

pQueryString=getenv("QUERY_STRING");

if

(pQueryString!=NULL)

for

(;*pQueryString!='\0';pQueryString++)

InputBuffer[i++]=*pQueryString;/*保存读入的字符*/

InputBuffer[i]='\0';/*放入结束标记*/

*aString=InputBuffer;}从QUERY_STRING

中读入数据(不解码)读入的数据将存放在由*aString指向的InputBuffer[]

数组中几个自定义的常用函数voidreadPostData(char**aString)从STDIN中读入数据编码规则63/69voidreadPostData(char**aString){char*pContentLength;

intContentLength;

inti=0;

pContentLength=getenv("CONTENT_LENGTH");

if

(pContentLength!=NULL)

ContentLength=atoi(pContentLength);/*输入的字符数*/

else

ContentLength=0;

if

(ContentLength>MAX_LENGTH-1)

ContentLength=MAX_LENGTH-1;/*可容纳的字符数*/for(i=0;i<ContentLength;i++){InputBuffer[i]=getchar();/*保存读入的字符*/if((InputBuffer[i-1]=='=')&&(InputBuffer[i]=='&')){InputBuffer[i]=‘+’;//插入空格,解决输入域为空时引起的错误InputBuffer[++i]='&';}}

InputBuffer[i]='\0';/*放入结束标记*/

*aString=InputBuffer;}读入的数据将存放在*aString指向的InputBuffer[]

数组中#defineMAX_LENGTH10000charInputBuffer[MAX_LENGTH]几个自定义的常用函数intparseData(structentry

**queryString)分出输入串中“名=值”对64/69intparseData(structentry**queryString){

char*pToken;

inti=0;

char*data=(char*)0;

readPostData(&data);/*若GET方法,可调用readGetData()*/

pToken=strtok(data,"=");/*查找第一个"="前的"名"*/

while

(pToken!=NULL){

entries[i].name=pToken;

pToken=strtok(NULL,"&");/*查找下一个"&"前的"值"*/

if

(pToken!=NULL)

{

entries[i++].val=pToken;

pToken=strtok(NULL,"=");/*查找下一个"="前的"名"*/

}

else{/*找不到下一个"&"前的"值"*/

pToken=strtok(NULL,'\0');/*查找结束标记'\0'前的最后一个"值"*/

entries[i++].val=pToken;

break;

}

}

*queryString=entries;

return(i);

/*返回"名=值"对的个数*/}输入串可调用readGetData()或readPostData()得到"名=值"对存放在一结构体数组entries[]解码后的数据仍存放在原结构体数组中注意是i++,不是++i!几个自定义的常用函数intDecodeData(structentry**pDecode)解码URL编码(由parseData()获得)解码和编码是相反的过程,比如将字符“+”换成空格,将16进制转换成10进制65/69intDecodeData(structentry**pDecode)

{

voidURLDecode(char*pEncoded);

inti,length;

structentry*data,*p;

length=parseData(&data);

p=data;

for(i=0;i<length;i++)

{

URLDecode(p->name);/*解码"名"数据*/

URLDecode(p->val);/*解码"值"数据*/

p++;

}

*pDecode=data;

return(length);

}voidURLDecode(char*pEncoded)

{char*p;

p=pEncoded;

for(;*pEncoded!='\0';pEncoded++,p++)

{if(*pEncoded=='+')

*p='';

/*将字符'+'换成空格*/

else{

if(*pEncoded=='%'){

pEncoded++;

if(isxdigit(*pEncoded)&&isxdigit(*(pEncoded+1)))

{

*p=(char)intFromHex(pEncoded);

pEncoded+=1;

}

else

*p=*pEncoded;

}

else

*p=*pEncoded;

}

}

*p='\0';}一个完整的例子66/69返回以POST方法为例:处理处理部分是CGI程序的核心,所要做的事完全依赖于CGI程序的应用目标。如:将用户数据存入某数据库文件根据用户输入查询某数据库文件根据用户请求进行某种运算等67/69返回输出(1)头标信息

头标信息用于让服务器和客户知道回送的信息类型,它可以是下面三种类型之一:内容类型、位置、状态。(2)标准输出(STDOUT)

CGI程序通过标准输出(STDOUT)将信息发送给等待的服务器,并由服务器回送给客户。在C程序中,只需将回送内容通过标准输出语句输出即可.

如:printf("Hello");对用户数据进行读取、解释、处理后,需要向用户返回输出,这时需要给出头标信息和输出内容。

注意68/69返回头标信息:内容类型头标(Content-type)指明回送内容的MIME类型,主要有下面几种:

application

应用程序数据,如压缩文件。

audio

音频数据

image

图象数据

text

文本信息,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论