几个月以前,一个同事到我这里来,说他有一个客户端JavaScript的问题。我不得不向他解释说,活动服务器页面(ASP)的区段变量不能从客户端访问,除非它们通过cookie或者隐藏的输入框被传递。但是我没有停止继续寻找从客户端访问ASP区段变量更好方法的工作。
最近在研究如何不需要上传和下载页面就能够从服务器获取信息时,我读到了关于XMLHTTP ActiveX对象的内容。从本质上讲,这个对象为Internet Explorer和Web服务器通讯并接收回应提供了一种方法。它是MSXML动态加载库的一部分,其当前的版本是第4版,并能从微软免费下载。同样值得重要的是,注意对于微软Internet Explorer 5.x,MSXML缺省的版本还是第2版。
XMLHTTP基础
你可以使用XMLHTTP对象在服务器上执行一个ASP,等待服务器的回应,然后根据回应来动作。这意味着有了一个JavaScript函数和一个专用的动态服务器页面,就有可能解决从客户端访问变量的问题。客户端需要区段变量的值吗?没问题!你要做的全部工作就是调用一个小小的函数。
实现XMLHTTP对象
只要开始试着实现以前没有尝试过的概念或特性,我通常会发现把问题分解成逻辑件会更容易一些。在这种情况下,我从服务器端的和客户端的开始。心里有这个概念,我命名为test.asp的服务器端活动服务器页面看起来就是这个样的了:
<%@ Language=VBScript%>
<%
Response.Write
Session(Request.QueryString("variable"))
%>
这个服务器端代码段的目的是返回任何和查询字符串里同键相关联的ASP区段变量的值。
由于请求是从客户端发起的,而且有一个对象正在被使用,所以客户端这一部分会更详细。创建XMLHTTP对象、设置对象的属性、调用对象的发送方法,以及根据对象返回的信息进行动作,这些都是有必要的。Listing A是执行这些任务的JavaScript。
要进一步检查XMLHTTP的可能性,就有必要往回走一步,这是因为利用URL把查询信息从客户端送到服务器端是有局限性的。URL最大长度限定为2,048字节。这2KB的最大长度还包括了URL的非查询字符串这部分。要更进一步就要找到一种更好的方法,把信息从客户端送到服务器端。
我只花了大约20分钟就决定好了如何把信息从客户端传递到服务器端。我决定使用HTTP。在你确定我脑子发懵但已经回过神以前,让我来解释一下。我要在HTTP报头里传递信息。通过包头来传递信息就能够避免使用URL传递信息所无法避免的2,048字节的限制。
心里有了这些,现在就需要修改通过URL传递信息的例子了。在客户端不是要把参数添加到test.asp的URL里,而是XMLHTTP对象的setHeader方法会传递这个参数。进行这样的修改就产生了Listing B里的客户端程序。
在服务器端,有必要从HTTP报头里而不是请求对象的查询字符串里取回区段变量名。其结果是:
<%@ Language=VBScript %>
<%
Response.Write Session(Request.ServerVariables("HTTP_test"))
%>
更进一步
我在这里所描述的对象叫做XMLHTTP。注意这个对象的头3个字母是XML。你已经见过了如何在客户端和服务器端传递信息,但是XMLHTTP对象的初衷是允许信息作为XML在客户端和服务器端传递信息。在以后的文章里,我会解释如何使用XML的简单对象访问协议(SOAP)来交换更加复杂的信息。