开始之前,我想就本文即将讨论
主题和读者需要具备
起点知识做一些必需
描叙。本文
主题是讨论SOAP技术,我们将尽可能
讲得通俗易懂一些,所以,我们引入了一个普通
“Hello World”范例来给读者说明它们是怎么运作
,让读者知道它们
运作方式。我认为,如果光看官方文档是很难开始学习这门新技术
,官方文档中包含大量
范例,并解释了所有
特性和优点,但是没解释它们
运作方式。在这篇文章中,我不打算只肤浅
解释SOAP技术
定义,我们假设读者熟悉JAVA语言,Web技术,具有XML语言,XML Namespaces,XML Schema
基础。在这种情况下,理解本文将不存在任何困难。然而,即使没有这些知识,你也不必担心,我们将尽可能
解释得简单,但是当你开始做自己
SOAP应用程序时会遇到一些问题和麻烦。因此,花费一定时间来学习上面
知识是很有必要
。 字串7
从技术
角度来说,有必要提一下我们
调试环境。我们使用
是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文件中: 字串8
...
set CATALINA_HOME=C:Tomcat4.1.29
set CLASSPATH=%JAVA_HOME%lib ools.jar
set CLASSPATH=%JAVA_HOME%soap-2.3.1libsoap.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%javamail-1.3.1mail.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%jaf-1.0.2activation.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xercesSamples.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xml-apis.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xmlParserAPIs.jar
set CLASSPATH=%CLASSPATH%;蔜ALINA_HOME%commonlibservlet.jar
set CLASSPATH=%CLASSPATH%;蔜ALINA_HOME%commonlib ools.jar
... 如果你
安装路径(installation paths)和上面使用
不同,你需要更正它们,然后关闭和重启Tomcat以使它们生效。这样,你就有为运行SOAP作
了准备。但是现在,我要忘记有关
技术部分,来学一点理论知识。 字串7
SOAP意思是简单对象访问协议(Simple Object Access Protocol)。
确如它
名字一样,SOAP是很简单
。它是一个基于XML
协议,允许程序组件和应用程序彼此使用一种标准
Internet协议--HTTP来通讯。SOAP是一种独立
平台,它不依赖程序语言,它是简单
,弹性
,很容易扩展
。目前,应用程序能够彼此使用一种基于DCOM和CORBA技术
远程过程调用(RPC)来进行相互通讯,但HTTP不被设计为这个目
。RPC在Internet上应用是非常困难
,它们会出现许多兼容性和安全性
问题,因为防火墙和代理服务器通常都会阻断(block)这些类型
流量。应用程序之间最
通讯方式是通过HTTP协议,因为HTTP是支持所有Internet浏览器和服务器
。基于这个目
,SOAP协议被创建出来。 字串9
那么,它们是如何运作
呢?比如,一个应用程序(A)需要和另一个应用程序(B)在SOAP
帮助下进行彼此通讯。它们将使用下面
框架图来完成这个过程: 字串9
这个SOAP信封(SOAP envelope)是一个包含以下内容
XML文档:
正如你看到
,它是非常简单
。它看起来确实就象一个普通
信封或者你
email。你想看看它们是如何动作
吗?下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己
“Hello World”应用程序
,但是因为我们要保持它
简单性,我会给你一个它运作方式
框架图(scheme)。 字串4
我们
“Hello World”范例会包含一个SOAP Service。我们
SOAP Client将发送它们
名字到该SOAP Service,并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin
工具,以至重定位所有请求
SOAP(Proxy) RPC Router能够知道它们应该使用哪种服务来运作。总而言之,这个是以下面
方式来运作
: 字串5
现在,我们来一步步
看看到底发生了什么。在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来完成
。正如你所看到
,算法是相当简单
,因此我们只准备关心实际
代码。 字串4
首先,我们要创建一个SOAP Service。下面是它
代码,请不要忘记将它放入HelloWorld/ 目录中(必须被包含在你
CLASSPATH中): 字串5
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: } 添加任何注释也是很容易
。要编译它,只需要用下列命令: 字串5
javac SOAPService.java 字串1
第二步,一旦我们准备
了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”例子不需要它们,所以,我们填
下面
值:
字串9
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类
名字。 字串4
现在,点击Deploy 按钮,那么你
服务会被部署。再次强调,请注意正确设置CLASSPATH环境变量。然后,你
HelloWorld.SOAPService类能够被找到,并且所有必需
jar包也能被找到。这是个几乎每个人都会犯
普通错误。现在,你能够点击 List ,将会看见你
服务已经被部署进来。恭喜!
最后,让我们来创建一个SOAP Client。代码看起来有点复杂,但是在现实中不会只有这么点长。
字串4
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, ""); 字串9
27: if (rep.generatedFault()) {
28: Fault fault = rep.getFault();
29: System.out.println("
Call 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: 字串1
javac HelloWorldClient.java 字串6
为了圆满完成它,让我们检查一下针对我们
测试,是否所有事情都准备就绪。Tomcat正在运行,所有
环境变量都正确,SOAP Service被编译和部署,SOAP Client被成功编译。OK,让我们运行它,你将看到这个屏幕: 字串2
字串7
正如你所看到
,我们
SOAP Client使用SOAP协议成功发送它
名字和接收了一个答复。正如前面所说
,SOAP Service发送和接收
是SOAP envelope。这个是SOAP envelope
源代码。 字串3
被发送到SOAP Service
SOAP Envelope
字串6
<?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 命名空间规范。
字串5
我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单
,有趣
,强大
,弹性
。它被用在许多Web应用中,这些应用
数量也在不断增加。学习SOAP是值得
,至少你要知道它是什么和它是怎么运作
。 字串8
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
