﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小海贼的夜晚-随笔分类-webservice</title><link>http://www.blogjava.net/pirate/category/2364.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 07 Mar 2007 18:17:41 GMT</lastBuildDate><pubDate>Wed, 07 Mar 2007 18:17:41 GMT</pubDate><ttl>60</ttl><item><title>第一个AXIS WEB服务程序- </title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8663.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8663.html</trackback:ping><description><![CDATA[<P>在我们的项目成功应用了Hessian作为远程函数调用的技术方案之后，我又产生了新的疑问，它是除EJB和RMI-OP之外的唯一RPC选择吗？据说AXIS才是Web Service的正选，不管是否应用它，都应该去试试和了解它。那今天就上第一课吧，先做一个HelloWorld程序吧！</P>
<P>1）在<A href="http://ws.apache.org/axis/index.html">http://ws.apache.org/axis/index.html</A>下载AXIS的BIN版本，并将其解压后将其中的webapps\axis目录拷贝到你的tomcat目录下的webapps目录之下。</P>
<P>2）将以下jar拷贝至你的axis/WEB-INF/lib目录下：</P>
<P>activation.jar 、mail.jar 、xalan-2.4.0.jar 、xerces-2.4.0.jar 、 xercesImpl.jar</P>
<P>3）在axis目录下建立以下文件Hello.jws，内容如下：</P>
<P>public class Hello{<BR>&nbsp;public String hello(String name){<BR>&nbsp; if(name==null)<BR>&nbsp;&nbsp; name = "";<BR>&nbsp; return "hello,"+name+"!";<BR>}<BR>}<BR></P>
<P>4）创建JAVA接口程序，在命令行下进入到axis\WEB-INF目录下，在DOS提示符下输入：</P>
<P>Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl<BR></P>
<P>该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws，该目录下有四个JAVA源文件，它们分别是： </P>
<P>Hello.java 定义了Web服务接口，此例中只有一个hello方法。 </P>
<P>HelloService.java 定义了用于获取Web服务接口的方法。 </P>
<P>HelloServiceLocator.java 接口HelloService的具体实现。 </P>
<P>HelloSoapBindingStub.java Web服务客户端桩，通过该类与服务器交互。</P>
<P>5）编写调用示例程序Main.java如下：</P>
<P>package localhost.axis.Hello_jws;</P>
<P>public class Main {<BR>&nbsp;public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;HelloService service = new HelloServiceLocator();<BR>&nbsp;&nbsp;Hello hello = service.getHello();<BR>&nbsp;&nbsp;System.out.println(hello.hello("sunbeam"));<BR>&nbsp;}<BR>}<BR></P>
<P>6）编译后运行，如果输出以下结果，恭喜你已经成功的完成了你的第一个AXIS WEB Serive程序啦。</P>
<P>&gt; hello,sunbeam</P>
<P>附注：</P>
<P>1）建议使用Eclipse进行开发，将axis目录设为tomcat project工程位置，将WEB-INF下的localhost目录设为源文件目录。并将生成接口程序的命令行程序定为Extend Tool外部程序。这样的生产效率最高也最方便。具体做法今天就懒得写了，以后再补好啦。</P>
<P>2）我顺便写个程序测试一下它所能承载的数据量和运行速度，感觉速度明显低于Hessian（估计接近一个数量级），传输的对象大小也大约是Hessian的1/5-1/10左右，究其原因我推论是Hessian是二进制方式传输数据，Axis的WEB服务是文本型的SOAP协议传输，而且再加上XML标签所占用的大量数据而已。下次再评估一下其它的RPC方法。</P><img src ="http://www.blogjava.net/pirate/aggbug/8663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:28 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个Hessian应用-</title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8662.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8662.html</trackback:ping><description><![CDATA[<P>Hessian是一个简单的二进制的Web服务方案（其实我觉得它更多的是一种二进制对象传递方式），它只需要一个客户端接口和服务端程序就可以轻松实现程序的远程调用啦。<BR>下面就以Hessian主页上的例子来show一下这种简单的RPC应用方案啦</P>
<P><BR><STRONG><FONT size=3>1、在tomcat下创建一个应用test，在其下的WEB-INF/src目录下编写以下程序文件。</FONT></STRONG></P>
<P><FONT size=3><STRONG>2、创建服务端程序文件example/BasicService.java，内容如下：</STRONG><BR></FONT>package example;</P>
<P>public class BasicService implements Basic {<BR>&nbsp; private String _greeting = "Hello, world";</P>
<P>&nbsp; public void setGreeting(String greeting)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; _greeting = greeting;<BR>&nbsp; }</P>
<P>&nbsp; public String hello()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; return _greeting;<BR>&nbsp; }<BR>}</P>
<P><FONT size=3><STRONG>3、创建一个本地接口，example/Basic.java，内容如下：</STRONG></FONT><BR>package example;</P>
<P>public interface Basic {<BR>&nbsp;&nbsp; public String hello();&nbsp;//与服务端的hello方法对应<BR>}</P>
<P><BR><STRONG><FONT size=3>4、创建客户端测试程序，example/BasicClient.java，内容如下：</FONT></STRONG></P>
<P>package example;</P>
<P>import com.caucho.hessian.client.HessianProxyFactory;</P>
<P>public class BasicClient {<BR>&nbsp; public static void main(String []args)<BR>&nbsp;&nbsp;&nbsp; throws Exception<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String url = "<A href="http://127.0.0.1:8080/test/hello">http://127.0.0.1:8080/test/hello</A>";</P>
<P>&nbsp;&nbsp;&nbsp; HessianProxyFactory factory = new HessianProxyFactory();<BR>&nbsp;&nbsp;&nbsp; Basic basic = (Basic) factory.create(Basic.class, url);</P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("Hello: " + basic.hello());<BR>&nbsp; }<BR>}</P>
<P><FONT size=3><STRONG>5、修改WEB-INF下的web.xml文件，填充以下内容：</STRONG></FONT></P>
<P>&nbsp; &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</P>
<P>&lt;!DOCTYPE web-app<BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<BR>&nbsp;&nbsp;&nbsp; "<A href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</A>"&gt;<BR>&nbsp;&lt;web-app&gt;<BR>&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp; &lt;servlet-name&gt;hello&lt;/servlet-name&gt;<BR>&nbsp;&nbsp; &lt;servlet-class&gt;com.caucho.hessian.server.HessianServlet&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-class&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.BasicService&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-api&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.Basic&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp; &lt;/servlet&gt;</P>
<P>&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/hello&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;hello&lt;/servlet-name&gt;<BR>&nbsp; &lt;/servlet-mapping&gt;<BR>&lt;/web-app&gt;<BR></SERVLET-MAPPING /><BR></P></WEB-APP />
<P><STRONG><FONT size=3>6、启动tomcat后，运行一下BasicClient类</FONT></STRONG></P>
<P>看一看，是不是输出以下的内容啦，如果有恭喜你，已经成功创建你的第一个RPC Hessian应用了。<BR>&gt; Hello: Hello, world<BR></P><img src ="http://www.blogjava.net/pirate/aggbug/8662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:20 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>soap简单使用</title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8660.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8660.html</trackback:ping><description><![CDATA[开始之前，我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论SOAP技术，我们将尽可能的讲得通俗易懂一些，所以，我们引入了一个普通的“Hello World”范例来给读者说明它们是怎么运作的，让读者知道它们的运作方式。我认为，如果光看官方文档是很难开始学习这门新技术的，官方文档中包含大量的范例，并解释了所有的特性和优点，但是没解释它们的运作方式。在这篇文章中，我不打算只肤浅的解释SOAP技术的定义，我们假设读者熟悉JAVA语言，Web技术，具有XML语言，XML Namespaces，XML Schema的基础。在这种情况下，理解本文将不存在任何困难。然而，即使没有这些知识，你也不必担心，我们将尽可能的解释得简单，但是当你开始做自己的SOAP应用程序时会遇到一些问题和麻烦。因此，花费一定时间来学习上面的知识是很有必要的。 <BR><BR>　　从技术的角度来说，有必要提一下我们的调试环境。我们使用的是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文件中： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>...<BR>set CATALINA_HOME=C:\Tomcat4.1.29<BR>set CLASSPATH=%JAVA_HOME%\lib\tools.jar<BR>set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar<BR>set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar<BR>set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar<BR>... </TD></TR></TBODY></TABLE><BR>　　如果你的安装路径（installation paths）和上面使用的不同，你需要更正它们，然后关闭和重启Tomcat以使它们生效。这样，你就有为运行SOAP作好了准备。但是现在，我要忘记有关的技术部分，来学一点理论知识。<BR><BR>　　SOAP意思是简单对象访问协议（Simple Object Access Protocol）。的确如它的名字一样，SOAP是很简单的。它是一个基于XML的协议，允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台，它不依赖程序语言，它是简单的，弹性的，很容易扩展的。目前，应用程序能够彼此使用一种基于DCOM和CORBA技术的远程过程调用（RPC）来进行相互通讯，但HTTP不被设计为这个目的。RPC在Internet上应用是非常困难的，它们会出现许多兼容性和安全性的问题，因为防火墙和代理服务器通常都会阻断（block）这些类型的流量。应用程序之间最好的通讯方式是通过HTTP协议，因为HTTP是支持所有Internet浏览器和服务器的。基于这个目的，SOAP协议被创建出来。<BR><BR>　　那么，它们是如何运作的呢？比如，一个应用程序（A）需要和另一个应用程序（B）在SOAP的帮助下进行彼此通讯。它们将使用下面的框架图来完成这个过程：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201676.gif';" hspace=3 src="http://www.yesky.com/image20010518/201676.gif" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　这个SOAP信封（SOAP envelope）是一个包含以下内容的XML文档：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201677.gif';" hspace=3 src="http://www.yesky.com/image20010518/201677.gif" align=center vspace=1 border=1></DIV></DIV></TD></TR></TBODY></TABLE><BR>　　正如你看到的，它是非常简单的。它看起来确实就象一个普通的信封或者你的email。你想看看它们是如何动作的吗？下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己的“Hello World”应用程序的，但是因为我们要保持它的简单性，我会给你一个它运作方式的框架图（scheme）。<BR><BR>　　我们的“Hello World”范例会包含一个SOAP Service。我们的SOAP Client将发送它们的名字到该SOAP Service，并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin的工具，以至重定位所有请求的SOAP（Proxy） RPC Router能够知道它们应该使用哪种服务来运作。总而言之，这个是以下面的方式来运作的：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201680.gif';" hspace=3 src="http://www.yesky.com/image20010518/201680.gif" align=center vspace=1 border=1></DIV></DIV></TD></TR></TBODY></TABLE><BR>　　现在，我们来一步步的看看到底发生了什么。在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来完成的。正如你所看到的，算法是相当简单的，因此我们只准备关心实际的代码。 <BR>首先，我们要创建一个SOAP Service。下面是它的代码，请不要忘记将它放入HelloWorld/ 目录中（必须被包含在你的CLASSPATH中）：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>1: // SOAPService.java<BR>2: package HelloWorld;<BR>3: public class SOAPService {<BR>4: public String sayHi(String x) {<BR>5: return("Hello my friend, " + x + "! Glad to see you!");<BR>6: }<BR>7: } </TD></TR></TBODY></TABLE><BR>　　添加任何注释也是很容易的。要编译它，只需要用下列命令：<BR><BR>　　javac SOAPService.java<BR><BR>　　第二步，一旦我们准备好了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”例子不需要它们，所以，我们填的下面的值：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>ID: urn:HelloWorld_SOAPService <BR>Scope: Application <BR>Methods: sayHi <BR>Provider Type: java <BR>Java Provider - Provider Class: HelloWorld.SOAPService <BR>Java Provider - Static? No </TD></TR></TBODY></TABLE><BR>　　一些注释：ID是我们要从SOAP Client标识我们的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java类的名字。<BR><BR>　　现在，点击Deploy 按钮，那么你的服务会被部署。再次强调，请注意正确设置CLASSPATH环境变量。然后，你的HelloWorld.SOAPService类能够被找到，并且所有必需的jar包也能被找到。这是个几乎每个人都会犯的普通错误。现在，你能够点击 List ，将会看见你的服务已经被部署进来。恭喜！<BR><BR>　　最后，让我们来创建一个SOAP Client。代码看起来有点复杂，但是在现实中不会只有这么点长。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>1: // HelloWorldClient.java<BR>2: import java.io.*;<BR>3: import java.net.*;<BR>4: import java.util.*;<BR>5: import org.apache.soap.*;<BR>6: import org.apache.soap.rpc.*;<BR>7: public class HelloWorldClient {<BR>8: public static void main(String[] arg) throws Exception {<BR>9: Call c = null;<BR>10: URL url = null;<BR>11: Vector params = null;<BR>12: Response rep = null;<BR>13: String ourName = "Superman";<BR>14: String ourUrn = "urn:HelloWorld_SOAPService";<BR>15: String ourMethod = "sayHi";<BR>16: url = new URL("http://localhost:8080/soap/servlet/<BR>rpcrouter");<BR>17: System.out.println("Passing to our deployed "+ourUrn+"<BR>our name ("+ourName+"): ");<BR>18: c = new Call();<BR>19: c.setTargetObjectURI(ourUrn);<BR>20: c.setMethodName(ourMethod);<BR>21: c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);<BR>22: params = new Vector();<BR>23: params.addElement(new Parameter("ourName", String.class,<BR>ourName, null));<BR>24: c.setParams(params);<BR>25: System.out.print("and its answer is: ");<BR>26: rep = c.invoke(url, "");<BR>27: if (rep.generatedFault()) {<BR>28: Fault fault = rep.getFault();<BR>29: System.out.println("\nCall failed!");<BR>30: System.out.println("Code = " + fault.getFaultCode());<BR>31: System.out.println("String = " + fault.getFaultString());<BR>32: } else {<BR>33: Parameter result = rep.getReturnValue();<BR>34: System.out.print(result.getValue());<BR>35: System.out.println();<BR>36: }<BR>37: }<BR>38:} </TD></TR></TBODY></TABLE><BR>　　下面我要做一些解释。在第13行，我们设置了我们的名字，这个名字将会传递给SOAP Service。在第14行，我们设置了我们将要调用的服务的ID（service ID），和第15行里设置的服务方法（service method）。有了这个ID，服务能够被部署到SOAP服务管理器（SOAP Service Manager）中。我们没有设置任何其他值，仅仅只用刚才那些基础值就可以正常运作了。你能从SOAP的官方文档上得到相关信息，该文档来自SOAP包中，它们的解释超出了本文的范围。<BR><BR>　　用以下方式编译这个SOAP Client：<BR><BR>　　javac HelloWorldClient.java<BR><BR>　　为了圆满完成它，让我们检查一下针对我们的测试，是否所有事情都准备就绪。Tomcat正在运行，所有的环境变量都正确，SOAP Service被编译和部署，SOAP Client被成功编译。OK，让我们运行它，你将看到这个屏幕：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201681.gif';" hspace=3 src="http://www.yesky.com/image20010518/201681.gif" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　正如你所看到的，我们的SOAP Client使用SOAP协议成功发送它的名字和接收了一个答复。正如前面所说的，SOAP Service发送和接收的是SOAP envelope。这个是SOAP envelope的源代码。<BR><BR>　　被发送到SOAP Service的SOAP Envelope<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version='1.0' encoding='UTF-8'?＞<BR>＜SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<BR>soap/envelope/"<BR>xmlns:xsi="http://www.w3.org/2001/<BR>XMLSchema-instance"<BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<BR>＜SOAP-ENV:Body＞<BR>＜ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService"<BR>SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/<BR>soap/encoding/"＞<BR>＜ourName xsi:type="xsd:string"＞Superman＜/ourName＞<BR>＜/ns1:sayHi＞<BR>＜/SOAP-ENV:Body＞<BR>＜/SOAP-ENV:Envelope＞: </TD></TR></TBODY></TABLE><BR>　　从SOAP Service接收的SOAP Envelope<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version='1.0' encoding='UTF-8'?＞<BR>＜SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<BR>soap/envelope/"<BR>xmlns:xsi="http://www.w3.org/2001/<BR>XMLSchema-instance"<BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<BR>＜SOAP-ENV:Body＞<BR>＜ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService"<BR>SOAP-ENV:encodingStyle="http://schemas.xmlsoap.<BR>org/soap/encoding/"＞<BR>＜return xsi:type="xsd:string"＞Hello my friend, Superman!<BR>Glad to see you!＜/return＞<BR>＜/ns1:sayHiResponse＞<BR>＜/SOAP-ENV:Body＞<BR>＜/SOAP-ENV:Envelope＞ </TD></TR></TBODY></TABLE><BR>　　要理解SOAP Envelope中的所有标签的含义，我建议你花一点时间阅读 http://www.w3.org/2001/06/soap-envelope 命名空间规范。<BR><BR>　　我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单的，有趣的，强大的，弹性的。它被用在许多Web应用中，这些应用的数量也在不断增加。学习SOAP是值得的，至少你要知道它是什么和它是怎么运作的。 
<DIV class=right>&nbsp;</DIV><img src ="http://www.blogjava.net/pirate/aggbug/8660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:02 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>