Ajax已普遍用于许多知名的Web应用程序服务,例如GMail、GoogleMaps、Flickr和Odeo.com。通过使用异步XML消息传递,Ajax为Web开发人员提供了一种扩展其Web应用程序价值和功能的途径。这里介绍的WebServicesJavaScriptLibrary扩展了该基础机制,其通过引入对调用基于SOAP的Web服务的支持来增强Ajax设计模式。从浏览器中调用Web服务从Web浏览器中调用SOAPWeb服务可能会比较麻烦,这是因为大多数流行的Web浏览器在生成和处理XML方面都略有不同。所有浏览器都一致实现且用于XML处理的标准API或功能少之又少。浏览器实现人员一致支持的机制之一是XMLHttpRequestAPI,它是Ajax设计模式的核心。developerWorks网站最近发布的另一篇由PhilipMcCarthy撰写的的文章详细介绍了该API。XMLHttpRequest是一个用于执行异步HTTP请求的JavaScript对象。PhilipMcCarthy在其文章中描述了一个顺序图(请参见图1),此图对于理解XMLHttpRequest对象如何支持Ajax设计非常有帮助(请参阅参考资料,以获得指向全文的链接)。图1.PhilipMcCarthy的Ajax顺序图请访问Ajax技术资源中心,这是有关Ajax编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki和新闻。任何新信息都能在这里找到。从此图中,您可以清楚地看到XMLHttpRequest对象是如何工作的。一些运行在Web浏览器内的JavaScript创建了一个XMLHttpRequest实例和一个用于异步回调的函数。然后,该脚本使用XMLHttpRequest对象对服务器执行HTTP操作。在接收到响应后,调用回调函数。在该回调函数内,可能处理返回的数据。如果返回的数据碰巧是XML,则XMLHttpRequest对象将自动使用浏览器中内置的XML处理机制来解析该数据。遗憾的是,使用Ajax方法的主要难题在于XMLHttpRequest对象自动解析XML的详细过程。例如,假设我正在请求的数据是一个SOAP信封,其包含来自许多不同XML命名空间的元素,并且我希望提取yetAnotherElement中属性attr的值。(请参见清单1)清单1.一个包含多个命名空间的SOAP信封在Mozilla浏览器和Firefox浏览器中,提取attr属性值非常简单,如清单2所示。清单2.在Mozilla和Firefox中检索attr属性值的方法不能运用在InternetExplorer中varm=el.getElementsByTagNameNS('urn:example','yetAnotherElement')[0].getAttributeNS('urn:foo','attr');alert(m);//displays'abc'遗憾的是,以上代码无法在InternetExplorerVersion6中运行,因为该浏览器不仅没有实现getElementsByTagNameNS功能,而且事实上还使用了一种很糟糕的方法——将XML命名空间的前缀作为其元素和属性名称的一部分来对待。InternetExplorer缺少对XML命名空间的支持,这使得它很难处理命名空间密集的XML格式,例如采用独立于浏览器的方式的SOAP。即使要执行一些像提取结果中的属性值这样简单的操作,您也必须编写能够在多个浏览器中实现一致预期行为的特殊代码。幸运的是,这种特殊代码可以封装并重用。为了从Web浏览器中调用Web服务,并可靠地处理SOAP消息,您需要首先了解一些安全问题(请参见侧栏“关于安全性”)。此外,您还需要编写一个JavaScript脚本库(图2),以便将底层浏览器XML实现中的不一致情况抽象出来,从而使您能够直接处理Web服务数据。图2.在使用WebServicesJavaScriptLibrary的Web浏览器中通过Javascript调用Web服务关于安全性由于涉及许多实际安全问题,因此在缺省情况下,大多数Web浏览器中的XMLHttpRequest对象都限制为只能与用户正在查看的Web页所在的域中承载的资源和服务进行交互。例如,如果我正在访问一个位于http://example.com/myapp/的页面,则XMLHttpRequest将只允许访问位于example.com域中的资源。对于阻...