用XMLHTTP实现伪Web服务[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 chinaok 的 blog

本文揭示xmlhttp的神秘面纱。我很喜欢使用xmlhttp,主要是因为它能够将任何activex类方法展示给客户。就是说,你能够让客户调用你的activex控件。

===========================================================
本文揭示xmlhttp的神秘面纱。我很喜欢使用xmlhttp,主要是因为它能够将任何activex类方法展示给客户。就是说,你能够让客户调用你的activex控件。最主要的是所有的通讯都是在后台进行的。使用xmlhttp能够扩展对数据库的存取能力。提交查询申请时,用xmlhttp向asp侦听(服务)页发出xml格式的指令,asp网页随即解释该命令并调用vb activex控件里的方法。这个vb控件用xml字符串形式将查询结果返回给asp服务页,再由服务页将结果组装成xml格式返回给用户。在作这一系列事情时,不需对当前网页进行重加载。用户甚至不知道后台在作些什么。

在本文末尾可以下载有关示例源程序。

本文示例对系统的要求是:
ms sql server(包含pubs数据库示例),
ms ie 5.0+,
msxml 3.0解析器,
ms iis - 将示例中所有的asp文件,css,及mybooks.xml文件拷贝到服务器的一个虚路径下。

将bookview.asp, xml_receive.asp, mybooks.xml, default.css, 和book.css等文件拷贝到服务器的一个虚路径下。
在服务器上注册webclass.xmlcontrol(webclass.dll)。
在xml_receive.asp文件里设置sql server服务器名。
在webclass.xmlcontrol类里设置你的用户名和口令。

来看看xmlhttp的功能:

客户端:这里是bookviewer.asp文件中的一段代码,用xmlhttp来存取pubs数据库的books:
var xmlhttp = new activexobject("msxml2.xmlhttp"); //创建xmlhttp对象
var xmlcmd='<?xml version="1.0"?><envelope><xmlcmd c1="gettitlesxml" p1="" p2="" p3=""></xmlcmd></envelope>';
xmlhttp.open("post","xml_receive.asp", false); //准备用xmlhttp向xml_receive.asp发送指令
xmlhttp.send(xmlcmd); //发出指令

第一行:创建xmlhttp对象的引用。
第二行:创建xml指令。注意:可以不用xml格式而使用普通文件构造指令。之所以用xml格式,是因为它容易解析指令本身和指令的参数。
第三行:打开连接。其中第一个参数是http方法(最常使用的不是"post"就是"get")。第二个参数指向执行指令的url路径。第三个参数决定是否异步执行。另外还可以加上二个参数,即用户名和口令。在上面的例子中,我用http post呼叫xml_receive.asp网页(我称它为侦听页),要求同步进行查询工作(在完成查询前不做其他事)。
第四行:发出指令,开始工作。注意:指令是由第二行代码作出的。因为使用了同步执行方式,现在只能坐等结果返回。

侦听页(xml_receive.asp)工作基础
我把这个网页称为侦听页,是因为它在服务端坐等xmlhttp指令的到来。收到查询请求后,它要做三件事。
首先,将查询请求加载到xml dom,并对指令及其参数进行解析。
其次,根据客户要求,调用后台active x控件的处理方法。后台active x控件将执行结果用xml字符串返回。
第三,将返回结果加载到xml dom并用response对象返回给用户。
[译者注:这是一种很典型的三层应用,可以举一反三。]

以上三步骤具体执行如下:

侦听页(第一步 - 指令解析):
以下是xml_receive.asp文件中的一段代码,后面附有注释。这段代码用于解析接收到的查询指令和参数(parameter1, parameter2, parameter3)。参数的数量可以任意增加。

    var doc = server.createobject("msxml2.domdocument");
    doc.load(request); //将xmlhttp请求加载到xml dom进行解析
    var c1=doc.childnodes.item(1).childnodes.item(0).attributes.item(0).text; //指令
    var p1=doc.childnodes.item(1).childnodes.item(0).attributes.item(1).text; //参数1
    var p2=doc.childnodes.item(1).childnodes.item(0).attributes.item(2).text; //参数2
    var p3=doc.childnodes.item(1).childnodes.item(0).attributes.item(3).text; //参数3
    if (doc.childnodes.item(1).childnodes.length==2) //检验xml
    var passedxml=''+doc.childnodes.item(1).childnodes.item(1).xml;
    var xmlreturn=''; //初始化返回值
    var doc=null; //释放xml dom

侦听页(第二步 - 调用后台active x控件的适当方法):
以下是xml_receive.asp文件中调用"gettitlesxml"方法的一段代码。它创建active x对象并调用其中的gettitlesxml()方法来返回pubs数据库的查询结果。记住,结果是用xml字符串方式返回。

//************* function gettitlesxml ***********************
if (c1=="gettitlesxml")
{
   resultsxml=true; //加载结果的xml字符串
   var objwc= server.createobject("webclass.xmlcontrol"); //初始化vb控件
   objwc.strserver=sqlserver; //指向sql server服务器
   xmlreturn=objwc.gettitlesxml(); //vb函数,用xml字符串返回标题
   var objwc=null; //释放vb控件
}

侦听页(第三步 - 返回结果):
以下是xml_receive.asp文件中的一段代码,将查询结果返回给用户。这里包括创建结果dom,加载结果到dom,检查加载是否正确,最后用asp的response对象将结果返回给用户。注意:是用xml dom的save方法返回结果,其参数为response,表示将结果存入response输出流。

var result =  server.createobject("msxml2.domdocument"); //创建结果xml dom

if (resultsxml) //加载xml字符串
{
   result.loadxml(xmlreturn); //调用loadxml将字符串加载到dom
   if (c1=="savemybooks") result.save(server.mappath(p1)); //如果需要,保存xml文件
}

if ( result.parseerror.errorcode!=0 ) //解析出错
{
   //返回结果
   xmlreturn='<?xml version="1.0"?><results error="true">false</results>';
   result.loadxml(xmlreturn); //将出错信息加入到结果
}

//用asp response对象将结果返回给用户
response.contenttype = "text/xml"; //返回xml格式文件
result.save(response);//将dom存放到httpresponse输出流
var result = null;

返回到客户端(bookviewer.asp)
服务端工作时,客户端只有耐心等待。一旦收到返回结果,就将其加载到xml dom,并用asp表单显式。

objsallbooks.load(xmlhttp.responsexml); //将返回值加载到dom
var xmlhttp = null;
//检验返回是否出错
if (objsallbooks.childnodes.item(1).childnodes.item(0).nodevalue=="false") snumberofbooks=0;
else snumberofbooks=(objsallbooks.childnodes.item(1).childnodes.length); //设置books数量
if (snumberofbooks>0)             display_book(0,1); //显式第一本书籍名

第一行:将xmlhttp的response加载到xml dom对象objsallbooks中去。xmlhttp另外还有responsetext方法用于加载普通文件。
第二行:因为已经建立了xml dom,可以不再需要xmlhttp了。

本文关键:XML,XMLHTTP,Web
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top