科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SOAP净化有线协议(三):用脚本语言编写服务1

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

来源:IT专家网 2008年5月12日

关键字: 协议 净化 SOAP java

  • 评论
  • 分享微博
  • 分享邮件
 你是一个渴望永远站在技术最前沿的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是可扩展的。

  现在,从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?";
}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章