楼主: 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
41#
 楼主| 发表于 2006-7-9 00:20 | 只看该作者
参考资料
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • 获取 E4X 规范,ECMA-357
  • 找到 JavaScript 规范,ECMA-262
  • 尝试 Rhino,一种来自 Mozilla 的用于 Java 的 JavaScript。
  • 了解更多关于 Apache XMLBeans 项目的知识。
  • 在文章 “Ajax:A New Approach to Web Applications”(adaptive path,2005 年 2 月)中阅读更多关于 AJAX 的知识。
  • 从 Apache Web 站点下载 Axis
  • 着手于应用程序开发工具及 DB2®,Lotus®,Rational®,Tivoli® 和 WebSphere® 的中间件产品。您可以免费下载产品的测试版 ,或选择 developerWorks 免费的 Software Evaluation Kit 的 Linux® 或者 Windows® 版本。
  • 访问开发者书店来获得科技书籍的完整清单,其中了包括数以百计的 Web 服务主题
  • 参与 developerWorks blogs,加入 developerWorks 社区。
  • 想要更多资料吗?developerWorks 的 SOA 和 Web 服务专区有数以百计的科技文献以及关于如何开发 Web 服务应用程序的入门级、中级和高级教程。





作者简介


Paul Fremantle 是 IBM Hursley 开发实验室的架构设计师,主要从事 Web 服务和 XML 介质的研究。他是 Building Web Services in Java(第 2 版)的作者之一,同时还写了很多关于 XML 和 Web 服务的文章和书籍。


Anthony Elder 是 IBM Hursley 开发实验室的一名开发人员,主要从事 Web 服务、消息传递以及企业服务总线(Enterprise Service Bus,ESB)领域的工作。

使用道具 举报

回复
论坛徽章:
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
42#
 楼主| 发表于 2006-7-9 00:21 | 只看该作者

使用道具 举报

回复
论坛徽章:
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
43#
 楼主| 发表于 2006-7-10 23:29 | 只看该作者

第 2 部分
用 E4X 创建新的 Web 服务


2005 年 6 月 16 日

本文(由两部分组成的文章中的第二部分)中,我们将对 E4X 做更深层次的介绍。E4X(ECMAScript for XML) 是 JavaScript 的简单扩展,它使得在 JavaScript 中使用 XML 的脚本更简单易用。在本文章第一部分中,我们展示了一个名为 AJAX(异步 JavaScript 及 XML,Asynchronous JavaScript and XML)的 Web 编程模型,并且也展示了一些新的 JavaScript 的 XML 扩展是如何使其变得非常简单的。在本文章的第二部分中,我们将用 E4X 构建该交互过程中的服务器端,我们也会介绍如何用 JavaScript 来实现简单的 Web 服务。
在文章第 1 部分中,我们介绍了如何用 E4X 实现 Web 服务的客户端。本文将介绍在 Axis 中使用一个 E4XProvider 情况下,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
44#
 楼主| 发表于 2006-7-10 23:31 | 只看该作者
用 E4X 提供 Web 服务

我们已经成功的使用 E4X 调用 Web 服务,现在我们要用 E4X 提供 Web 服务。很多 Web 服务工具包使用这样的一种方法——就是把 XML 映射成本机语言的结构或者相反。例如 JAX-RPC(针对基于 XML 的 RPC 的 Java API)定义了如何将已存在的 Java 方法映射成可访问 SOAP 的服务。(如果想了解更多关于 JAX-RPC 的信息,请参阅参考资料。) 鉴于这篇文章的写作目的,我们将使用一种截然不同的方法。我们通过提供接受 XML 文档作为参数的方法来提供 Web 服务。在这个模型中,Web 服务就是一个简单的接收 XML 文档并返回 XML 文档的函数。

根据对 SOAP 解析程度的需要,我们有两种不同的签名。第一种签名方式与之前编写的客户端程序非常相像,我们只要编写以下程序:

[php]
function service(soapEnvelope) {
   // do things
   return newSoapEnvelope;
}

.........
[/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
45#
 楼主| 发表于 2006-7-10 23:31 | 只看该作者
这个模型依赖于可以完整解析和管理整个 SOAPEnvelope 的编码器。而更一般的情况是,我们希望使用一种稍微不同的模型,就是把对 SOAPEnvelope 的处理一分为二。在该模型中,一系列的“headler”用于处理 SOAP 消息头部,而“业务逻辑”处理消息主体。两种模型都有自身的优缺点,由于在 E4X 中拥有强大而易用的 XML 处理能力,因此我们可以轻松地使用这两种模型。

只含有消息体的签名看起来很类似:

[php]
function service(soapBody) {
   // do things
   return newSoapBody;
}
.........
[/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
46#
 楼主| 发表于 2006-7-10 23:32 | 只看该作者
我们将如何部署符合这个模型的服务?为了实现这一目的,我们在这篇文章中的例子里 提供了一种“宿主”技术——Apache Axis 提供者。提供者是这样一种方式:Axis 允许可插拔地插入新的服务提供者程序,而 E4X 提供者允许用户使用 E4X 脚本实现服务。
事实上,我们还有另外两种选择没有提到。第一种是在 J2EE 应用服务器中将 Rhino 和 E4X 插入到使用 JAX-RPC 和企业 Web 服务(EWS,也称作 JSR109)技术中。然而,这实际上有一定的困难,因为这些标准对于请求者与提供者采用标准的方法去访问整个 SOAP 包时并不容易。
总的来说,一个 Web 服务的容器(正如 Axis 或者一个实现 EWS 的 J2EE 服务器)为我们做了两件事。首先,这些容器具有工具与运行时环境支持使得在网络中传递的 XML 消息被映射成运行时系统中程序员所使用的对象。其次,他们通常为附加的 Web 服务标准提供支持,比如 Web 服务寻址(WS-Addressing)、Web 服务安全(WS-Security)和在消息中加入新的报头并且转换的 WS 事务(WS-Transactions),比如通过加密 XML 消息。我们这里所采用的方法将去除了在第一个方面的需要,因为这时我们已经将 XML 作为一个直接使用的本机对象,而不用再次的映射操作。
当然,可能的情况下在 E4X 中使用 Web 服务安全,可能不是那么有趣(我们还没有试过!)。所以将 E4X 嵌入到一个 Web 服务容器中非常有利。另一方面,如果您在实现一个非常简单的 Web 服务(比如没有 Web 服务 安全的考虑),您根本不需要一个 Web 服务容器。所以第三种选择就是将 Rhino/E4X 部署为一个 servlet 容器中的 servlet。如果您只是做简单的报头支持,比如说 Web 服务寻址,您可以在 E4X 中处理,实际上这个实现起来非常简单。
尽管在这篇文章中包括了 E4XServlet 和一个可以在下载中找到的样本压缩包的例子,但是我们着重介绍使用 Axis。
Axis 提供了一个非常简单的方法:通过将 JAR 文件加入到类路径环境变量中就可以加入新的提供者。为了实现这个方法,您需要 Axis 1.2 或者更高的版本。您可以从 Apache AXIS Web 服务引擎(请参阅参考资料)中下载。由于 Axis 之前发布的版本在保存脚本方面存在问题,所以我们推荐使用上面提到的版本。(如果遇到了类似服务器重新启动之后脚本不能工作的情况,可能是您使用的版本有这个缺陷,请使用新版本的 Axis 再次重新部署。)
E4X 提供者要求您使用 E4XProvider.jar(下面会用到)来更新 Axis 类路径,除此之外还要包含 rhino.jar 和 xbean.jar。
一旦更新了 Axis 类路径,您需要创建一个部署脚本并将其部署到 Axis 中。与使用一个 Java 实现的服务不同,在这个模型中我们不需要将任何代码部署到类路径中。相反,我们将代码放到部署描述符中,如本文中的一个例子 e4xstock.wsdd 所示。(请参阅下载。)

使用道具 举报

回复
论坛徽章:
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
47#
 楼主| 发表于 2006-7-10 23:33 | 只看该作者
清单 1. e4xstock.wsdd

[php]                               
<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  <service name="E4XStock" provider="java:E4X">
    <parameter name="type" value="body"/>
    <documentation>
       <![CDATA[
          function service(x) {
             var value = (x..*::Symbol=="IBM")?983:52.5;
         
             var n = new Namespace("urn:quoteservice");
             default xml namespace = n;
             response =
                <getQuoteReturn>
                   <Result>{value}</Result>
                </getQuoteReturn>;
             return response;
          }
       ]]>
    </documentation>

  </service>
</deployment>

..........
[/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
48#
 楼主| 发表于 2006-7-10 23:33 | 只看该作者
它首先定义了一套标准的命名空间(namespace)。<service> 元素定义了服务名称和提供者类型:E4XProvider 所提供的 E4X。

parameter 标记使您可以配置提供者的参数。这里 E4X 提供者支持的唯一参数是 type,它的值可以是 body 或是 envelope。在这个例子中,“body”意味着脚本仅仅需要处理消息体元素。

E4X 提供者使用 documentation 元素来存储脚本。这是个极其简便的实现方法——明智的方法往往不是偶然的!字符串 <![CDATA[ 与相应的 ]]> 允许我们在其中填写任意字符,包括脚本中的 "" 与 <>。

脚本本身定义了一个独立的函数,它以一个 XML 参数作为输入同时输出一个 XML。使用语法 x..*::Symbol 来摘取出符号。同时,这也是从 SOAP 主体中任意深度的任意命名空间来提取标记 Symbol。如果与等于“IBM”,我们设置值为 983。(好,对于我们的股票程序,我们已经有一点点希望了)否则,我们返回 52.5。

我们使用在第 1 篇文章中描述的 {} 语法来创建响应:

[php]
response =
   <getQuoteReturn>
      <Result>{value}</Result>
   </getQuoteReturn>;

..........
[/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
49#
 楼主| 发表于 2006-7-10 23:34 | 只看该作者
为了测试它,首先要象上面描述的那样正确设置类路径,以使 Axis 运行起来。我们假定 Axis 运行在本地 8080 端口。在本例中使用 SimpleAxisServer 已经足够了。现在键入:


[php]
> java org.apache.axis.client.AdminClient
   -l "http://localhost:8080/axis/services/AdminService" e4xstock.wsdd
(所有这些必须输入在同一行)
........
[/php]


如果前面的工作已正确完成,您将看到响应:


[php]
Processing file e4xstock.wsdd
<Admin>>Done processing</Admin>

........
[/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
50#
 楼主| 发表于 2006-7-10 23:35 | 只看该作者
现在,我们可以使用之前尝试的 Mozilla 客户端。首先,浏览 Axis 主页。您将看到如下所示的一些响应:
图 1. AXIS 服务主页

您可以点击 E4XStock 的 (wsdl) 链接,您将看到一个基本的 WSDL。您可以复制这个 wsdl 的 URL 地址并将它粘贴到第 1 部分中的 Mozilla 客户端。

使用道具 举报

回复

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

本版积分规则 发表回复

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