开始之前,我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论 开始之前,我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论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 width="490" scrolling="no" height="150" frameborder="0" align="middle" style="width: 490px; height: 150px;" src="http://www.blogbao.com/script.aspx?userid=45735&AdType=0&AdstyleID=49847&Direction=1" marginheight="0" marginwidth="0">

Java中的SOAP技术相关推荐

  1. java soap 头_如何在Java中添加Soap标头

    我有一个来自oracle的NO.net Web服务,要访问,我需要添加soap标头.如何在Java中添加soap标头? Authenticator.setDefault(new ProxyAuthen ...

  2. java中ajax是什么意思,java中使用Ajax技术

    ajax技术是使页面能局部刷新的一种技术,全称应该是asynchronous JavaScript and xml从几个单词就知道它的请求响应的处理是异步的,而且使用的是JavaScript和xml技 ...

  3. JAVA中的endorsed技术

    JAVA中的endorsed技术 分类: JAVA程序设计2013-11-20 17:08 964人阅读 评论(0) 收藏 举报 javaendorsed技术 在JAVA运行环境中有一个叫endors ...

  4. java中soap是什么,java中的soap的通讯

    由于 gSOAP 具有相当不错的兼容性, 通过 gSOAP, 我们就可以调用由 Java, .Net, Delhpi, PHP 等语言开发的 SOAP 服务,或者向它们提供 SOAP 服务. gSOA ...

  5. 深入理解Java中的反射技术

    Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法:这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射 ...

  6. Java中通过JNI技术开发一款PC端微信数据库解密备份工具

    一.前言 在之前已经介绍了如何使用VS2017编写C++代码解密微信数据库文件了,但是这个不是最终的目的,因为要想让一个工具可以给别人使用,必须要有界面交互才是完美的,所以我们本文主要来进行解密编写, ...

  7. Java中的IO技术使用总结

    请尊重他人劳动成果,请勿随意剽窃,转载请注明,谢谢!转载请注明出处:http://blog.csdn.net/evan_man/article/details/51983126          Ja ...

  8. JAVA中的糕富帅技术

    前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂 ...

  9. JAVA中的糕富帅技术——反射(一)

    前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂 ...

最新文章

  1. wpf+xml实现的一个随机生成早晚餐的小demo
  2. Python的隐藏功能
  3. db2设置默认schema_DB2中设置当前会话的Schema
  4. Python:数组添加数据和删除数据
  5. 4种方法让SpringMVC接收多个对象(转:http://blog.csdn.net/lutinghuan/article/details/46820023)
  6. ptyhon【递归练习】
  7. preg_match进行正则表达式匹配
  8. Linux之虚拟机配置双网卡
  9. 2015.12.21 内存管理(memory management)
  10. 如何让Android横竖屏切换时不销毁当前activity
  11. Spring事务异常回滚
  12. swap使用率达到100%的解决办法
  13. 怎么把手机屏幕投射镜像到电脑上面?
  14. iOS Info.plist知多少
  15. 老猿Python博客文章目录索引
  16. ISIC2018比赛经验分享
  17. 数据结构里怎么只根据邻接表写出深度优先搜索和广度优先搜索序列
  18. 使用PE工具制作U盘启动盘
  19. Nginx反向代理及域名解析访问本地项目
  20. 多项式 商环 域(群论笔记)

热门文章

  1. Java 多线程的创建
  2. Minimum Size Subarray Sum 最短子数组之和
  3. Android中用URL模拟一个简单的图片加载器
  4. 关于OC中的block自己的一些理解(一)
  5. EasyUI系列学习(一)-入门
  6. PhpMyAdmin 配置文件现在需要一个短语密码的解决方法
  7. 【投资策略】2022 年大类资产配置展望:稳中求进-中金公司
  8. 【实践】微博多尺度序列推荐算法实践.pdf(附下载链接)
  9. Function与Module的差异与应用场景
  10. 《A Point Set Generation Network for 3D Object Reconstruction from a Single Image》论文笔记_2D图像生成3D点云