|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
主要缺点就是:速度比较慢,没有C和C++快 入手下手之前,我想就本文行将会商的主题和读者必要具有的出发点常识做一些必须的描叙。本文的主题是会商SOAP手艺,我们将尽量的讲得普通易懂一些,以是,我们引进了一个一般的“HelloWorld”典范来给读者申明它们是怎样运作的,让读者晓得它们的运作体例。我以为,假如光看官方文档是很难入手下手进修这门新手艺的,官方文档中包括大批的典范,并注释了一切的特征和长处,可是没注释它们的运作体例。在这篇文章中,我不盘算只浅薄的注释SOAP手艺的界说,我们假定读者熟习JAVA言语,Web手艺,具有XML言语,XMLNamespaces,XMLSchema的基本。在这类情形下,了解本文将不存在任何坚苦。但是,即便没有这些常识,你也不用忧虑,我们将尽量的注释得复杂,可是当你入手下手做本人的SOAP使用程序时会碰到一些成绩和贫苦。因而,消费必定工夫来进修下面的常识是很有需要的。
从手艺的角度来讲,有需要提一下我们的调试情况。我们利用的是WindowsXP操纵体系,安装有JAVA2SDK1.4.1,ApacheSOAP2.3.1,JAF1.0.2,JAVAMAIL1.3.1和Xerces2.6.0。下面所说起的都能在Tcomcat4.1.29JSP/Servlet容器中一般运转。一切的软件都是收费自在软件,因而你可以很简单的下载它们并本人在任何你喜好的平台如Windows或UNIX上安装它们。JavaSDK,JAF和JAVAMAIL位于SUN的官方网站(http://java.sun.com),其他的软件在Jakarta项目组的官方网站(http://jakarta.apache.org)上有down的。大概你在看到我们必要这么多分歧的包(package)时已有点忧虑和不安了,可是实践上你不该该忧虑这些的。一旦你懂了基本,那末对你将相称简单。安装不是一件很难的事变,你只必要在设置情况变量的时分细心些,好比CATALINA_HOME,CLASSPATH,JAVA_HOME等等,一切这些步骤都是手工的。因为我仅仅是想将你的注重力再次会合到它们身上,以是你能很快的就完成以上设置历程。我只是增加上面的一些字符串到Tomcat的bin/setclasspath.bat文件中:
...
setCATALINA_HOME=C:Tomcat4.1.29
setCLASSPATH=%JAVA_HOME%lib ools.jar
setCLASSPATH=%JAVA_HOME%soap-2.3.1libsoap.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%javamail-1.3.1mail.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%jaf-1.0.2activation.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xercesImpl.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xercesSamples.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xml-apis.jar
setCLASSPATH=%CLASSPATH%;%JAVA_HOME%xerces-2_6_0xmlParserAPIs.jar
setCLASSPATH=%CLASSPATH%;%CATALINA_HOME%commonlibservlet.jar
setCLASSPATH=%CLASSPATH%;%CATALINA_HOME%commonlib ools.jar
...
假如你的安装路径(installationpaths)和下面利用的分歧,你必要改正它们,然后封闭和重启Tomcat以使它们失效。如许,你就无为运转SOAP作好了筹办。可是如今,我要健忘有关的手艺部分,来学一点实际常识。
SOAP意义是复杂对象会见协定(SimpleObjectAccessProtocol)。切实其实如它的名字一样,SOAP是很复杂的。它是一个基于XML的协定,同意程序组件和使用程序相互利用一种尺度的Internet协定--HTTP来通信。SOAP是一种自力的平台,它不依附程序言语,它是复杂的,弹性的,很简单扩大的。今朝,使用程序可以相互利用一种基于DCOM和CORBA手艺的远程历程挪用(RPC)来举行互相通信,但HTTP不被计划为这个目标。RPC在Internet上使用长短常坚苦的,它们会呈现很多兼容性和平安性的成绩,由于防火墙和代办署理服务器一般城市阻断(block)这些范例的流量。使用程序之间最好的通信体例是经由过程HTTP协定,由于HTTP是撑持一切Internet扫瞄器和服务器的。基于这个目标,SOAP协定被创立出来。
那末,它们是怎样运作的呢?好比,一个使用程序(A)必要和另外一个使用程序(B)在SOAP的匡助下举行相互通信。它们将利用上面的框架图来完成这个历程:
这个SOAP信封(SOAPenvelope)是一个包括以下内容的XML文档:
正如你看到的,它长短常复杂的。它看起来的确就象一个一般的信封大概你的email。你想看看它们是怎样举措的吗?上面跟我们一同来吧。实在我们有良多办法是不必SOAP来在创立和运转我们本人的“HelloWorld”使用程序的,可是由于我们要坚持它的复杂性,我会给你一个它运作体例的框架图(scheme)。
我们的“HelloWorld”典范会包括一个SOAPService。我们的SOAPClient将发送它们的名字到该SOAPService,并试图失掉一些回复或呼应。这个SOAPService必要部署到一个SOAPAdmin的工具,以致重定位一切哀求的SOAP(Proxy)RPCRouter可以晓得它们应当利用哪一种服务来运作。总而言之,这个是以上面的体例来运作的:
如今,我们来一步步的看看究竟产生了甚么。在Step1里,HelloWorldClient将毗连一个SOAPRPCRouter,哀求我们的SOAPService并将包括我们名字的一个字符串传送给它。该SOAPRPCRouter会反省是不是它已部署了这个SOAPService。假如它被发明是被部署的,那末它将传送数据到这个SOAPService并挪用特定的办法,这个是Step2。然后SOAPService办法会被实行,将前往某个字符串值(该值就是SOAPClient的回复大概呼应)(Step3)。在Step4中,SOAPRPCRouter将仅仅只是重定向这个数据到SOAPClient。一切在Step1和Step4里传输的数据是经由过程SOAPEnvelope来完成的。正如你所看到的,算法是相称复杂的,因而我们只筹办体贴实践的代码。
起首,我们要创立一个SOAPService。上面是它的代码,请不要健忘将它放进HelloWorld/目次中(必需被包括在你的CLASSPATH中):
1://SOAPService.java
2:packageHelloWorld;
3:publicclassSOAPService{
4:publicStringsayHi(Stringx){
5:return("Hellomyfriend,"+x+"!Gladtoseeyou!");
6:}
7:}
增加任何正文也是很简单的。要编译它,只必要用以下命令:
javacSOAPService.java
第二步,一旦我们筹办好了SOAPService,我们必要用SOAPServiceManager来部署它。这个能够经由过程良多体例来完成,可是为了能让初学SOAP的读者更简单了解SOAP,我供应了一个最简单的体例。我们假定你的WebServer(Tomcat或其他)已一般运转,而且你已准确安装了SOAP。那末当扫瞄器会见http://localhost:8080/soap/,你会瞥见ApacheSOAP的接待页面。点击Runtheadminclient,然后Deploy。你会失掉一个屏幕显现,在那边你必要填进ID,Scope,Method,ProviderType和JAVAProvider的信息到表单域中。你能疏忽其他一切的表单域,除非你真的必要它们的信息。我们的“HelloWorld”例子不必要它们,以是,我们填的上面的值:
ID:urn:HelloWorld_SOAPService
Scope:Application
Methods:sayHi
ProviderType:java
JavaProvider-ProviderClass:HelloWorld.SOAPService
JavaProvider-Static?No
一些正文:ID是我们要从SOAPClient标识我们的SOAPService的独一名字。Method包括SOAPService供应的一系列办法。JAVAProvider-ProviderClass是SOAPServiceJava类的名字。
如今,点击Deploy按钮,那末你的服务会被部署。再次夸大,请注重准确设置CLASSPATH情况变量。然后,你的HelloWorld.SOAPService类可以被找到,而且一切必须的jar包也能被找到。这是个几近每一个人城市犯的一般毛病。如今,你可以点击List,将会瞥见你的服务已被部署出去。祝贺!
最初,让我们来创立一个SOAPClient。代码看起来有点庞大,可是在实际中不会只要这么点长。
1://HelloWorldClient.java
2:importjava.io.*;
3:importjava.net.*;
4:importjava.util.*;
5:importorg.apache.soap.*;
6:importorg.apache.soap.rpc.*;
7:publicclassHelloWorldClient{
8:publicstaticvoidmain(String[]arg)throwsException{
9:Callc=null;
10:URLurl=null;
11:Vectorparams=null;
12:Responserep=null;
13:StringourName="Superman";
14:StringourUrn="urn:HelloWorld_SOAPService";
15:StringourMethod="sayHi";
16:url=newURL("http://localhost:8080/soap/servlet/
rpcrouter");
17:System.out.println("Passingtoourdeployed"+ourUrn+"
ourname("+ourName+"):");
18:c=newCall();
19:c.setTargetObjectURI(ourUrn);
20:c.setMethodName(ourMethod);
21:c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
22:params=newVector();
23:params.addElement(newParameter("ourName",String.class,
ourName,null));
24:c.setParams(params);
25:System.out.print("anditsansweris:");
26:rep=c.invoke(url,"");
27:if(rep.generatedFault()){
28:Faultfault=rep.getFault();
29:System.out.println("
Callfailed!");
30:System.out.println("Code="+fault.getFaultCode());
31:System.out.println("String="+fault.getFaultString());
32:}else{
33:Parameterresult=rep.getReturnValue();
34:System.out.print(result.getValue());
35:System.out.println();
36:}
37:}
38:}
上面我要做一些注释。在第13行,我们设置了我们的名字,这个名字将会传送给SOAPService。在第14行,我们设置了我们将要挪用的服务的ID(serviceID),和第15行里设置的服务办法(servicemethod)。有了这个ID,服务可以被部署到SOAP服务办理器(SOAPServiceManager)中。我们没有设置任何其他值,仅仅只用方才那些基本值就能够一般运作了。你能从SOAP的官方文档上失掉相干信息,该文档来自SOAP包中,它们的注释超越了本文的局限。
用以下体例编译这个SOAPClient:
javacHelloWorldClient.java
为了美满完成它,让我们反省一下针对我们的测试,是不是一切事变都筹办停当。Tomcat正在运转,一切的情况变量都准确,SOAPService被编译和部署,SOAPClient被乐成编译。OK,让我们运转它,你将看到这个屏幕:
正如你所看到的,我们的SOAPClient利用SOAP协定乐成发送它的名字和吸收了一个回复。正如后面所说的,SOAPService发送和吸收的是SOAPenvelope。这个是SOAPenvelope的源代码。
被发送到SOAPService的SOAPEnvelope
<?xmlversion=1.0encoding=UTF-8?>
<SOAP-ENV:Envelopexmlns: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:sayHixmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/
soap/encoding/">
<ourNamexsi:type="xsd:string">Superman</ourName>
</ns1:sayHi>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>:
从SOAPService吸收的SOAPEnvelope
<?xmlversion=1.0encoding=UTF-8?>
<SOAP-ENV:Envelopexmlns: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:sayHiResponsexmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.
org/soap/encoding/">
<returnxsi:type="xsd:string">Hellomyfriend,Superman!
Gladtoseeyou!</return>
</ns1:sayHiResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
要了解SOAPEnvelope中的一切标签的寄义,我倡议你花一点工夫浏览http://www.w3.org/2001/06/soap-envelope定名空间标准。
我但愿本文可以在你了解SOAP手艺上有必定匡助。这个手艺是复杂的,风趣的,壮大的,弹性的。它被用在很多Web使用中,这些使用的数目也在不休增添。进修SOAP是值得的,最少你要晓得它是甚么和它是怎样运作的。
java主要分三块,j2se:java的基础核心语言。j2me:java的微型模块,专门针对内存小,没有持续电源等小型设备。j2ee:java的企业模块,专门针对企业数据库服务器的连接维护。 |
|