Web应用措施开拓技能
副标题#e#
Internet无疑是一种重要的信息流传媒体,跟着其迅猛成长,将会有越来越多的企业、商团、当局构造、学校、科研机构需要在Internet上成立本身的网点。建树一个网点,硬件上需要专用处事器、集线器、路由器,租用数据通信用的专线,软件上需要安装网络操纵系统和Internet处事器(www、ftp和gopher处事器),更为重要的是,需要编写大量的Internet处事器应用措施。这种应用措施吸收Internet处事器传送过来的用户请求,从内部数据库检索出用户需要的数据,再将数据传送给用户。今朝在Internet上遍及应用的是www系统,这种系统用HTML文件名目(即凡是所说的网页)流传信息,用统一资源定位符(URL)毗连世界各地计较机上的信息资源,凭据HTTP协议在欣赏器和www处事器之间通信。www处事器又称为web处事器,相应的处事器应用措施称为web应用措施。在Windows操纵系统下,web应用措施可分为两种范例:CGI(CommonGateInterface)应用措施和ISAPI(NSAPI)应用措施。这两种应用措施的成果是一样的,都是吸收web处事器传送过来的用户请求,作出响应,将用户需要的数据以网页或其它形式传送给用户。它们的区别在于,前者用尺度输入输出或文件在web处事器和web应用措施之间传送信息,后者则是一种动态联接库措施(DLL),其数据可被web处事器直接会见。ISAPI是指Microsoft的Internet信息处事器(IIS)编程接口,而NSAPI则指Netscape的Internet处事器编程接口。本文将以Borland公司的C++Builder编写ISAPI(NSAPI)措施的要领为例,先容开拓web应用措施的道理和要领。这种应用措施在32位的Windows操纵系统下运行,假如网点利用WindowsNT,则自己就有IIS(包罗www、ftp、gopher三个处事器),开拓、运行都很利便。
HTTP协议和HTML类型
#p#副标题#e#
众所周知,Internet的底层通信协议是TCP/IP协议,在Internet上传送的数据被分别为一个个的IP数据报,每一个IP数据报都指明信源和信宿的地点,沿途的网关凭据信宿地点抉择命据报的去向。而TCP协议则为通信的两边成立一条虚电路,担保所有的数据报都能按正确的序次达到目标地。TCP/IP只是实现计较机之间的二进制数据传输,对这些数据如何表明,则是上层协议的工作。开拓web应用措施的措施员并不需要干涉TCP/IP的事情,我们所必需相识的是其上层协议HTTP。
HTTP是一个应用层协议,今朝遍及应用于web欣赏器和web处事器之间的通信。HTTP用字符串举办通信,所传送的信息称为HTTP动静(HTTP-Message)。HTTP动静有两种范例:欣赏器传送给处事器的请求动静和处事器传送给欣赏器的响应动静,其根基名目如下:请求动静:
MethodRequest-URIHTTP-Version;请求行
general-header;通用动静头
request-header;请求动静头
entity-header;实体动静头
;空行
message-body;动静实体
个中三种动静头的序次是任意的。
响应动静:
HTTP-VersionStatus-CodeReason-Phrase;状态行
general-header;通用动静头
response-header;响应动静头
entity-header;实体动静头
;空行
message-body;动静实体
个中三种动静头的序次同样是任意的。
对付请求动静,请求行是必不行少的,其余部门是可选的。请求行中的Method(要领)指定详细的请求操纵,这些要领是HTTP指定的,常用的要领有:
GET欣赏器要求从处事器处得到信息。
HEAD浸染等同于GET可是处事器在响应时不必返回动静实体。凡是用来
测试信息资源是否可用,是否已变动。
POST欣赏器向处事器传送信息。
PUT欣赏器要求将动静中所包括的动静实体写入处事器。
请求行中的Request-URI是信息资源的定位符,雷同于我们凡是所说的"网址",但网址凡是是指某个网点IP地点对应的域名,而URI则要进一步指明网址下的路径、网页文件名、web应用措施名等信息资源。请求行中的HTTP-Version则指明欣赏器所能执行的HTTP协议版本号,大都是1.0或1.1。譬喻,当我们要求会见某个abc公司网址www.abc.com上的网页xyz.htm时,欣赏器将会发出如下请求行:
GEThttp://www.abc.com/xyz.htmHTTP/1.0
请求动静中的通用动静头、请求动静头和实体动静头的一般名目是
field-name:field-value
也就是说,动静头由多个字段(field)构成,每个字段一行(HTTP用回车换行符CRLF作为每一行的竣事符号),每行由字段名和字段值构成,互相用冒号离隔。HTTP对付每一个字段的意义及其对应的值都有具体的划定。可供利用的字段许多,但并不是每次发送请求动静都要利用所有的字段,而是按照需要利用个中的若干个。以下是一个请求动静的具编制子:
GET/default.htmHTTP/1.0
Host:http://default
Accept:text/html
User-Agent:Mozilla/2.0
(compatible;NEWTActiveX;Win32)
对付请求动静,常用的字段有:
通用动静头:Cache-Control、Connection、Date
请求动静头:Accept、Authorization、
From、Host、If-Modified-Since、
Referer、User-Agent
实体动静头:Content-Encoding、
Content-Length、Content-Type、Expires
限于篇幅,本文无法具体表明每一个字段的寄义,有乐趣的读者可参阅参考文献[1]。
#p#分页标题#e#
请求动静中的动静实体(Message-Body)是欣赏器要传送给处事器的数据。利用GET要领的请求动静一般不会有动静实体,而POST和PUT要领例一般会有动静实体,其详细内容可以是任何数据,由实体动静头中的字段指明其编码方法、范例和长度。
对付响应动静,开头的状态行是必不行少的,个中开头的HTTP版本号(HTTP-Version)指明处事器所执行的HTTP协议是哪个版本的,然后是由3位数字构成的状态码(Status-Code),说明对欣赏器请求动静的响应状态,最后的原因短语(Reason-Phrase)是对状态码的简随笔字说明。
状态码的第一位数字界说响应状态的范例,大概的数值及其寄义如下:
1xx:已吸收到请求动静,正在处理惩罚中。
2xx:对吸收到的请求动静已乐成地作出响应。
3xx:必需采纳进一步的动作才气完成请求。譬喻,请求动静中的URI对应多个资源,或请求动静要会见的资源的URI已改变,或必需通过署理处事器才气会见等。
4xx:欣赏器错误,请求动静语法错误或请求无法执行。
5xx:处事器错误,处事器无法执行一个有效的请求。响应动静的状态行之后是与请求动静雷同的、由各类字段名和字段值构成的动静头,对付响应动静,常用的字段有:
通用动静头:Date
响应动静头:Server、www-Authenticate、Location
实体动静头:Allow、Content-Encoding、Content-Length、Content-Type、
Expires、Last-Modified
响应动静最后的实体(Message-Body)部门是处事器凭据欣赏器的请求传送返来的数据,最常见的环境就是一个网页文件的内容。以下是一个响应动静的具编制子,最后一行是动静实体:
HTTP/1.0200OK
Server:Microsoft-PWS-95/2.0
Date:Thu,15Oct199807:40:14GMT
Content-Type:text/html
Content-Length:21
Content:
Hi,gladtomeetyou!
凡是,上述动静通信进程是由用户欣赏某个网页而提倡的。网页是一个凭据HTML类型编写的纯文本文件,其根基框架布局如下:
<HTML>
<HEAD>
<TITLE>网页标题</TITLE>
</HEAD>
<BODY>
……(网页的详细内容)
</BODY>
</HTML>
关于HTML类型的具体内容,可拜见参考文献[2]。其实,我们完全可以通过尝试要领来把握这个类型。操作一些网页编辑软件(譬喻Microsoft的FrontPage)可以直观地设计页面,然后调查所生成的HTML文本,便可以垂手可得地学会编写HTML文件。
在每个网点上都有一个默认网页,当用户在欣赏器上指定一个网点的网址时,欣赏器向该网址上的web处事器发出一个请求动静,个中的URI即为该网点web处事器的根目次。web处事器吸收到这个动静后,认为默认网页就是用户需要的信息资源并将之传送给欣赏器。网页上包括各类链接,其根基名目是:
<Ahref="URI">说明文字</A>
当用户点击这些链接时,就有大概启动欣赏器与处事器的再次通信。链接中的URI大概是同一个网页中的某个节点,可能是另一个网点的网址,可能是网点上的某一个网页或其它已存放在网点处事器上的文件。这些都由web处事器自行动出响应,不需要web应用措施的参与。对付编写web应用措施的措施员,所体贴的是一种称为"查询"(Query)的链接,譬喻,在网页中设计如下链接:
<Ahref=http://www.Tside.com/Scripts/handll.dll?MyQuery>查询处事器</A>当用户点击这个链接时,欣赏器将会向处事器发出雷同于如下的请求动静
GET/Scripts/handll.dll?MyQueryHTTP/1.0
Host:http://www.Tside.com网点www.Tside.com上的web处事器吸收到这样的请求动静后,将会向web处事器根目次下的子目次Scripts下的web应用措施handll.dll传送查询字串"MyQuery",由web应用措施作出响应。通过这种方法,我们可将各类处事成果安排在网页文件中,用差异的查询字串暗示差异的处事成果,由web应用措施按照查询字串提供相应的处事。
当需要提供应用户的处事成果较多时,还可以在上述查询链接的URI中插手路径(PATH),譬喻:
http://www.Tside.com/Scripts/handll.dll/MyPath?MyQuery
#p#分页标题#e#
个中配置的路径MyPath可以是指处事器磁盘上的子目次,在上例的环境下,对应的将是处事器根目次下的子目次MyPath;也可以是虚拟的路径,仅供web应用措施作为区分处事成果的分支利用。无论如何,web处事器只是将路径名通报给web应用措施,如那里理惩罚完全是应用措施本身的工作。
别的一种重要的编程技能是操作网页中的表单(Form)。表单用来安排文字输入框、列表框、组合框、按钮、选择框等Windows常见的控件。如同Windows应用措施中的同类控件一样,这些控件的浸染是提供交互操纵成果,用户对付这些控件的操纵功效将传送给web应用措施。如下是一个包括表单的网页例子,个中的表单包括了一个文字输入框、一个打勾选择框和一个按钮:
<html>
<head><title>FormPageDemo</title></head>
<body>
<formaction="http://default
/scripts/handler.dll"method="POST">
<inputtype="text"name="text1">
<inputtype="checkbox"name="check1">
<inputtype="submit"name="button1"value="Submit">
</form>
</body>
</html>
一个网页中可以有多个表单,每个表单以
开始,以
竣事。个中"action="后头引号内的文字指出吸收表单操纵功效的web应用措施的URI,"method="后头引号内的文字指出欣赏器向处事器发送该表单操纵功效时所利用的要领,一般应该用POST。表单内可以有多个控件,每个控件的名目为
<inputtype="…"name="…"value="…">
个中的type指明控件的范例,对付范例为submit的控件,用户选中它将使欣赏器发送当前操纵的功效。Name是设计者为控件取的名字,value是控件的初始值,无关紧要,但对付按钮,value将是按钮上的文字。
对付上例,如果我们在文字框中输入abc,选中选择框,然后按下范例为submit的按钮时,欣赏器将用POST要领向网址为http://default的处事器发送请求动静,请求动静中的动静实体将为如下内容:
Text1=abc&Check1=ON&submit=Submit
吸收到请求动静的web处事器将把这一串字符通报给web应用措施。留意其名目是每个控件对应一个"名值对":控件名=控件值,各个名值对互相用&联络起来。Web应用措施可以据此获知用户对控件的操纵功效。
各类控件的范例名称及其对应的值可查阅参考文献[2],或操作网页编辑器举办尝试,此处不再一一赘述。
用CB开拓web应用措施
以下的描写以C++ Builder 6.0为例。
1.选择菜单File|New,在打开的对话框中选择图标WebServerApplication,在再次打开的对话框中选择ISAPI/NSAPIDynamicLinkLibrary,Delphi将为你成立一个web应用措施的框架,个中包括了一个焦点部件TwebModule,认真在web处事器和你的应用措施之间传送数据。
2.此刻我们可觉得欣赏器传送过来的查询或表单编写响应代码。选择WebModule,在ObjectInspector大将显示相应的属性(Properties),选择个中的属性Action,按下右端的小按钮,delphi将打开一个对话框,让我们设计响应措施段。按下个中的按钮"Add",Delphi将自动为我们的措施段起一个名字,譬喻WebActionItem1,并呈此刻对话框中。这种响应措施段Delphi称为"行动"(Action),为了区别差异的行动,必需为每一个行动起一个名字,我们可以修改这个名字使之更有意义些。
点击对话框中的行动名,ObjectInspector将会显示相应的属性。个中的MethodType用来指定对何种要领的请求动静作出响应,可供选择的项目有mtAny、mtGet、mtHead、mtPost和mtPut。个中后四项别离对应请求动静的要领GET、HEAD、POST和PUT,若你想要对所有的要领都作出响应,则可选择mtAny。
若你的行动是针对查询请求的,则还可觉得属性PathInfo配置路径名。譬喻,假设我们想要对查询
http://www.Myside.com/Scripts/MyApp.dll/MyPath?MyQuery
作出响应,则可将PathInfo配置为"/MyPath"。留意在上述URI中,www.MySide.com是你的网点的网址,MyApp.dll是你正在编写的应用措施名称,你的应用措施将存放在web根目次下的子目次Scripts中。
接着是编写详细代码。C++ Builder是通过事件响应来执行代码的,选择ObjectInspector中的标签Events,个中只有一个事件OnAction,双击右方的编辑框,Delphi将在你的源措施中插入一个空缺的进程,譬喻,
#p#分页标题#e#
void __fastcall TWebModule1::WebModule1WebActionItem1Action(
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
bool &Handled)
{
}
个中最重要的是两个挪用参数Request和Response。Request是一个TWebRequest工具,这种工具具有Accept,Authorization,CacheControl,Connection,…等属性,这些属性对应于HTTP请求动静中动静头的各个字段,这些属性的值就是这些字段的值。当上述响应进程被挪用时,Delphi按照web处事器传送过来的动静头及动静实体,配置好工具Request的各个属性值,然后作为挪用参数通报给执行行动的进程。对付查询动静,暗示查询方针的查询字串(如上面提到的MyQuery)将存放在Request的属性Query中。假如查询字串是由"名值对"所组成的,且各名值对之间用&联络起来,譬喻
name=dog&color=black
则Delphi还会将各个名值对拆开,再将每一对中的"名"和"值"存放在Request的属性QueryFields中。QueryFields是Tstrings范例的工具,其属性Names和Values别离存放各个名值对的"名"和"值"。应用措施通过会见这些属性,便可知当前的查询是什么。
假如吸收到的请求动静是用POST要领传送表单的操纵功效,则如上所述,操纵功效将是用&联络多个名值对的一串字串,这一字串将存放在Request的属性Content中,而且Delphi将阐明这些名值对,将每一对中的"名"和"值"存放在Request的属性ContentFields中。ContentFields和QueryFields一样,都是TStrings工具,通过其属性Names和Values可得到各个名值对的"名"和"值"。
以上阐明使我们知道当前请求动静的具体环境。无论对请求如那里理惩罚,最终我们必需返回一些信息给欣赏器。凡是是应用措施将处理惩罚功效写成一个HTML文件,逐行写入Respons的属性Content中。也可以操作Delphi的控件PageProducer编写HTML文件,然后将PageProducer的内容赋值给Response的属性Content,返回给欣赏器。
Response是TwebResponse范例的工具,其属性Allow,ContentEncoding,ContentLength,ContentType,Date,Expires,…等对应于响应动静中动静头的各个字段,应用措施假如需要配置这些字段的值,则可在以上响应进程中配置Response的相应属性值。
响应进程最后的参数Handled用来说明响应行动是否已完成。
3.一个web应用措施可对多个查询或表单作出响应,反复步调2,我们可为各个差异的查询动静设计差异的响应行动。
以上只是一个大要性的描写,实际编写起来要繁杂得多。有关细节,可查阅Delphi的辅佐文件。
网点老是在运行进程中慢慢完善、慢慢增加成果的。在开拓web应用措施的进程中,应只管制止在web处事器上调试,以免影响网点的正常运行。我们可以操作一些在单机上就可以运行的小我私家web处事器(譬喻Microsoft的PersonalWebServer),在单机上开拓web应用措施,调试乐成之后再装入网点处事器。