精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..网络程序开发..〓〓>>网络高级应用>>用VB和XML建立集中式应用程序(下)

主题:用VB和XML建立集中式应用程序(下)
发信人: fancynet()
整理人: winsy(2003-03-09 13:23:08), 站内信件
用VB和XML建立集中式应用程序(下) 
(作者:青苹果工作室编译 2001年03月19日 15:41) 

传送消息及接收数据  
  客户端的XML消息由一个带有几个子元素的<command>元素构成:一个包含着存储过程名称的<commandtext>元素;一个<returnsdata> 元素,它告诉服务器客户端是否期待返回数据;返回零个还是多个包含着参数信息的<param>元素。在这个最简单的没有参数的情况下,传送的字符串查询类似于:  

  <command>  

   <commandtext>  

     StoredProc or Dynamic SQL  

   </commandtext>  

   <returnsvalues>True</returnsvalues>  

  </command>  

  要添加参数,就需要为每一个参数添加一个<param>元素。每个<param>元素有五个子元素:<name>、<type>、<direction>、<size>和<value>。五个子元素的先后次序无关紧要,但都是必须的。通常,依照定义ADO Parameter对象所需的次序定义它们。例如,存储过程CustOrderHist需要一个CustomerID参数,所以创建传送到 detData.asp的XML字符串的代码就是:  

  dim s  

  s = "<?xml version=""1.0""?>" & vbcrlf  

  s = s & "<command><commandtext>"  

  s = s & "CustOrderHist"  

  s = s & "</commandtext>"  

  s = s & "<returnsdata>" & "True</returnsdata>"  

  s = s & "<param>"  

  s = s & "<name>CustomerID</name>"  

  s = s & "<type><%=adVarChar%></type>"  

  s = s & "<direction>" & "<%=adParamInput%></direction>"  

  s = s & "<size>" & len(CustomerID) & "</size>"  

  s = s & "<value>" & CustomerID & "</value>"  

  s = s & "</param>"  

  s = s & "</command>"  

  注意前面的代码是在客户端的;ADO常量没有在客户端定义,这是它们必须用<% %>标记括起来的原因。在发送应答之前,服务器用正确的值替换它们。页面getData.asp有一个Response.ContentType属性,其数值为"text/xml";因此,我们就能使用ResponseXML属性查询结果。当查询返回一个记录集合时,可以创建一个Recordset对象并像以下代码那样使用XMLHTTP-Request对象的responseXML属性来打开它:  

  Dim R  

  set R = createObject("ADODB.Recordset")  

  R.open xhttp.responseXML  

  当通过输出参数返回查询数据时,可以通过将一个变量设置为XMLHTTPRequest对象的responseXML属性来创建一个DOMDocument:  

  Dim xml  

  set xml = xhttp.responseXML  

  使用输出参数时,XML字符串包含和每个返回值相对应的一个元素。每个元素都是<values>根元素的一个子元素。例如:  

  <?xml version=""1.0""

   encoding=""ISO-8859-1""?>  

  <values>  

   <paramname>value</paramname>  

   <paramname>value</paramname>  

  </values>  

  如果数据包含外语字符,就有可能需要修改encoding属性。ISO-8859-1编码能很好地支持大多数西欧语言。  

  各种情况下,客户端页面都会使用返回值来格式化一个HTML字符串,这个字符串放在屏幕右侧的div标记里的。客户端页面使用div对象的innerHTML属性来进行显示:  

  document.all("details").innerHTML =  

   <some formatted html string>  

为不同类型的客户端服务  
  ASP页面让我们方便地看到应用程序到底都做了些什么,但你能用相同的技术建立使用任何技术的客户端程序。可下载代码中包含了像ASP页面一样地显示数据的Visual Basic工程文件,但是VB工程并不创建它传送到服务器上的XML字符串。相反,在启动时它通过一个称为Initialize的存储过程从服务器查询它们,这个过程简单地从叫做ClientCommands的数据表里查找这些内容。  

  数据表ClientCommands包含两个字段:command_name和command_xml字段。客户端程序接收三个特定的command_name:getCustomerList、CustOrderHist和recentPurchaseByCustomerID。这些命令的command_xml字段包含了程序发送到getData.asp页面的XML字符串,如此就集中地控制了XML字符串的格式以及存储过程的“真实”名称。在将XML字符串发送到getData.asp前,客户端程序使用XML DOM来设置存储过程的参数值。可下载的代码包含定义Initialize过程和创建并维护数据表ClientCommands的SQL代码。  

右图显示了 VB客户端程序。图中,示例程序的VB版本显示了同基于浏览器版本大致相同的信息,只不过它使用的是bound data grid控件,而不是 HTML。  
  示例应用程序演示了使用XHTTPRequest对象来兑现本文开头中所做的许诺。应用程序工作在能访问getData.asp的任何远程计算机内。我们能通过IIS或NTSF权限设置限制对ASP页面的访问,并且能在服务器而不是客户机上保存应用程序的全局设置。这样就避免了通过网络发送数据库的用户名和口令,而且在IE中应用程序按照需要显示数据而不是刷新整个页面。  

结语  
  在该应用的正式产品代码中,我们能用很多种方法使应用程序更有效。比如,我们能从ASP页面中去掉数据查询代码,并将其放到一个COM应用程序中;或者,我们还可以创建XSLT变换器以显示返回的数据。最后,通过放弃动态页面更新,并在服务器上进行XSLT变换,我们能够扩大客户端程序的应用范围。现在需要的做的,就是去尝试。  
——转载自赛迪网


                                  


----
北京网络工具(NetTool)斑竹
Oicq:8762220 Icq:89170510
E-Mail:[email protected]

                              

[关闭][返回]