[返回]
计算机世界2002年10月21日

利用XMLHTTP优化数据传输

孟宪会

  在Web应用中,我们经常会需要记录客户端的状态,如果浏览器支持Cookie的功能,这样很好办,但如果用户禁止了Cookie功能,该如何记录客户端的信息呢?当我们提交新录或修改的数据时,我们希望只提交录入的数据信息而不提交与之无关的其它信息,利用XML数据岛和XMLHTTP可以轻松实现。一个比较理想的方法就是把INPUT和SELECT等控件绑定到XML数据岛,实际上,如果有更复杂的表单元素时,我们还可以利用XPATH进行处理,这样可以进行更加复杂的操作。利用XMLHTTP可以只提交数据信息,这样也可以减少网络流量。

下面就是简单的例子xmlhttpTest.htm:

 

<body>

<XML id="xmlTest">

<?xml version="1.0"?>

<root>

<Customer>

<customerid>00001</customerid>

<name>孟子E章</name>

<phone>13910309***</phone>

<address>北京市海淀区信息路</address>

<description><![CDATA[<html><body>支持html代码</body></html>]]></description>

</Customer>

</root>

</XML>

<script>

function update()

{

var oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

'这里换成你自己的ServerName和VirtualDir

oXmlHttp.Open("POST", "http://mengxianhui/asp/update.asp", false);

oXmlHttp.setRequestHeader("Content-Type","text/xml")

oXmlHttp.Send(xmlTest.xml);

if(oXmlHttp.status!="200")

{

alert("没有返回正确的数据类型。")

return false

}

xmlTest.loadXML(oXmlHttp.responseXML.xml);

}

</script>

 

<table align="center" cellspacing="6" style="font-size:11pt">

<FORM NAME="frmTest">

<tr>

<td>客户名称:</td>

<td><INPUT TYPE="text" dataSrc="#xmlTest" dataFld="name" style="width:400px"></td>

</tr>

<tr>

<td>客户电话:</td>

<td><INPUT TYPE="text" dataSrc="#xmlTest" dataFld="phone" style="width:400px"></td>

</tr>

<tr>

<td>客户地址:</td>

<td><INPUT TYPE="text" dataSrc="#xmlTest" dataFld="address" style="width:200px"></td>

</tr>

<tr>

<td>客户简介:</td>

<td>

<TEXTAREA dataSrc="#xmlTest" dataFld="description" rows="6" style="width:400px"></TEXTAREA>

</td>

</tr>

<tr>

<td colspan="2" align="center">

<INPUT TYPE="button" onclick="update()" VALUE=" 确 定 " style="background-color:#6F7EEF">

</td>

</tr>

</FORM>

</table>

</body>

 

这个HTML页面提供了一个数据岛来保存用户的信息,利用dataSrc和dataFld属性分别与Form表单元素进行绑定。XML数据岛将会实时反映出表单元素中数据的变化。通过点击“确定”按钮,将会调用update()函数,利用XMLHTTP把数据提交到服务器,同时利用XML数据岛的一个节点customerid来记录正在编辑的记录的状态。

下面就是简单的接收数据的代码update.asp:

 

<%

Dim xmldom

Set xmldom = Server.CreateObject("MSXML.DOMDocument")

Response.ContentType = "text/xml"

Response.CharSet = "GB2312"

xmldom.load Request

'可以在这里进行处理,然后返回到客户端

Response.Write "<?xml version=""1.0"" encoding=""GB2312""?>"

Response.Write xmldom.documentElement.xml

Set xmldom = Nothing

%>

 

如果只是测试,可以利用下面的代码update2.asp

 

<%

Response.ContentType = "text/xml"

Response.CharSet = "GB2312"

Response.Write "<?xml version=""1.0"" encoding=""GB2312""?>"

Response.Write "<root><Customer><customerid></customerid>"

Response.Write "<name>net_lover</name><phone>010-817939**</phone>"

Response.Write "<address>中国北京国际创业园</address>"

Response.Write "<description><![CDATA[<html><body>这种方式也支持HTML啊^_^</body></html>]]></description>"

Response.Write "</Customer></root>"

%>

 

一旦XML数据提交到服务器后,XML数据将保存到Request对象中,这样,我们可以把数据装载到XML DOM对象,利用XMLDOM对象的方便性进行各种处理,比如保存到数据库等,然后把结果返回到客户端。

其实,最实用的时候是把提交上来的XML数据交给Microsoft SQL Server 2000 来处理,在Microsoft SQL Server 2000 中进行数据的更新。

下面是利用Microsoft SQL Server 2000 来处理数据的例子update3.asp

 

Dim conn, cmd

Set conn = Server.CreateObject("ADODB.Connection")

Set cmd = Server.CreateObject("ADODB.Command")

conn.ConnectionString = "连接字符串写这里"

conn.Open

Set cmd.ActiveConnection = conn

cmd.CommandText = "update_stored_procedure" '调用存储过程

cmd.CommandType = 4

cmd.Parameters.Append cmd.CreateParameter("@xmldata", 200, 1, 8000, oXML.xml)

cmd.Properties("Output Stream") = Response 'IIS 5.0+支持

Response.Write "<root>"

cmd.Execute , ,1024

Response.Write "</root>"

 

在默认情况下,服务器端返回的是UTF-8格式的数据,为了避免乱码,在update.asp中,有一句Response.Write "<?xml version=""1.0"" encoding=""GB2312""?>",利用这句的输出,就可以避免因中文输出带来的乱码问题。另外,利用XMLHTTP提交,页面是不刷新的,也可以减少数据传输的流量。