当前位置:天才代写 > tutorial > JAVA 教程 > Java中的SOAP技能

Java中的SOAP技能

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:329

副标题#e#

开始之前,我想就本文即将接头的主题和读者需要具备的起点常识做一些必须的描叙。本文的主题是接头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文件中:

...
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的辅佐下举办互相通讯。它们将利用下面的框架图来完成这个进程:

Java中的SOAP技术

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

Java中的SOAP技术


#p#副标题#e#

正如你看到的,它长短常简朴的。它看起来确实就象一个普通的信封可能你的email。你想看看它们是如何行动的吗?下面跟我们一起来吧。其实我们有许多要领是不消SOAP来在建设和运行我们本身的“Hello World”应用措施的,可是因为我们要保持它的简朴性,我会给你一个它运作方法的框架图(scheme)。

我们的“Hello World”典型会包括一个SOAP Service。我们的SOAP Client将发送它们的名字到该SOAP Service,并试图获得一些复原或响应。这个SOAP Service需要陈设到一个SOAP Admin的东西,以至重定位所有请求的SOAP(Proxy) RPC Router可以或许知道它们应该利用哪种处事来运作。总而言之,这个是以下面的方法来运作的:

Java中的SOAP技术
#p#分页标题#e#

此刻,我们来一步步的看看到底产生了什么。在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

#p#副标题#e#

第二步,一旦我们筹备好了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:}

#p#分页标题#e#

下面我要做一些表明。在第13行,我们配置了我们的名字,这个名字将会通报给SOAP Service。在第14行,我们配置了我们将要挪用的处事的ID(service ID),和第15行里配置的处事要领(service method)。有了这个ID,处事可以或许被陈设到SOAP处事打点器(SOAP Service Manager)中。我们没有配置任何其他值,仅仅只用适才那些基本值就可以正常运作了。你能从SOAP的官方文档上获得相关信息,该文档来自SOAP包中,它们的表明超出了本文的范畴。

用以下方法编译这个SOAP Client:

javac HelloWorldClient.java

#p#副标题#e#

为了圆满完成它,让我们查抄一下针对我们的测试,是否所有工作都筹备停当。Tomcat正在运行,所有的情况变量都正确,SOAP Service被编译和陈设,SOAP Client被乐成编译。OK,让我们运行它,你将看到这个屏幕:

Java中的SOAP技术

正如你所看到的,我们的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是值得的,至少你要知道它是什么和它是怎么运作的。

 

    关键字:

天才代写-代写联系方式