`

Java中的SOAP技术

 
阅读更多
 开始之前,我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论 开始之前,我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论SOAP技术,我们将尽可能的讲得通俗易懂一些,所 以,我们引入了一个普通的“Hello World”范例来给读者说明它们是怎么运作的,让读者知道它们的运作方式。我认为,如果光看官方文档是很难开始学习这门新技术的,官方文档中包含大量的 范例,并解释了所有的特性和优点,但是没解释它们的运作方式。在这篇文章中,我不打算只肤浅的解释SOAP技术的定义,我们假设读者熟悉JAVA语言, Web技术,具有XML语言,XML Namespaces,XML Schema的基础。在这种情况下,理解本文将不存在任何困难。然而,即使没有这些知识,你也不必担心,我们将尽可能的解释得简单,但是当你开始做自己的 SOAP应用程序时会遇到一些问题和麻烦。因此,花费一定时间来学习上面的知识是很有必要的。
  
  从技术的角度来说,有必要提一下我 们的调试环境。我们使用的是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文件中: bitsCN_net中国网管博客
  ...
  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协议被创建出来。

bitsCN_net中国网管博客


  
  那么,它们是如何运作的呢?比如,一个应用程序(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能够知道它们应该使用哪种服务来运作。总而言之,这个是以下面的方式来运作的:
    bitsCN_com关注网管是我们的使命
   现在,我们来一步步的看看到底发生了什么。在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: }
  
  添加任何注释也是很容易的。要编译它,只需要用下列命令: bitsCN_net中国网管博客
  
  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类的名字。

play.bitsCN.com累了吗玩一下吧


  
   现在,点击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.west263.com <iframe width="490" scrolling="no" height="150" frameborder="0" align="middle" style="width: 490px; height: 150px;" src="http://www.blogbao.com/script.aspx?userid=45735&amp;AdType=0&amp;AdstyleID=49847&amp;Direction=1" marginheight="0" marginwidth="0"> </iframe>
分享到:
评论

相关推荐

    Java中的SOAP技术--(2)

    Java中的SOAP技术--(2)

    JAVA SOAP技术

    JAVA SOAP技术

    JAVA与SOAP_PDF高清版.zip

    此文档是《Java与SOAP》pdf文档。文档完整清晰,适合新手学习。当然也适合想技术提高的技术爱好者学习。

    axis2 soap技术

    axis2 soap技术 wsdl技术 java 的技术

    j2ee框架知识,soap协议webservice技术等

    java 面试 基础知识 宝典 ,全面包括java基础,j2ee框架知识,soap协议webservice技术等

    JAVA_API1.6文档(中文)

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    SOAP最早由Dave Winner、Don Box和Bod Atkinson提出。

    IBM发布Java SOAP实现,并给开放源代码组织Apache XML Project。Sun公司将Web服务集成到J2EE中。 2000年9月13日,W3C组建了XML协议工作组,专门负责设计XML协议,以便成为基于XML分布式计算的核心。这个工作组将SOAP...

    java基础,j2ee框架知识,soap协议webservice技术等(1) java(3) 英文版(1) 宝典(2) 多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加(1) EJB3.0(2) Oracle九阴真经(1)

    java基础,j2ee框架知识,soap协议webservice技术等(1) java(3) 英文版(1) 宝典(2) 多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加(1) EJB3.0(2) Oracle九阴真经(1)

    《Java P2P技术内幕》完整电子版

    通过阅读本书,你可以了解传统的客户端/服务器系统和消息传输系统与P2P系统之间的异同,通过P2P实现应用程序间的集成和互操作,选择适当的Java技术开发应用程序,在P2P中管理和共享信息,开发域驱动的P2P应用程序,...

    Java2核心技术.part5

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java 1.6 API 中文 New

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    JavaAPI1.6中文chm文档 part1

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    Java,XML和Web服务宝典

    此外,还介绍了很多有用的技术,比如SOAP技术和JSP技术等等,在编写基于XML和Java应用的过程中会经常使用到这些技术。本书的作者都是在Java和XML方面有多年实践经验的专家,他们会带领读者熟悉Java、XML以及Web服务...

    SOAP协议最新规范文档

    SOAP协议规范,最基础的规范 方便查询,了解SOAP技术

    高级java2大学教程 源代码

    介绍了有关网络服务的内容,并通过实例讲解了servlet和JSP的应用,然后列举了与其他Web服务相关的技术,例如WML、SOAP等。本书还讨论了构造企业级Java应用的关键技术,其中包括安全、JDBC、EJB等,并给出一个利用...

    Java实用编程技术集锦.chm

    里面包含了java、servlet、jsp、soap、分布式等常用的技术总结,当然是高手总结的,不是我总结的咯,哈哈,空闲时间看看,还是很不错的。

    孙卫琴《Tomcat与Java Web开发技术详解》培训讲义.rar

    孙卫琴《Tomcat与Java Web开发技术详解》培训讲义.rar 01__JavaWeb应用简介.pdf 02_Servlet技术.pdf 03_JSP技术.pdf 04_使用HTTP会话(Session).pdf 05_使用JavaBean.pdf 06_使用Servlet过滤器....

Global site tag (gtag.js) - Google Analytics