`

SOAP净化有线协议(三):用脚本语言编写服务

阅读更多

 你是一个渴望永远站在技术最前沿的Java开发者吗?软件产业风云变幻,你渴望把握Web的未来,更重要的是,如何把自己数年的Java经验发挥到极致。要寻找这些问题的答案,你不必走得太远,答案就在于SOAP。

SOAP(简单对象访问协议)是一种利用XML编码数据的有线协议,它为Java的平台无关性、可移植性带来了更高层次的协同操作能力。在这个关于 SOAP的系列文章的第二篇中,我介绍了Apache SOAP。作为SOAP规范的实现之一,Apache SOAP简化了SOAP应用的构造。我们曾经用Apache SOAP构造了两个简单的HelloWorld服务,以及调用这些服务的sayHelloTo()方法的客户程序。我们看到,虽然创建SOAP服务相当简 单,但客户程序必须完成许多额外的工作,例如它必须设置Call对象,调用Call对象的invoke()方法,然后分析作为调用结果返回的 Response对象。

其实,用Apache SOAP创建SOAP服务的过程还可以变得更简单,唯一的前提是:你必须懂得规定的几种脚本语言之一。对我来说——以及对大多数Java开发者来说,幸运 的是,这些脚本语言中包含了JavaScript。确实不错,在Apache SOAP中,你可以用JavaScript创建SOAP服务。本文要介绍的就是用JavaScript创建SOAP服务的具体做法。

一、重新构造Apache SOAP
Apache SOAP的脚本支持建立在Bean Scripting Framework(BSF,Bean脚本框架)的基础之上。BSF原先由IBM开发,现在作为一个源代码开放的工程发行,它使得Java程序能够运行用 其他语言编写的脚本,也使得其他脚本语言能够使用已有的Java类。Apache SOAP利用了BSF的前一种能力。从Apache网站下载的标准二进制版本不支持脚本。具体地说,soap.jar不包含 org.apache.soap.server.InvokeBSF类,而这个类是Apache SOAP和BSF的结合点和接口。Apache SOAP的开发者知道,并非每一个使用SOAP的人都需要BSF,也并非每一个人都安装了脚本引擎,所以在soap.jar中省略了脚本支持。要想用脚本 编写SOAP服务,你必须从源代码重新构造以便引入InvokeBSF类。

首先要从http://xml.apache.org/dist/soap/下载源代码(soap-src-2.0.zip)。然后,把下载得到的文件解 压缩到Apache SOAP所安装的目录。在我这里,它是E:驱动器的根目录。完成后,你将在soap_2-0目录下得到一个src子目录,子目录中包含Apache SOAP的所有源代码。重新从源代码构造Apache SOAP之前,你还必须下载必需的BSF jar文件。在ftp://ftp.mozilla.org/pub/js/可以找到一个。请结合Mozilla的JavaScript引擎Rhino使 用它,Rhino可以从http://www.mozilla.org/rhino/download.html下载一个ZIP文件得到。我把这个文件解 压缩到E:盘根目录下,最终得到一个包含了Rhino的E:\rhino目录,我们感兴趣的是它的js.jar。

接下来,你需要一个实际执行重新构造操作的工具,即Ant。Ant也是一个Apache的软件工程,它是一个基于Java的工具。Ant实际上和创建 Web服务器Tomcat的工程同属一个工程,即Jakarta。在Ant中,所有构造信息,例如构造目标、依赖关系等,都通过XML配置文件指定,这是 Ant独一无二的特点。此外,Ant是可扩展的。请参见本文最后“参考资源”部分收录的文章,了解如何充分发挥Ant的潜能。你可以从参考资源提供的链接 下载Ant,然后解开压缩(我把它放入了C:盘的根目录)。

现在,从Apache SOAP安装目录执行如下命令:

set
CLASSPATH=E:\jakarta-tomcat\lib\servlet.jar;E:\xerces-1_2_0\xerces.jar;
E:\soap-2_0\lib\bsf.jar
C:\build\bin\ant


由于上面的命令没有指定一个XML配置文件,Ant批命令文件将在当前目录(在我这里,是E:\soap_2-0)中寻找一个名为build.xml的文 件。Apache SOAP提供了这个文件。打开这个文件可以看到,只有当com.ibm.bsf.BSFManager在classpath中时,InvokeBSF类才 会编译。这就是我把bsf.jar(它包含了BSFManager类)放入类路径的原因。把新构造出来的soap.jar文件从build\lib子目录 复制到lib子目录(我建议修改原来的soap.jar文件进行备份)。最后,把bsf.jar和js.jar加入到Web服务器的类路径。

大功告成!现在你可以开始用脚本编写SOAP服务了。

二、用JavaScript编写HelloWorld应用
现在,我们用JavaScript重新编写第二篇文章的HelloWorld服务。服务程序的完整代码如下:

function sayHelloTo(name)
{
return "Hello " + name + ", How are you?";
}


还有比这更容易的事情吗?不过,不要让这简单易行欺骗了你。事实上,你可以在服务程序里进行相当复杂的处理。例如,你可以从脚本代码访问任何标准的Java类。请看下面经过修改的脚本代码,它输出服务器的时间:

function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
return "Hello " + name + ", How are you?";
}


另外,你还可以导入和使用自己的任意Java类。例如,我们可以修改脚本代码,让它使用Name JavaBean:

importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");

java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}


三、部署服务
在使用JavaScript版本的服务之前,首先要部署它。正如本系列文章的第二篇所介绍的,在Apache SOAP中部署服务有两种办法:使用Web界面的管理工具,或者从命令行部署服务。下面我们来看看两种办法的具体操作过程。

3.1 使用Web界面的管理工具
要使用Web界面的管理工具,用浏览器打开http://localhost:8080/apache-soap/admin。点击窗口左边的 Deploy按钮。记住,ID输入框用来设置对象ID,SOAP基础设施利用对象ID把RPC(远程过程调用)请求关联到SOAP服务。每一个 Apache SOAP服务都必须有一个对象ID,而且这个对象ID必须在该服务器上部署的所有服务之间唯一。把ID设置成urn:Hello,这个ID也就是我们在第 二篇文章中为服务设置的对象ID。

把Scope输入框设置成application。回顾一下,Scope输入框用来指定响应调用请求的服务实例的生存时间(请参考第二篇文章中的更多说明)。

在Methods输入框中输入当前部署的服务允许调用的方法名字,多个方法名字之间以空白字符分隔。我们的服务只支持一个方法,即sayHelloTo()。

由于服务用JavaScript实现,而不是象第二篇文章那样用Java实现,所以Provider Type输入框应该填script。相应地,Java Provider输入框(包括Provider Class和Static输入框)不必填写。但现在必须填写Script Provider输入框,选择JavaScript(Rhino)作为脚本语言。由于我们将在Script文本输入框中提供脚本正文,所以现在不用填写 Script Filename输入框。把下面的脚本代码复制到Script输入框:

importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");

java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}


现在滚动到屏幕的最下面,点击表单下面的Deploy按钮(不是窗口左边的Deploy按钮)。要验证服务已经成功部署,点击窗口左边的List按钮。这时,urn:Hello服务应该在服务清单中出现。点击这个服务,确认所有信息都与刚才输入的吻合。

3.2 从命令行部署服务
要从命令行部署服务,所有部署信息必须放入一个XML部署描述器文件。下面是我用来部署该服务的XML部署描述器文件:

<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:Hello">
<isd:provider type="script" scope="Application" methods="sayHelloTo">
<isd:script language="javascript">
importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");

java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}
</isd:script>
</isd:provider>
</isd:service>


和第二篇文章用到的部署描述器文件相比,这里主要的不同在于把提供者类型设置成了script而不是java。由于这个原因,部署描述器文件不再指定一个Java类,而是提供了服务的脚本代码。

部署服务之前应当确保Web服务器已经启动。下面的代码显示了如何部署服务:

java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter deploy
DeploymentDescriptor.xml


DeploymentDescriptor.xml是前面介绍的包含部署描述信息的XML文件。要验证服务已经成功部署,执行下面的命令:

java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter query urn:Hello


这时,我们应该看到和DeploymentDescriptor.xml文件一样的内容。

四、测试
我们用第二篇文章提供的客户程序Client.java来测试HelloWorld服务。为什么可以用同一个客户程序访问JavaScript编写的服务 呢?因为客户程序完全不会在乎服务用什么语言编写。只要服务能够理解SOAP请求,能够返回SOAP应答,客户程序不会关注服务用什么方式实现。回顾一 下,下面就是我用来运行hello.Client的批命令文件:

set
CLASSPATH=E:\soap-2_0\samples\;E:\soap-2_0\lib\soap.jar;
E:\xerces-1_2_0\xerces.jar
java hello.Client Tarak


观察Web服务器的控制台窗口,每次运行客户程序的时候,我们都可以看到当前的日期和输出“John”。

■ 结束语
在这篇文章中,我介绍了Apache SOAP实现所提供的脚本语言支持。为什么说它很重要呢?只要分析一下为何Web开发如此流行。在我看来,一个关键的原因在于Web开发已经成熟,几乎任 何人都能够用HTML和JavaScript之类的简单脚本语言构造出复杂的Web页面。类似地,在Web开发的服务器端,人们可以使用JSP这类易学但 强大的脚本语言。我认为这种推理同样适用于SOAP开发。如果SOAP想要挺进主流,获得绝大部分人的支持,那么它应该尽量地简化。Apache SOAP加入对脚本的支持正是为了这个目标;它显著地扩展了创建SOAP服务的开发者的范围。

不过,不要忘了还有另一个因素需要考虑:客户端开发者,即调用SOAP服务的开发者。如前所述,Apache SOAP的客户端开发者比较“吃亏”,反而增加了一些原本不必做的工作。因此,在本系列文章的下一篇也即最后一篇中,我将介绍一个框架,它以Java 2平台1.3版本新引入的动态代理类为基础,使得创建客户程序就象创建SOAP服务一样简单直观。

分享到:
评论
1 楼 yueyueaihuihui 2010-03-22  
谢谢,很受用!

相关推荐

    SOAP资料,介绍SOAP协议

    **SOAP(Simple Object Access Protocol)协议**是一种基于XML(Extensible Markup Language)的协议,用于在Web服务中传递结构化和类型化的信息。SOAP允许应用程序通过HTTP、SMTP等传输协议进行通信,使得不同系统...

    利用Ruby的SOAP4R编写SOAP服务器的教程

    ### 利用Ruby的SOAP4R编写SOAP服务器的教程 #### 一、引言 SOAP (Simple Object Access Protocol),即简单对象访问协议,是一种基于XML的协议,它允许应用程序在不同操作系统之间进行通信。SOAP4R是Ruby社区中用于...

    SOAP数据传输协议

    SOAP(Simple Object Access Protocol)是一种基于XML的网络通信协议,用于在Web服务中交换结构化和类型化的信息。它允许应用程序通过HTTP等简单协议来发送和接收数据,从而实现跨平台、跨语言的通信。在“SOAP数据...

    SOAP协议规范——SOAP详解

    SOAP(Simple Object Access Protocol),即简单对象访问协议,是一种基于XML(Extensible Markup Language)的协议,用于在Web服务中传递结构化的和格式化的信息。SOAP允许应用程序通过HTTP(Hypertext Transfer ...

    SOAP协议详解

    SOAP协议也支持脚本语言编写服务,例如,PHP、Python和Perl都可以方便地创建SOAP服务,这样,即使没有强大的后端框架,开发者也能构建分布式系统。 ### SOAP协议语法 SOAP的XML语法有明确的规定,包括命名空间、...

    php编写webservice soap服务端及客户端

    PHP作为广泛使用的服务器端脚本语言,非常适合用来创建SOAP Web Service的服务端和客户端。 标题“php编写webservice soap服务端及客户端”意味着我们将讨论如何使用PHP实现SOAP协议的两个关键部分:服务提供者和...

    SOAP 教程 是一种简单的基于 XML 的协议

    理解SOAP对于Web服务的开发者至关重要,特别是那些希望创建和使用分布式应用程序的人。SOAP的标准化和广泛支持使其成为许多企业级解决方案中的核心组件,尤其是在微软的.NET架构中。随着W3C对SOAP标准的持续发展,它...

    SOAP:XML跨平台Web Service开发技术

    根据提供的信息,我们可以推断出这部分内容与算盘的工作原理及其使用方法有关,并非直接讨论SOAP(简单对象访问协议)及XML跨平台Web服务开发技术。然而,由于明确要求生成的知识点应围绕标题和描述中的内容,即SOAP...

    soap协议规范 soap协议规范

    SOAP协议由三个核心部分组成: 1. **SOAP封装**:这部分定义了消息的整体框架,包括消息内容、处理者信息以及内容的可选性或必要性。它使用XML结构来表示消息的头部和主体,允许指定消息的目标、来源和其他元数据。...

    SOAP协议样列

    它的主要特点是使用XML作为数据编码格式,这种选择使得SOAP具备跨平台的特性,能够在不同的操作系统和编程语言之间交换数据。 ##### XML作为数据编码格式的重要性 SOAP采用XML作为数据编码格式并非偶然,这是因为...

    Delphi编写soap服务器与客户端程序

    在本文中,我们将详细介绍使用 Delphi 编写 SOAP 服务器与客户端程序的过程。SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在不同平台之间交换结构化的信息。Delphi 作为一款功能强大的开发...

    webservice 调用实例soap协议

    SOAP(Simple Object Access Protocol)是Web服务通信的一种协议,它使用XML(eXtensible Markup Language)来封装数据,并通过HTTP(Hypertext Transfer Protocol)进行传输,确保了跨平台和跨语言的兼容性。...

    SOAP协议规范

    总结,SOAP协议规范是Web服务领域中的一个重要组成部分,它为跨平台、跨语言的数据交换提供了统一的框架。理解并掌握SOAP协议有助于开发者构建高效、可靠的分布式系统。在实际项目中,选择合适的通信协议(如SOAP或...

    SOAP协议最新规范文档

    SOAP协议由三个主要部分组成: 1. **SOAP封装**:这部分定义了消息的内容结构,包括消息头和消息体。消息头可以包含元数据,如安全信息、路由指令等,而消息体则包含实际的数据。封装确保了消息的完整性和指定处理...

    SOAP编程

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP允许应用程序通过HTTP、SMTP等网络协议进行通信,使得不同平台上的软件能够相互通信。以下是对SOAP编程...

    soap协议规范

    SOAP协议为分布式环境下的服务交互提供了一套标准化的机制,通过XML格式封装数据和元数据,支持跨语言、跨平台的互操作性。其设计上的简洁性和模块化特性,使其成为Web服务领域的重要组成部分,促进了服务导向架构...

    SOAP调用webservice例子

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化信息。它允许不同系统间进行远程过程调用,即使它们运行在不同的操作系统或使用不同的编程语言。SOAP消息通常通过...

    SOAP协议规范(中文版).doc

    SOAP(Simple Object Access Protocol)是一种基于XML(Extensible Markup Language)的协议,用于在Web服务中传递结构化和类型化的信息。它允许不同系统之间通过网络进行通信,尤其是在分布式计算环境中。SOAP协议...

    基于soap协议的post请求

    SOAP(Simple Object Access Protocol),简单对象访问协议,是一种轻量级的、基于XML的协议,用于在Web服务中交换结构化和类型化的信息。它允许分布式环境中的应用程序之间进行通信,尤其适用于HTTP协议之上,提供...

Global site tag (gtag.js) - Google Analytics