RSS
热门关键字:
当前位置 : 主页>编程开发>java编程>入门>列表

实例讲解:Java中的SOAP技术

来源:我要研发网 作者: 时间:1970-01-01 点击:



  开始之前,我想就本文即将讨论主题和读者需要具备起点知识做一些必需描叙。本文主题是讨论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 等等,所有这些步骤都是手工。由于我仅仅是想将你注意力再次集中到它们身上,所以你能很快就完成以上配置过程。我只是添加下面一些字符串到Tomcatbin/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


字串6

  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

  

字串8

  这个SOAP信封(SOAP envelope)是一个包含以下内容XML文档:

字串6

  

字串5

  正如你看到,它是非常简单。它看起来确实就象一个普通信封或者你email。你想看看它们是如何动作吗?下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己“Hello World”应用程序,但是因为我们要保持它简单性,我会给你一个它运作方式框架图(scheme)。 字串4


字串6

  我们“Hello World”范例会包含一个SOAP Service。我们SOAP Client将发送它们名字到该SOAP Service,并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin工具,以至重定位所有请求SOAP(Proxy) RPC Router能够知道它们应该使用哪种服务来运作。总而言之,这个是以下面方式来运作字串5

  

字串3

  现在,我们来一步步看看到底发生了什么。在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”例子不需要它们,所以,我们填下面值:

字串8


字串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 ,将会看见你服务已经被部署进来。恭喜!

字串8

  最后,让我们来创建一个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包中,它们解释超出了本文范围。

字串1


字串5

  用以下方式编译这个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 ServiceSOAP 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

字串8

<?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


字串2

  我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单,有趣,强大,弹性。它被用在许多Web应用中,这些应用数量也在不断增加。学习SOAP是值得,至少你要知道它是什么和它是怎么运作字串8

字串4

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章