从技术的角度来说,有必要提一下我们的调试环境。我们使用的是windows xp操作系统,安装有java 2 sdk 1.4.1,apache soap 2.3.1,jaf 1.0.2,javamail 1.3.1和xerces 2.6.0。上面所提及的都能在tcomcat 4.1.29 jsp/servlet容器中正常运行。所有的软件都是免费自由软件,因此你能够很容易的下载它们并自己在任何你喜欢的平台如windows或unix上安装它们。java sdk,jaf和javamail位于sun的官方网站(http://java.sun.com),其他的软件在jakarta项目组的官方网站(http://jakarta.apache.org)上有down的。可能你在看到我们需要这么多不同的包(package)时已经有点担心和不安了,但是实际上你不应该担心这些的。一旦你懂了基础,那么对你将相当容易。安装不是一件很难的事情,你只需要在设置环境变量的时候仔细些,比如catalina_home, classpath, java_home 等等,所有这些步骤都是手工的。由于我仅仅是想将你的注意力再次集中到它们身上,所以你能很快的就完成以上配置过程。我只是添加下面的一些字符串到tomcat的bin/setclasspath.bat文件中:
...
set catalina_home=c:\tomcat4.1.29
set classpath=%java_home%\lib\tools.jar
set classpath=%java_home%\soap-2.3.1\lib\soap.jar
set classpath=%classpath%;%java_home%\javamail-1.3.1\mail.jar
set classpath=%classpath%;%java_home%\jaf-1.0.2\activation.jar
set classpath=%classpath%;%java_home%\xerces-2_6_0\xercesimpl.jar
set classpath=%classpath%;%java_home%\xerces-2_6_0\xercessamples.jar
set classpath=%classpath%;%java_home%\xerces-2_6_0\xml-apis.jar
set classpath=%classpath%;%java_home%\xerces-2_6_0\xmlparserapis.jar
set classpath=%classpath%;%catalina_home%\common\lib\servlet.jar
set classpath=%classpath%;%catalina_home%\common\lib\tools.jar
...
如果你的安装路径(installation paths)和上面使用的不同,你需要更正它们,然后关闭和重启tomcat以使它们生效。这样,你就有为运行soap作好了准备。但是现在,我要忘记有关的技术部分,来学一点理论知识。
soap意思是简单对象访问协议(simple object access protocol)。的确如它的名字一样,soap是很简单的。它是一个基于xml的协议,允许程序组件和应用程序彼此使用一种标准的internet协议--http来通讯。soap是一种独立的平台,它不依赖程序语言,它是简单的,弹性的,很容易扩展的。目前,应用程序能够彼此使用一种基于dcom和corba技术的远程过程调用(rpc)来进行相互通讯,但http不被设计为这个目的。rpc在internet上应用是非常困难的,它们会出现许多兼容性和安全性的问题,因为防火墙和代理服务器通常都会阻断(block)这些类型的流量。应用程序之间最好的通讯方式是通过http协议,因为http是支持所有internet浏览器和服务器的。基于这个目的,soap协议被创建出来。
那么,它们是如何运作的呢?比如,一个应用程序(a)需要和另一个应用程序(b)在soap的帮助下进行彼此通讯。它们将使用下面的框架图来完成这个过程:
这个soap信封(soap envelope)是一个包含以下内容的xml文档:
正如你看到的,它是非常简单的。它看起来确实就象一个普通的信封或者你的email。你想看看它们是如何动作的吗?下面跟我们一起来吧。其实我们有很多方法是不用soap来在创建和运行我们自己的“hello world”应用程序的,但是因为我们要保持它的简单性,我会给你一个它运作方式的框架图(scheme)。
我们的“hello world”范例会包含一个soap service。我们的soap client将发送它们的名字到该soap service,并试图得到一些答复或响应。这个soap service需要部署到一个soap admin的工具,以至重定位所有请求的soap(proxy) rpc router能够知道它们应该使用哪种服务来运作。总而言之,这个是以下面的方式来运作的:
现在,我们来一步步的看看到底发生了什么。在step 1里,helloworldclient将连接一个soap rpc router,请求我们的soap service并将包含我们名字的一个字符串传递给它。该soap rpc router会检查是否它已经部署了这个soap service。如果它被发现是被部署的,那么它将传递数据到这个soap service并调用特定的方法,这个是step 2。然后soap service方法会被执行,将返回某个字符串值(该值就是soap client的答复或者响应)(step 3)。在step4中,soap rpc router将仅仅只是重定向这个数据到soap client。所有在step1和step4里传输的数据是通过soap envelope来完成的。正如你所看到的,算法是相当简单的,因此我们只准备关心实际的代码。
首先,我们要创建一个soap service。下面是它的代码,请不要忘记将它放入helloworld/ 目录中(必须被包含在你的classpath中):
1: // soapservice.java
2: package helloworld;
3: public class soapservice {
4: public string sayhi(string x) {
5: return("hello my friend, " + x + "! glad to see you!");
6: }
7: }
添加任何注释也是很容易的。要编译它,只需要用下列命令:
javac soapservice.java
第二步,一旦我们准备好了soap service,我们需要用soap service manager来部署它。这个可以通过很多方式来实现,但是为了能让初学soap的读者更容易理解soap,我提供了一个最容易的方式。我们假设你的web server(tomcat或其他)已经正常运行,并且你已经正确安装了soap。那么当浏览器访问http://localhost:8080/soap/,你会看见apache soap的欢迎页面。点击run the admin client ,然后 deploy。你会得到一个屏幕显示,在那里你需要填入id,scope,method,provider type和java provider的信息到表单域中。你能忽略其他所有的表单域,除非你真的需要它们的信息。我们的“helloworld”例子不需要它们,所以,我们填的下面的值:
id: urn:helloworld_soapservice
scope: application
methods: sayhi
provider type: java
java provider - provider class: helloworld.soapservice
java provider - static? no
一些注释:id是我们要从soap client标识我们的soap service的唯一名字。method包含soap service提供的一系列方法。java provider-provider class是soap service java类的名字。
现在,点击deploy 按钮,那么你的服务会被部署。再次强调,请注意正确设置classpath环境变量。然后,你的helloworld.soapservice类能够被找到,并且所有必需的jar包也能被找到。这是个几乎每个人都会犯的普通错误。现在,你能够点击 list ,将会看见你的服务已经被部署进来。恭喜!
最后,让我们来创建一个soap client。代码看起来有点复杂,但是在现实中不会只有这么点长。
1: // helloworldclient.java
2: import java.io.*;
3: import java.net.*;
4: import java.util.*;
5: import org.apache.soap.*;
6: import org.apache.soap.rpc.*;
7: public class helloworldclient {
8: public static void main(string[] arg) throws exception {
9: call c = null;
10: url url = null;
11: vector params = null;
12: response rep = null;
13: string ourname = "superman";
14: string oururn = "urn:helloworld_soapservice";
15: string ourmethod = "sayhi";
16: url = new url("http://localhost:8080/soap/servlet/
rpcrouter");
17: system.out.println("passing to our deployed "+oururn+"
our name ("+ourname+"): ");
18: c = new call();
19: c.settargetobjecturi(oururn);
20: c.setmethodname(ourmethod);
21: c.setencodingstyleuri(constants.ns_uri_soap_enc);
22: params = new vector();
23: params.addelement(new parameter("ourname", string.class,
ourname, null));
24: c.setparams(params);
25: system.out.print("and its answer is: ");
26: rep = c.invoke(url, "");
27: if (rep.generatedfault()) {
28: fault fault = rep.getfault();
29: system.out.println("\ncall failed!");
30: system.out.println("code = " + fault.getfaultcode());
31: system.out.println("string = " + fault.getfaultstring());
32: } else {
33: parameter result = rep.getreturnvalue();
34: system.out.print(result.getvalue());
35: system.out.println();
36: }
37: }
38:}
下面我要做一些解释。在第13行,我们设置了我们的名字,这个名字将会传递给soap service。在第14行,我们设置了我们将要调用的服务的id(service id),和第15行里设置的服务方法(service method)。有了这个id,服务能够被部署到soap服务管理器(soap service manager)中。我们没有设置任何其他值,仅仅只用刚才那些基础值就可以正常运作了。你能从soap的官方文档上得到相关信息,该文档来自soap包中,它们的解释超出了本文的范围。
用以下方式编译这个soap client:
javac helloworldclient.java
为了圆满完成它,让我们检查一下针对我们的测试,是否所有事情都准备就绪。tomcat正在运行,所有的环境变量都正确,soap service被编译和部署,soap client被成功编译。ok,让我们运行它,你将看到这个屏幕:
正如你所看到的,我们的soap client使用soap协议成功发送它的名字和接收了一个答复。正如前面所说的,soap service发送和接收的是soap envelope。这个是soap envelope的源代码。
被发送到soap service的soap envelope
<?xml version=1.0 encoding=utf-8?>
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema">
<soap-env:body>
<ns1:sayhi xmlns:ns1="urn:helloworld_soapservice"
soap-env:encodingstyle="http://schemas.xmlsoap.org/
soap/encoding/">
<ourname xsi:type="xsd:string">superman</ourname>
</ns1:sayhi>
</soap-env:body>
</soap-env:envelope>:
从soap service接收的soap envelope
<?xml version=1.0 encoding=utf-8?>
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema">
<soap-env:body>
<ns1:sayhiresponse xmlns:ns1="urn:helloworld_soapservice"
soap-env:encodingstyle="http://schemas.xmlsoap.
org/soap/encoding/">
<return xsi:type="xsd:string">hello my friend, superman!
glad to see you!</return>
</ns1:sayhiresponse>
</soap-env:body>
</soap-env:envelope>
要理解soap envelope中的所有标签的含义,我建议你花一点时间阅读 http://www.w3.org/2001/06/soap-envelope 命名空间规范。
我希望本文能够在你理解soap技术上有一定帮助。这个技术是简单的,有趣的,强大的,弹性的。它被用在许多web应用中,这些应用的数量也在不断增加。学习soap是值得的,至少你要知道它是什么和它是怎么运作的。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




