新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → 利用xml(xmldom,xmlhttp)进行客户机与服务器的数据交互(转) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4904 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 利用xml(xmldom,xmlhttp)进行客户机与服务器的数据交互(转) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     diegor 帅哥哟,离线,有人找我吗?白羊座1979-4-10
      
      
      威望:4
      等级:大二(研究C++)|大二(研究汇编)
      文章:266
      积分:806
      门派:XML.ORG.CN
      注册:2004/3/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给diegor发送一个短消息 把diegor加入好友 查看diegor的个人资料 搜索diegor在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看diegor的博客楼主
    发贴心情 利用xml(xmldom,xmlhttp)进行客户机与服务器的数据交互(转)

    1、C/S的通信模式
    我们在前面文章中讨论客户机与服务器的数据交互时,数据流的方向总是从服务器到客户机,很少涉及到客户机向服务器发送请求并处理返回信息的问题。实际上,在电子商务中,客户机向服务器发送数据也是一个重要的环节,如用户填写的货物订单等。
    在传统的实现方案中,用户端只要在订单中做出微小的变动,就要向服务器发送消息,要求更新数据。这样就增加了服务器和网络的负载,降低了工作效率。更有效的工作方式是在客户机端对变更的信息进行缓存,然后分批定量地发送给服务器,这样一些不确定的修改信息都首先存储在客户机,只有那些确定的需要更新的数据才会发送出去,从而避免了网络和服务器做许多无谓的操作。
    2、基于XML的C/S
    使用XML进行C/S间的通信是一种高效的工作方式。首先在客户机对XML数据打包,然后以XML数据包为单元发送给服务器,服务器在处理完数据之后返回消息,客户机接收到消息后执行其他操作,从而结束一次通信周期。
    具体实现步骤如下:
    ● 客户机构造一个XMLDOM对象,作为发送XML数据的载体;
    ● 客户机创建一个XMLHTTP对象,该对象包括多种方法和属性,可以发送XML数据到服务器上的应用程序(如ASP页面),同时准备接收响应信息;
    ● 客户机将XML数据包转载到XMLHTTP对象上并发送给ASP页面;
    ● 服务器执行ASP,并创建一个服务器端XMLDOM对象来接收XML数据;
    ● ASP把数据包装载到服务器端的XMLDOM对象上;
    ● ASP对XML数据进行必要的处理,并返回确认消息;
    ● 客户机接收响应消息,执行下一步操作。
    3、向服务器发送数据
    客户机的首要任务是构造XML数据包。XMLDOM作为数据包的载体其数据来源可以是任何XML文档或是XML文档的片段(如XML数据岛),甚至可以是使用loadXML方法接收用户输入信息后动态生成的XML文档。
    下面是动态生成的一个XML文档:
    Set docSubmit = CreateObject(“Microsoft.XMLDOM”)
    docSubmit.async = False
    docSubmit.loadXML  
    “<?xml version=‘1.0’?>”&  
    “<customerorder>” &  
    “<customer>”&  
    txtCustomerID.Value &  
    “</customer>”&  
    “</customerorder>”
    如果用户输入“5”作为用户ID,那么上面程序的运行结果如下所示:
    <?xml version=‘1.0’?>  
    <customerorder>
    <customer>5</customer>
    </customerorder>
    接下来,将XML数据添加到DOM树的<customer>元素之后。
    比如有如下的一个XML数据岛:
    <xml id=“dsoOrder”>
    <?xml version=“1.0”?>
    <order>
    <orderitem title=“Sushi, Anyone?” isbn=“72-80081-025”>
    <price>14.99</price>  
    <quantity>2</quantity>
    </orderitem>
    </order>
    </xml>
    利用前面介绍的DOM技术访问<order>元素:
    Set docOrder = dsoOrder.XMLDocument
    Set nodeOrder = docOrder.selectSingleNode(“//order”)
    <order>元素是dsoOrder数据岛中的一部分,要把它添加到其他的DOM树中(比如前面的XML数据包),必须把<order>元素及其所有的后继节点进行备份,这是因为appendChild方法在把操作对象添加到其他DOM树中后,就从当前的DOM树中删除该对象!所以必须先调用cloneNode方法:
    Set nodeOrderToSend = nodeOrder.cloneNode(True)
    docSubmit.documentElement.appendChild nodeOrderToSend
    经过以上操作,最后形成的数据包为:
    <?xml version=“1.0”?>  
    <customerorder>
    <customer>5</customer>
    <order>
    <orderitem title=“Sushi, Anyone?” isbn=“72-80081-025”>
    <price>14.99</price>
    <quantity>2</quantity>
    </orderitem>
    </order>
    </customerorder>
    4、XMLHTTP对象的Open方法
    数据包构造完毕之后,就可以利用HTTP Request对象把数据包发送给服务器。MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
    创建XMLHTTP对象的语句如下:
    Set poster = CreateObject(“Microsoft.XMLHTTP”)
    对象创建后调用Open方法对Request对象进行初始化,语法格式为:
    poster.open http-method, url, async, userID, password
    Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下表所示:
    参数 说明
    http-method HTTP的通信方式,比如GET或是 POST
    url 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
    async 一个布尔标识,说明请求是否为异步的。如果是异步通信方式,客户机就不等待服务器的响应;如果是同步方式,客户机就要等到服务器返回消息后才去执行其他操作
    userID 用户ID,用于服务器身份验证
    password 用户密码,用于服务器身份验证

    在下面这个例子中,客户机就是使用异步方式向“CustomerOrder.asp”页面发送了一个POST请求:
    poster.open "POST", "CustomerOrder.asp", False

    5、XMLHTTP对象的Send方法
    用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
    poster.send XML-data
    Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
    XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
    值 说明
    0 Response对象已经创建,但XML文档上载过程尚未结束
    1 XML文档已经装载完毕
    2 XML文档已经装载完毕,正在处理中
    3 部分XML文档已经解析
    4 文档已经解析完毕,客户端可以接受返回消息

    6、 服务器端的数据处理  
    服务器在接收到客户机发送过来的数据包后,会马上处理数据,并做出相应的响应。服务器先创建一个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
    ……
    %>
    7、服务器端的响应消息
    服务器在处理完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>
    8、客户机处理响应信息
    客户机接收到返回消息后,进行简单的处理,基本上就完成了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交互过程就全部结束了。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    坚决支持XML!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/7 10:33:00
     
     kxxxx001 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:59
      积分:167
      门派:XML.ORG.CN
      注册:2004/4/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给kxxxx001发送一个短消息 把kxxxx001加入好友 查看kxxxx001的个人资料 搜索kxxxx001在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看kxxxx001的博客2
    发贴心情 
    好东西,收下了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/7 11:14:00
     
     阿ken 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:38
      积分:181
      门派:XML.ORG.CN
      注册:2004/4/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给阿ken发送一个短消息 把阿ken加入好友 查看阿ken的个人资料 搜索阿ken在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看阿ken的博客3
    发贴心情 
    牛!不过,不知用xsl而不是用dom是不是更简单一些?该如何实现呢?望高手赐教
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/10 9:48:00
     
     锋划雪月 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:49
      积分:127
      门派:XML.ORG.CN
      注册:2004/3/18

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给锋划雪月发送一个短消息 把锋划雪月加入好友 查看锋划雪月的个人资料 搜索锋划雪月在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看锋划雪月的博客4
    发贴心情 
    我也支持!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/10 13:24:00
     
     Brooklyn 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:56
      门派:XML.ORG.CN
      注册:2004/4/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Brooklyn发送一个短消息 把Brooklyn加入好友 查看Brooklyn的个人资料 搜索Brooklyn在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Brooklyn的博客5
    发贴心情 
    好文章,支持一下!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/16 13:32:00
     
     孤独 帅哥哟,离线,有人找我吗?
      
      
      威望:7
      等级:大三(面向对象是个好东东!)(版主)
      文章:826
      积分:4220
      门派:XML.ORG.CN
      注册:2004/1/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给孤独发送一个短消息 把孤独加入好友 查看孤独的个人资料 搜索孤独在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看孤独的博客6
    发贴心情 
    收藏~

    ----------------------------------------------
    <?xml version="1.0" encoding="gb2312"?>
    <个人签名>
      <Website>[url=http://www.mahaobo.cn]
    MaHaobo.cn[/url]
    </Website>
    <Email>aloning(at)gmail.com</Email>
      <Qq >32113739</Qq>
    </个人签名>

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/16 18:29:00
     
     浪子9527 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:63
      门派:XML.ORG.CN
      注册:2004/4/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给浪子9527发送一个短消息 把浪子9527加入好友 查看浪子9527的个人资料 搜索浪子9527在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看浪子9527的博客7
    发贴心情 
    怎么在xml文档中附加文件上传呢?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/17 23:09:00
     
     ibm123 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:53
      门派:XML.ORG.CN
      注册:2004/4/18

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ibm123发送一个短消息 把ibm123加入好友 查看ibm123的个人资料 搜索ibm123在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看ibm123的博客8
    发贴心情 
    up一下
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/18 18:10:00
     
     无忧的鱼 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:11
      积分:107
      门派:XML.ORG.CN
      注册:2004/4/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给无忧的鱼发送一个短消息 把无忧的鱼加入好友 查看无忧的鱼的个人资料 搜索无忧的鱼在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看无忧的鱼的博客9
    发贴心情 
    关注中
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/26 14:59:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/9/21 4:28:40

    本主题贴数9,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    5,171.875ms