10. 客户机与服务器的数据交互(下)
1、XMLHTTP对象的Send方法 |
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据: |
poster.send XML-data |
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。 |
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示: |
|
2、 服务器端的数据处理 |
服务器在接收到客户机发送过来的数据包后,会马上处理数据,并做出相应的响应。服务器先创建一个XMLDOM对象,然后将Request对象中的数据载入,并通过XMLDOM对象开始访问XML数据。 |
在获得XML数据的访问入口后,首先做的事情是对XML文档进行验证(这部分的具体过程我们将在后面介绍XML Schema的时候一并说明)。一旦通过验证,就可以利用DOM接口对XML数据进行分析处理(例如:将提取的信息用来更新数据库中的记录)。 |
一个简单的ASP脚本如下: |
<% |
Set docReceived = CreateObject(“Microsoft.XMLDOM”) |
docReceived.async = False |
docReceived.load Request |
Set rootNode = docReceived.documentElement |
Set nodeCustomer = docReceived.selectSingleNode(“//customer”) |
customerID = nodeCustomer.firstChild.nodeValue |
…… |
%> |
3、服务器端的响应消息 |
服务器在处理完XML数据之后,构造响应消息,并返回给客户机。消息的形式可以是纯文本、HTML页面、XML文档或者是嵌有XML数据岛的HTML页面。 |
首先来看一个HTML页面的例子,这个消息页面中包含了客户订购的信息: |
<H3>Confirmation of order</H3> |
<% For Each node In listOrderitem |
title = node.getAttribute(“title”) |
Set quantityNode = node.selectSingleNode(“quantity”) |
Quantity = quantityNode.firstChild.nodeValue %> |
<P> <%=title%>, <%=quantity%> </P> |
<% Next %> |
服务器采用XML文档作为返回消息的优点是:客户机可以利用智能程序对结构化的消息进行分析,能够更准确地理解服务器所要表达的信息。 |
例如: |
<% |
Set docResponse = CreateObject(“Microsoft.XMLDOM”) |
docResponse.async = False |
docResponse.load “MyFixedResponse.xml” |
Response.ContentType =“text/xml” |
Response.save docResponse |
%> |
在使用XML文档时,必须在填写Response内容之前将ContentType属性值指明为“text/xml”,表示响应消息的格式为XML。save方法的用途是将XML文档内容填充到Response对象中。 |
除了可以装载已存在的XML文档,还可以实时构造XML数据作为响应内容: |
<% Response.ContentType=“text/xml” %> |
<confirmation> |
<errorcode>0</errorcode> |
<shipped> |
<% For Each node In listOrderitem |
title = node.getAttribute(“title”) |
Set quantityNode = node.selectSingleNode(“quantity”) |
Quantity = quantityNode.firstChild.nodeValue %> |
<item title=“<%=title%>” quantity=“<%=quantity%>” /> |
<% Next %> |
</shipped> |
</confirmation> |
4、客户机处理响应信息 |
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的: |
● responseTxt:将返回消息作为文本字符串; |
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用; |
● responseStream:将返回消息视为Stream对象。 |
HTML页面的返回消息一般是被作为文本字符串进行处理。下面的这个例子是一个完整的交互过程,客户机脚本的代码如下: |
<DIV ID=“displayArea”> </DIV> |
<SCRIPT LANGUAGE=“VBScript”> |
Sub Submit_OnClick() |
’创建XMLDOM |
Set docSubmit = CreateObject(“Microsoft.XMLDOM”) |
……’如前所述构造数据包 |
’向服务器发送数据包 |
Set poster = CreateObject(“Microsoft.XMLHTTP”) |
poster.open “POST”, “CustomerOrder.asp”, False |
poster.send docSubmit |
’接收Resoponse消息 |
displayArea.innerHTML = poster.responseText |
End Sub |
Submit_OnClick方法首先创建XMLDOM对象用来装载XML数据,然后创建XMLHTTP对象以同步方式将数据包发送给服务器。在服务器处理完毕之后返回一个HTML页面作为响应消息。XMLHTTP对象按照文本字符串方式接收消息,并把它与DIV元素绑定起来,在浏览器中显示最终结果。 |
响应XML数据的基本过程与上面的这个例子是一样的,只是在接收时,使用responseXML属性,然后利用DOM技术对XML消息做进一步的处理。这样,一个完整的C/S交互过程就全部结束了。 |