SOAP净化有线协议(三):用脚本语言编写服务}还有比这更容易的事情吗?不过,不要让这简单易行欺骗了你。事实上
SOAP净化有线协议(三):用脚本语言编写服务
}
还有比这更容易的事情吗?不过,不要让这简单易行欺骗了你。事实上,你可以在服务程序里进行相当复杂的处理。例如,你可以从脚本代码访问任何标准的Java类。请看下面经过修改的脚本代码,它输出服务器的时间:
return "Hello " + name + ", How are you?";
}
另外,你还可以导入和使用自己的任意Java类。例如,我们可以修改脚本代码,让它使用Name JavaBean:
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输入框:
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: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服务一样简单直观。(下一篇)
■ 参考资源 W3C的SOAP 1.1规范
http://www.w3.org/TR/SOAP/
下载Apache SOAP:
http://xml.apache.org/dist/soap/
关于IBM SOAP工程的更多信息:
http://www.alphaworks.ibm.com/tech/soap4j
关于Mozilla Rhino的更多信息:
http://www.mozilla.org/rhino/
关于Ant的更多信息:
http://jakarta.apache.org/ant/index.html
利用Java和Ant自动化构造过程(JavaWord,2001年10月):
http://www.javaworld.com/jw-10-2000/jw-1020-ant.html
下载Ant:
http://jakarta.apache.org/builds/jakarta-ant/release/v1.2/bin/