楼主: lastwinner

[转载] AJAX 及使用 E4X 编写 Web 服务脚本

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
31#
 楼主| 发表于 2006-7-9 00:09 | 只看该作者
为了发送它,你必须使用 XMLHTTPRequest 对象。我们创建了一个简单的辅助函数,以支持使用 XMLHttpRequest 对象来调用使用 E4X 的服务。此 execService 函数不仅支持异步方式而且也支持同步方式。
[php]
function execService(url, xml, callback) {
   var xmlhttp = new XMLHttpRequest();
   var async=false;
   if (arguments.length==3) async=true;
      xmlhttp.open("POST", url, async);
      xmlhttp.setRequestHeader("SOAPAction", "\"\""
      xmlhttp.setRequestHeader("Content-Type", "text/xml"
      if (async) {
         var f = function() {
         if (xmlhttp.readyState==4) {
            callback(new XML(xmlhttp.responseText));
         }
      }

      xmlhttp.onreadystatechange = f;
   }
   xmlhttp.send(xml.toString());
   if (!async) return new XML(xmlhttp.responseText);
}
............
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
32#
 楼主| 发表于 2006-7-9 00:10 | 只看该作者
下面我们来详细地看看这些代码。首先,这些代码支持两种调用方式。您可以使用其中一种:

XML execService(String url, XML envelope);

或者

void execService(String url, XML envelope, function callback);

在这种情况下,回调函数应该是 void callback(XML x)。

于是您可以使用该函数直接调用 XML 服务,并且等待响应,或者您也可以传送一个函数,使用 XML 响应消息调用该函数。

该函数基于参数的数量来决定它是异步还是同步(3 是异步),然后简单地使用 XMLHttpRequest 对象以 POST 请求方式来把 XML 消息放到 HTTP 请求信息,并把请求发送到指定的 URL。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
33#
 楼主| 发表于 2006-7-9 00:10 | 只看该作者
我们设置了两个 HTTP 头信息——SOAPAction 和 Content-Type——然后使用 xmlhttp.send(xml.toString()) 将 SOAP 信封消息发送出去。

如果该调用行为是异步的,那么在调用从该响应创建的 XML 回调函数之前,它需要等待,直到 readyState 为 4(全部完成)。

因此使用该操作的代码如下所示:
[php]
   var url = document.getElementById("url".value;

   var callback = function(resp) {
      alert(resp..*::getQuoteReturn);
   }

   execService(url, envelope, callback);

................
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
34#
 楼主| 发表于 2006-7-9 00:11 | 只看该作者
在我们的样例中,我们使用异步模型。典型的 Web 浏览器在与服务器通话时并不阻塞,并且我们也不希望它那样。举例来说,如果我们阻塞了浏览器,那么浏览器的窗口可能最终表现为“不响应”状态,从而促使用户结束它。
resp..*::getQuoteReturn
如果您是 E4X 新手,那么需要再次理解该语法。.. 意味着从树中搜索命名的元素。*:: 意味着任意的命名空间,因此该数值将是在响应 SOAP 封装的任意命名空间中被称为 getQuoteReturn 元素的数值。
实际的样本代码 stockclient.html 同样也显示了该请求和响应 SOAP 封装。测试该样本——您应该看到如下内容:
图 2. 显示请求和响应 SOAP 封装的 stockclient.html

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
35#
 楼主| 发表于 2006-7-9 00:11 | 只看该作者
该 stockclient.html 看上去类似一个传统的使用提交按钮的 Web 页面,尽管它事实上并不是(浏览器一直在查看该页面,从未更改)。我们创建了该文件,以便您能理解交互行为。但是,真正的 AJAX 版本的页面要美观很多。此 stockclientAjax.html 没有按钮。随着您键入操作的进行,它会自动地更新股票价格。测试该样本。
图 3. AJAX 版本的 Web 页面——stockclientAjax.html

虽然该页面没有按钮,但是只要您停止键入操作,它就能自动地做出请求(在做出请求之前,它需要等待 0.6 秒钟,以便在您停止的时候它能够“感应”到)。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
36#
 楼主| 发表于 2006-7-9 00:14 | 只看该作者
最初由 lastwinner 发布
[B]该 stockclient.html 看上去类似一个传统的使用提交按钮的 Web 页面,尽管它事实上并不是(浏览器一直在查看该页面,从未更改)。我们创建了该文件,以便您能理解交互行为。但是,真正的 AJAX 版本的页面要美观很多。此 stockclientAjax.html 没有按钮。随着您键入操作的进行,它会自动地更新股票价格。测试该样本。
图 3. AJAX 版本的 Web 页面——stockclientAjax.html

虽然该页面没有按钮,但是只要您停止键入操作,它就能自动地做出请求(在做出请求之前,它需要等待 0.6 秒钟,以便在您停止的时候它能够“感应”到)。 [/B]



原文的图片就是无法显示……

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
37#
 楼主| 发表于 2006-7-9 00:15 | 只看该作者
生成来自 Rhino 的 Web 服务请求

Rhino 并不支持 XMLHTTPRequest 对象,但是这个问题您不必担心。因为 Rhino 运行在 Java 环境中,您可以使用 Java 功能来生成 Web 服务请求 。为演示该操作,我们编写了一个 XMLHttpRequest 对象的简单 Java 实现。Rhino 允许 Java 程序员发布 Java 语言来扩展它们的 JavaScript 环境。为了使用 Rhino shell 中的 XMLHttpRequest 对象,您只需确保 e4xutils.jar 在自己的类路径中,然后您就可以使用 shell 命令,defineClass,将其添加到自己的环境中:

[php]
>set classpath=.\js.jar;.\xbean.jar;.\e4xutils.jar;.
>java org.mozilla.javascript.tools.shell.Main
Rhino 1.6 release 1 2004 11 30H
js> defineClass('xmlhttp.XMLHttpRequest');


...............
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
38#
 楼主| 发表于 2006-7-9 00:16 | 只看该作者
下面有个很简单的脚本程序对其进行测试:
[php]
>test.js
defineClass("xmlhttp.XMLHttpRequest";
var xh = new XMLHttpRequest();
xh.open("GET",
"http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl",
false);
xh.send(null);
var wsdl = new XML(xh.responseText);
print(wsdl..*::address.@location);

>java org.mozilla.javascript.tools.shell.Main test.js
http://64.124.140.30:9090/soap
..............
[/php]

结果就是您现在可以使用您已经在 Mozilla 和 Rhino 中写入(E4X+XMLHttpRequest)的相同的脚本程序。在本文的第二部分中,我们将在一些很有意义的场景中使用该功能。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
39#
 楼主| 发表于 2006-7-9 00:17 | 只看该作者
结束语

到目前为止,您已经看到了如何使用 E4X 和 Javascript 来初始化 Web 服务请求。在下一篇文章中,我们将向您展示如何使用 E4X 来提供 Web 服务。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
40#
 楼主| 发表于 2006-7-9 00:19 | 只看该作者
下载

描述 Source code for this article   
名字 ws-ajax1code.zip
大小 75 KB  
下载方法  FTP

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表