当前位置:中国星空学习网首页>网络编程>ASP>正文  
用 XMLHTTP 实现伪 Web 服务

      本文揭示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 version=“1.0“?〉〈RESULTS error=“true“〉FALSE〈/RESULTS〉出错信息。
第四行:如果正确,DOM里就有查询结果,并可通过根节点的子节点长度求得结果数量。
第五行:如果有结果,就将结果绑定到表单上显示。

现在可以对gettitlesxml函数作些补充。
对BookViewer.ASP文件作一些改动就能增强gettitlesxml函数的查询功能。用户可以根据书籍的类型,价格和销售日期对书籍进行查询。下面就是改动的代码。注意文本框由原先的只读方式改为常规方式。

var xmlhttp = new ActiveXObject(“Msxml2.XMLHTTP“);
var where= ““;
if(document.frmFields.Stype.value.length〉0) where=where + “ type= ’“+document.frmFields.Stype.value+“’ AND “;
if(document.frmFields.Sprice.value.length〉0) where=where + “ price〈= “+document.frmFields.Sprice.value+“ AND “;
if(document.frmFields.Ssales.value.length〉0) where=where + “ ytd_sales〉= “+document.frmFields.Ssales.value;
if(where.length〉0) where = “ WHERE “ + where;
var xmlcmd=’〈?xml version=“1.0“?〉〈ENVELOPE〉〈XMLCMD c1=“gettitlesxml“ p1=“’+where+’“ p2=““ p3=““〉〈/XMLCMD〉〈/ENVELOPE〉’; xmlhttp.Open(“POST“, “xml_receive.asp“, false);  //用XMLHTTP向xml_receive.asp传送指令
xmlhttp.Send(xmlcmd);//发出XML指令

第二行到第六行:建立查询语句
第七行:与原先的代码不同在于增加了一个p1参数,它是由第二行到第七行代码建立的。

xml_receive.ASP文件的改动:
将新增的p1参数加入到Active X控件的GetTitlesXML函数中。

//************* Function gettitlesxml ***********************
if (c1==“gettitlesxml“)
{
   resultsXML=true; //加载结果的xml字符串
   var objWC= Server.CreateObject(“WebClass.xmlControl“); //初始化VB控件
   objWC.strServer=sqlServer; //指向SQL Server服务器
   xmlreturn=objWC.GetTitlesXML(p1); //VB函数,用XML字符串返回结果
   var objWC=null; //释放VB控件
}

结语
这里所作的一切是为了将ASP的客户互动应用技术提高一个档次。用户能够在一个简单的网页里访问数据库。查询过程由XMLHTTP在后台执行,给用户的感觉就象在用一个Windows程序而不是Web应用。本文涉及的是Web服务理念。比Web服务更为复杂的是SOAP协议,它能使Web服务更具有弹性。在一般情况下 (只要不是分布式应用),用上面给出的方法是足够的了。

按照上面描述的技术路线:
 客户端应用--〉ASP侦听页--〉Active X控件,以及Active X控件--〉ASP侦听页--〉客户端应用
提供的方法,可以在客户端和后台Active X控件之间建立通讯联系。ASP的侦听页可以给出用户需要的Active X控件的部分方法和属性,而将其他内容隐藏起来。在侦听页中可以建立加密机制。这样可以使得整个数据库安全性得到很大程度的提高。因为所有对数据库的访问都是通过Active X进行的,只要一些必需的访问函数暴露在ASP文件中。

 

上一篇: 用 xmlhttp 判断 url 是否存在
下一篇: Access 数据库表改名的一段代码
站内公告
栏目导航
 Windows系统
 Linux/DOS
 办公应用
 工具软件
 图形图象
 网络应用
 安全防御
 网络编程
 软件教程
 实用技术
最新文章
中国星空图片网
·人体艺术
·性感美眉
·生活自拍
·幽默搞笑
·超级帅哥
·精彩万花筒
·梦幻景色
中国星空探索网
·神秘追踪 灵异接触
·鬼故事 灵异空间 图片
·未解之谜 探索宇宙
中国星空两性网
·两性图文 我的性事 情人 成人幽默
·性爱技巧 两性测试 性爱误区
·性事花边 生育避孕 性保健 性疾病
·两性生理 文化 讨论 心理 知识
·爱人同志 非常男女 一夜情
中国星空算网命
·手机吉凶 QQ号码吉凶 周公解梦
·塔罗牌测试 狗年运程
·关公灵签 紫薇斗数 八字排盘
·测试:你的成功指数有多少
·测验你的家庭是否美满?
·面相: 面型 眼睛 耳朵 口唇
·手相:拉你一把奶油桂花手
·测试:你能成为大富翁吗?
联系方式 设为首页
中国星空旗下---中国星空学习网    Copyright 2005-2050 Year   xx.happy369.com  Networks.All rights reserved
中国星空网所有内容均来源于网络,版权属于原作者,如侵犯到您的权益,请与我们联系,我们将尽快予以删除或处理。
中国星空不承担由于内容的合法性及健康性所引起的一切争议和法律责任。
陕ICP备05011765号 联系我们 
《女人如烟》--演唱:魏佳艺