基本的Web技术Word文件下载.docx
《基本的Web技术Word文件下载.docx》由会员分享,可在线阅读,更多相关《基本的Web技术Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
6、FORM:
HTML中的表单——浏览器收集用户信息的方式
提起CGI程序的输入,就要提起FORM,FORM是浏览器收集用户信息的方式,下面我们对FORM作一些简要介绍
。
<
FORM属性>
若干输入域<
/FORM>
属性有
—ACTION:
指出用于处理表格内容的程序
—METHOD:
指出表单数据传递给该程序的方法
—ENCTYPE:
指出表单信息的编码方式(一般为GET或POST)
输入域有3种类型,针对不同种类信息的收集
—<
INPUT>
:
各种性质,单行文字的输入
SELECT>
选择性输入,滚屏式菜单
TEXTAREA>
多行文字输入
下列是几个用FORM收集用户信息,调用CGI程序的例子。
●例子:
arch…./cgiforms/helloworld.html
TITLE>
Hello,World!
CGI<
/TITLE>
H2>
ThefirstexampleofCGIprogramming<
/H2>
FORMMETHOD=GETACTION=”/cgi-bin/helloworld.pl”>
Clickheretofireascript:
INPUTTYPE=SUBMITVALUE=”fire”>
过程与效果
visit
click“fire”button
…html/cgi-bin中的helloword.pl得到执行
输出一个按HTTP应答格式准备的回答消息,其中内容部分遵从HTML文本格式
服务器接过这个输出,送给浏览器
浏览器显示内容
●INPUT域的性质,TYPE=?
---文本:
text,纯文本内容,进一步属性有NAME,MAXLENGTH,SIZE,VALUE.。
---口令:
password,用户输入内容不显示,但传送不加密。
,
---多选多(checkbox)和多选一类型(radio)NAME,VALUE,CHECKED(optional),同一组选项必须有相同的NAME
---提交按钮:
SUBMIT,指示浏览器提交表格数据
---复位按钮:
RESET,置表格初值,即各输入域的VALUE值.
---象素:
IMAGE,具有提交语义,被点击象素坐标同时被提交.
例子:
…/cgiforms/tpcr.html
FORM…>
INPUTTYPE=textNAME=testsize=15VALUE=“GoodMorning”>
p>
INPUTTYPE=passwordNAME=secret>
INPUTTYPE=checkboxNAME=bookVALUE=a>
AAA
INPUTTYPE=checkboxNAME=bookVALUE=bchecked>
BBB
INPUTTYPE=checkboxNAME=bookVALUE=c>
CCC<
INPUTTYPE=radioNAME=logicVALUE=t>
True
INPUTTYPE=radioNAME=logicVALUE=f>
False
效果
Visit
hsri.html
FORMACTION=...>
INPUTTYPE=hiddenNAME=testVALUE=“creditcardnumber”>
INPUTTYPE=submitNAME=form1VALUE=“go”>
INPUTTYPE=resetVALUE=“clear”>
INPUTTYPE=imageNAME=lxmSRC=“lxm.gif”>
Visitarch…./cgiforms/hsri.html
clickontheimage
●SELECT
属性,除NAME外还有
MULTIPLE:
可选多项
SIZE:
1为弹出菜单,否则为滚屏式.
含有若干<
OPTION>
域,有可选属性
SELECTED:
初始预选(缺省为第一项)
VALUE:
选中后的返回值(缺省为option元素所带的内容)
formaction=..>
selectname=“foo”size=1>
(size=3;
size=3multiple)
option>
aaaaaaaa
bbbbbbbb
optionselected>
cccccccc
dddddddd
optionvalue=“123”>
eeeeeeee
ffffffff
/select>
/form>
See…/cgiforms/select.html
●TEXTAREA
初始内容<
/TEXTAREA>
ROWS和COLS属性给出显示区域的大小
也有必须的NAME属性
FORMaction=…>
TEXTAREANAME=“address”rows=5>
LiXiaoming
CSDEPT,PKU,BEIJING100871,CHINA
●关于NAME属性
逻辑地看,网页是一个由各种“元素”构成的一种层次式结构,其本身就是一个元素.
这些元素由“tag”来标识.许多tag都有NAME属性,尤其是那些有比较丰富语义的元素.
我们将NAME看成是相应元素的“名字”.名字是动态处理文档元素的依据.
注意:
CGI程序设计的一个常见错误是忘了写FORM中元素的NAME属性.(浏览器不报错,但也不给服务器送去相应的表格信息)
7、CGI程序如何理解FORM中繁杂的表格信息
用户提交表单时,浏览器通常将其编码后再发送给服务器和CGI程序,信息按在FORM中元素,出现的顺序依据URL编码规范收集成一个编码的字符串:
—空格由“+”表示
—其它非数据值字符由“%HHthHTH”表示,16进制ASCII码,(例如回车、换行是“%0D%0A”,!
被编码为%3D等
—各属性名和属性值用“=”分开
—“&
”用来分隔不同的“名=值”。
CGI程序接收编码后的输入信息后,需要对其进行分析,以便利用其中的数据。
目前,在Internet已经出现为数不少的CGI输入分析库程序,其中较为知名的SteveBrenner用perl编写的cgi-lib.pl,可访问
http:
//www-genome.wi,mit.edu/pub/software/www-cgi-docs.html
及engeneerickim用C编写的cgihtml,可访问
ftp:
//hcs.harvard.edu/pub/Web/tools/cgihtml.tar.gz
//hcs.harvard.edu/~eekim/Web/cgihtml
输入字符串编码后,有两种方法向服务器和CGI程序发送信息:
GET方法将信息附加在URL上,POST方法则通过标准输入发送,浏览器默认使用GET方法。
下面我们对这两种方法作一下介绍。
●METHOD=GET
---GET通常适合用于信息查询的表格。
例如查询某本书是否存在,其特点是信息量小,不改变服务器方的状态。
---服务器方的环境变量QUERY_STRING中将含有URLencoded方式编码的表格信息。
---对浏览器来说,它将ACTION对应的URL和“?
表格信息”拼接,形成URI,用于和服务器联系.
---这也使得我们可能直接启动服务器方的一个程序,不一定通过表格.
下面是一个用GET方法的例子:
<
FORMMETHOD=GETACTION="
http:
//.../name.pl"
>
Typeyourfirstname
inputtype=textname=“FirstName”>
br>
Typeyourlastname
inputtype=textname=“LastName”>
inputtype=submitvalue=“submit”>
如果用户键入“Winona”和“Ryder”作为值,则HTTP请求中的URI为
…name.pl?
First+Name=Winona&
Last+Name=Ryder
服务器方环境变量QUERY_STRING将含有:
“First+Name=Winona&
Last+Name=Ryder“
如果不用表格
可以通过如下方式启动程序和传送数据
//…/name.pl?
Last+Name=Ryder完成同样的事情
●METHOD=POST
---浏览器执行一个HTTPPOST过程(将表格数据作为一个message送给服务器,而不是挂在URL后面)。
---服务器将收集的数据通过STDIN传递给CGI脚本。
---环境变量Content-length为从浏览器发送来的数据的字符数,变量Content-type被设为"
application/x-www-form-urlencoded"
.
例、TheimportantprograminPerl:
从urlencoded中析取信息
#首先搞清楚所用的METHOD
if($ENV{‘REQUEST_METHOD’}eq“GET”){
$in=$ENV{‘QUERY_STRING’};
}
elsif($ENV{‘REQUEST_METHOD’}eq“POST”){
for($I=0;
$I<
$ENV{‘CONTENT_LENGTH’};
$I++)
$in.=getc;
}#从标准输入中一个个字符读进来,拼接放到$in中.
8、其它环境变量
CGI程序可以使用的典型环境变量有:
GATEWAY_INTERFACEREMOTE_HOST
SERVER_NAMEREMOTE_ADDR
SERVER_SOFTWAREAUTH_TYPE
SERVER_PROTOCOLREMOTE_USER
SERVER_PORTREMOTE_IDENT
REQUEST_METHODCONTENT_TYPE
PATH_INFOCONTENT_LENGTH
PATH_TRANSLATEDHTTP_FROM
SCRIPT_NAMEHTTP_ACCEPT
DOCUMENT_ROOTHTTP_USER_AGENT(browser)
QUERY_STRINGHTTP_COOKIE
例如Perl语句$ENV{‘REMOTE_ADDR’}将返回浏览器所在计算机的IP地址。
9、CGI程序的执行及输出
---根据METHOD,用对应方式获得编码后的表格信息
解码”,从中取得纯表格信息
---根据服务逻辑分析处理信息
---生成返回网页,送给标准输出.
---CGI程序必须产生一个响应---就算没有数据需要发回,CGI程序也必须发一个错误或者空消息,因为http连接这时仍然处于打开状态,必须由服务器关闭。
CGI程序将给服务器发送一个头:
(1)如果头的类型是“Location”,服务器将向客户发送指定的文件.
(2) 如果头的类型是“Content_type”,服务器将把紧跟着的所有数据发送回浏览器。
这应该是一个HTML文本。
当CGI程序结束时,服务器关闭连接.
●CGI程序的输出
CGI程序中所有对STDOUT的输出都交由服务器处理。
输出应当以下列三种形式之一的头(header)开始:
---Location:
服务器发送另一个文件给客户(并且结束连接).如:
"
Location:
---Status:
服务器将返回一个状态消息给客户(并且结束连接).如:
Status:
305Documentmoved\n"
;
---Content-type:
服务器将发送所有剩余的输出给浏览器(在一个空行之后),程序结束后才关闭连接.如
Content-type:
text/html\n\n"
一个最简单的CGI程序
#!
/usr/bin/perl
print“Content-type:
text/html\n\n”;
print“<
HTML>
HEAD>
TheHello,
Worldexamplepage<
/HEAD>
\n”;
BODY>
H1>
Hello,
World!
/H1>
/BODY>
/HTML>
●例:
下面是用Perl写的CGI程序,将返回GET方法下,浏览器送给服务器的urlencoded表格信息:
print“$ENV{QUERY_STRING}\n“;
10、CGI程序的位置
在HTTP服务器的配置文件中设定(或由扩展名决定)CGI程序的位置。
.通常,在你编制CGI程序的服务器上,把含有表格的HTML文本放在服务器的“文档根目录”(“documentroot”)下的某个子目录中,把CGI程序放在服务器的“cgi-bin”目录下.
另外,CGI程序必须有适当的权限,以便服务器执行.另外,如果CGI程序要读写其它文件,服务器必须具有相应的权限。
(例如Apache服务器,CGI脚本要和httpd程序是同样的owner才能进行写磁盘操作。
)
11、CGI的优势
目前,CGI程序的功能可有多种方法替代。
许多WEB服务器包括编程接口(API),可以不通过CGI直接扩充服务器的能力,不仅易于实现,而且效率比CGI要高。
还有些服务器可不通过CGI处理某些功能,例如,数据库接口。
另外,客户端技术(例如Java和JavaScript等)也能够提供CGI的某些能力。
但是,CGI并未过时。
这是因为CGI具有以下独特的优势:
●CGI是公共的,便于移植。
可以使用任何编程语言在任何平台上设计CGI程序,而服务器API等方法则限定使用某重语言,并且难于学习和掌握。
●Java等客户端技术不可能代替CGI,只能是CGI的补充。
对于某些应用来说,服务器端程序更合适。
●CGI的局限性大部分是HTML或HTTP的局限性。
随着Web技术的发展,CGI的能力也在不断提高。
二、CGIScript实现的ServerPush、Cookie技术
1.ServerPush
按HTTP的规定,Web服务器可以向浏览器返回一个“回答序列”,序列中的每个元素可以看作是一个独立的HTML文本,在浏览器方一个接一个显示,从而造成一种动态效果。
这种序列用一种特殊的MIME类型,multipart/x-mixed-replaced,来说明。
通常,这种回答序列由一个CGI脚本产生,其输出需为如下基本结构:
multipart/x-mixed-replace;
boundary=--DELIMIT(中间不能有空格)
--DELIMIT
(第一张网页的内容,包括适当的Content-type和空行)
。
--DELIMIT--
print"
boundary=--foo\n\n"
\n--foo\n"
print"
h3>
Fromthefirstpart<
"
/h3>
center>
h2>
Fromthesecondpart<
/h2>
/center>
\n"
--foo--"
2.Cookie
●Cookie的概念
Cookie是服务器发送给浏览器的一种特殊形式的信息。
浏览器不是将这些信息显示出来,而是记录在客户机的一个特定的文件中(例如Linux中用户目录下的.netscape/cookies)。
当下次访问同样站点时,浏览器就有可能将该cookie信息送回给服务器。
这样,就实现了浏览器和服务器之间某种持续的关系。
Web服务器和浏览器之间通过HTTP头标互相传递cookie。
浏览器收到服务器方来的Set-Cookie响应头标后就设置一个cookie。
以后,一旦用户请求某个文件,满足Set-Cookie头中的参数要求时,浏览器将cookie发过去.服务器将它放在HTTP_COOKIE环境变量中。
这是比隐藏域更一般的一种技术。
隐藏域技术只在一个session内有效,cookie技术可应用于不同的session之间。
●Cookie的建立
每个cookie由“键,值”对来定义。
另外还可有一些可选参数定义cookie请求的有效性:
---expire,GMT(格林尼治)时间,浏览器保持该cookie的时间期限,如果不设,当浏览器和服务器的一次连接结束后,cookie的生命也就结束了。
---path,指定一个服务器方文档空间的子集,本cookie在其中有效,可以获取服务器所设置的cookie.
---domain,指定cookie在其中有效的网域,定义那些服务器可以读取浏览器方的cookie.
---secure,这个参数指定cookie只能通过一个安全通道送出,浏览器和服务器之间的通信协议被认为是加密认证协议时,浏览器才会向服务器提交相应的cookie.例如SSL。
如果不设任何参数,cookie将被返回给原来的服务器。
服务器向浏览器送cookie的例子
text/html\n”;
print“Set-Cookie:
gcf=friend”;
print“\n\n”;
/*注意和其他CGI程序一样,在程序输出的响应头标和Web页面之间必须有一空行*/
print“Thisisregularcontent\n”;
HTTP响应头标中会包含如下一行:
Set-Cookie:
gcf=friend
访问这个脚本的浏览器(适当设置的)将会被问到是否接收一个cookie。
服务器一次可以发送多个cookie给浏览器,每个带有不同的条件,如
gcf=myfriend;
expires=Sat,26-Aug-9715:
45:
30GMT;
path=/project