﻿<?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-nbtymm-随笔分类-Web Services</title><link>http://www.blogjava.net/nbtymm/category/12034.html</link><description>&lt;/br&gt;&lt;a href="http://www.fastonlineusers.com"&gt;&lt;b&gt;&lt;font color=red&gt;共有&lt;script src=http://fastonlineusers.com/online.php?d=bluedavy.blogjava.net&gt;&lt;/script&gt;人在同时阅读此Blog&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:42:02 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:42:02 GMT</pubDate><ttl>60</ttl><item><title>使用SOAP开发java web服务</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/09/51708.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Fri, 09 Jun 2006 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/09/51708.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/51708.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/09/51708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/51708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/51708.html</trackback:ping><description><![CDATA[
		<table class="fixedTable blogpost" cellspacing="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="bvh8">
								</td>
						</tr>
						<tr>
								<td id="msgcns!48122F59260F24A8!134">
										<div>本文的预定读者首先要对j2ee有所了解，熟悉xml，tomcat等基本内容，本文主要是简单介绍一下web服务的基本内容，怎样在java web开发中构建SOAP服务：<br /> 一、SOAP（Simple Object Access Protocol）简单对象访问协议，要了解SOAP，首先就需要了解分布式计算的由来，随着下一代的分布式计算体系web服务的出现，SOAP成为了创建和调用通过网络发布的应用程序的实际通信标准。SOAP类似传统的二进制协议IIOP（CORBA）和JRMP（RMI），但它不采用二进制数据表示法，而是采用使用XML的，基于文本的数据表示法。<br />        通过XML表示法，SOAP定义了一种小型有线连接协议和编码格式，以表示数据类型、编程语言和数据库，还可以使用各种Internet标准协议作为其消息传输工具，还可以提供表示RPC和文档驱动的消息交换等通信模型的约定。请注意，W3C正致力于SOAP的研究，<a href="http://www.w3c.org/2000/xp/Group/"><u><font color="#0000ff">http://www.w3c.org/2000/xp/Group/</font></u></a> ，并得到了主流供应商的积极响应，以便对于基于XML的协议相关的重要任务达成共识，并定义其关键要求和使用场景。<br />        SOAP1.2的基本规范定义了以下基本内容：<br />       1）用于将XML文档表示为结构化SOAP消息的语法和语义<br />       2）在SOAP消息中表示数据的编码标准<br />       3）用于交换SOAP消息的通信模型<br />       4）SOAP传输等底层协议的绑定<br />      SOAP消息主要包括了信封头，消息头，主体，附件几部分<br />      一个简单的SOAP消息表示：<br />      POST   /StudentInfo   HTTP/1.1<br />      Host：anthropology.cun.edu<br />      Content-Type: text/xml;charset="utf-8"<br />      Content-Length: 640<br />      SOAPAction:  "GetStudentInfo"<br /><br />     &lt;SOAP-ENV:Envelop xmlns:SOAP-ENV="<a href="http://www.w3c.org/2001/06/soap-envelope"><u><font color="#0000ff">http://www.w3c.org/2001/06/soap-envelope</font></u></a>"<br />              xmlns:xsi="<a href="http://www.w3c.org/2001/XMLSchema-instance"><u><font color="#0000ff">http://www.w3c.org/2001/XMLSchema-instance</font></u></a>"<br />              xmlns:xsd="<a href="http://www.w3c.org/2001/XMLSchema"><u><font color="#0000ff">http://www.w3c.org/2001/XMLSchema</font></u></a>"<br />             SOAP-ENV:encodingStyle="http://www.w3c.org/2001/06/soap-encoding"&gt;<br />        &lt;SOAP-ENV:Header&gt;<br />            &lt;person:mail xmlns:person="http://www.cun.edu/Header"&gt;xyz@cun.edu<br />        &lt;/SOAP-ENV:Header&gt; <br /><br />        &lt;SOAP-ENV:Body&gt;<br />            &lt;m:GetStudentInfo   xmlns:m="http://www.cun.edu/jws.student.studentInfo"&gt;<br />                 &lt;student_name xsi:type='xsd:string'&gt;<br />                        Wang wen yin<br />                 &lt;/student&gt;<br />             &lt;/m:GetStudentInfo&gt;<br />        &lt;/SOAP-ENV:Body&gt;<br />    &lt;/SOAP-ENV:Envelop&gt;<br />   以上是1.2版本命名空间，1.1的命名空间 SOAP ENVELOPE：<a href="http://schemas.xmlsoap.org/soap/envelop/"><u><font color="#0000ff">http://schemas.xmlsoap.org/soap/envelop/</font></u></a> ,SOAP ENCODING: <a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color="#0000ff">http://schemas.xmlsoap.org/soap/encoding/</font></u></a> <br />   关于SOAP编码规范请参阅<a href="http://www.w3c.org/TR/xmlschema-2/"><u><font color="#0000ff">www.w3c.org/TR/xmlschema-2/</font></u></a> 定义的编码值，其他的一些规范可以上<a href="http://www.w3c.org/"><u><font color="#0000ff">www.w3c.org</font></u></a> 上具体查看。<br />二、以下从实际例子来学习，这里我使用的是Apache的一个子项目Axis的具体例子，便于深入了解soap的运行：<br />    1）下载Axis的相关内容<a href="http://ws.apache.org/axis/"><u><font color="#0000ff">http://ws.apache.org/axis/</font></u></a>：<br />    2）建立一个实例程序（遵守j2ee的web程序规范），如（WebServiceTest目录）<br />          把axis中lib文件夹的内容拷到你的WebServiceTest/WEB-INF/lib下，同时上网下载xerces(下载地点：<a href="http://xml.apache.org/xerces-j/"><u><font color="#0000ff">http://xml.apache.org/xerces-j/</font></u></a>）解释器的包文件xerces.jar，也拷到WebServiceTest/WEB-INF/lib文件夹下,（若要配置log4j，请把属性文件log4j.properties拷到WebServiceTest/WEB-INF/classes文件夹下)<br />    3)修改应用程序WebServiceTest/WEB-INF中的web.xml文件：主要servlet设置如下<br />       &lt;servlet&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;servlet-class&gt;org.apache.axis.transport.http.AxisServlet&lt;/servlet-class&gt;<br />      &lt;/servlet&gt;<br />      &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />     &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;/servlet/TestServlet&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br />  <br />    &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt; 
<p><br />     &lt;servlet&gt;<br />          &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;<br />          &lt;servlet-class&gt;<br />               org.apache.axis.transport.http.AdminServlet<br />          &lt;/servlet-class&gt;<br />          &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;<br />     &lt;/servlet&gt;<br /> <br />     &lt;servlet-mapping&gt;<br />          &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;<br />          &lt;url-pattern&gt;/servlet/AdminServlet&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br /> <br />     &lt;mime-mapping&gt;<br />          &lt;extension&gt;wsdl&lt;/extension&gt;<br />          &lt;mime-type&gt;text/xml&lt;/mime-type&gt;<br />     &lt;/mime-mapping&gt;<br /> <br />     &lt;mime-mapping&gt;<br />          &lt;extension&gt;xsd&lt;/extension&gt;<br />          &lt;mime-type&gt;text/xml&lt;/mime-type&gt;<br />     &lt;/mime-mapping&gt;<br />    你现在可以在网址里输入<a href="http://localhost/WebServiceTest/servlet/TestServlet"><u><font color="#0000ff">http://localhost/WebServiceTest/servlet/TestServlet</font></u></a> 看到了吗？Axis是使用axis.jar包里的org.apache.axis.transport.http.AxisServlet对应用程序进行处理的，基本配置就讲到这里。<br />三、接着我们来说Axis中的内核。<br />1）不使用Tomcat引擎运行Axis。<br />       先建立一个脚步文件，对环境变量classpath进行设置要把lib下的那些包文件的路径全都包括进去，运行：java  org.apache.axis.transport.http.SimpleAxisServer  &lt;port&gt;<br /> 2）内部服务处理程序是org.apache.axis.providers.java.RPCProvider，标志出服务所需的方法，然后提供从SOAP请求消息组成部分的参数。<br /> 3）Axis的应用程序端管理功能：<br />       java  org.apache.axis.client.AdminClient 就会列出参数，可供你选择。我们的例子是：java  org.apache.axis.client.AdminClient  -l <a href="http://localhost/WebserviceTest/servlet/TestServlet"><u><font color="#0000ff">http://localhost/WebserviceTest/servlet/TestServlet</font></u></a>  list 就会显示出服务列表，返回的是xml文件<br />4）wsdl2java应用程序可以把wsdl文件创建基于java的程序，如占位程序等<br />     java  org.apache.axis.wsdl.WSDL2java  &lt;url&gt;<br />Axis的基本内容说到这里<br />四、具体例子<br /> 1）编写逻辑程序，简单如：SoapTest.java<br />    public class SoapTest{<br />        public String getStr(String name){<br />            return "Hello，"+name;<br />        }<br />    }<br />  2) 部署服务，编写wsdd文件SoapTest_deploy.wsdd:<br />     &lt;deployment name="SimapleTest" xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color="#0000ff">http://xml.apache.org/axis/wsdd/</font></u></a>"<br />         xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color="#0000ff">http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"<br />         xmlns:xsd="<a href="http://www.w3.org/2000/10/XMLSchema"><u><font color="#0000ff">http://www.w3.org/2000/10/XMLSchema</font></u></a>"<br />         xmlns:xsi="<a href="http://www.w3.org/2000/10/XMLSchema-instance"><u><font color="#0000ff">http://www.w3.org/2000/10/XMLSchema-instance</font></u></a>"&gt;<br />             &lt;service name="SoapTest" provider="java:RPC"&gt;<br />                  &lt;parameter name="className" value="SoapTest"/&gt;<br />                  &lt;parameter name="allowedMethods" value="getStr"/&gt;<br />             &lt;/service&gt;<br />    &lt;/deployment&gt;<br />    其中className参数是你的想部署的类名（全名），allowedMethods是调用的服务的方法，如果有多个方法的话可以用空格分开（如： &lt;parameter name="allowedMethods" value="getStr  getMoney"/&gt;),当用*的时候表示全部。<br />     好了现在准备部署了，确保环境路径classpath设置正确，运行：<br />        java  org.apache.axis.client.AdminClient  -l  <a href="http://localhost/WebserviceTest/servlet/TestServlet"><u><font color="#0000ff">http://localhost/WebserviceTest/servlet/TestServlet</font></u></a>  SoapTest_deploy.wsdd<br />     （这里不懂的话，请参考以上的说明） <br /> ok，呵呵，至此，我们已经完成了一个web服务的部署：测试<a href="http://localhost/WebServiceTest/servlet/TestServlet"><u><font color="#0000ff">http://localhost/WebServiceTest/servlet/TestServlet</font></u></a>  看里面是否多了一个选择SoapTest服务？<br />      如果不想要服务了那重新编写一个wsdd文件，内容改为：<br />&lt;deployment name="SimapleTest" xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color="#0000ff">http://xml.apache.org/axis/wsdd/</font></u></a>"<br />         xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color="#0000ff">http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"<br />         xmlns:xsd="<a href="http://www.w3.org/2000/10/XMLSchema"><u><font color="#0000ff">http://www.w3.org/2000/10/XMLSchema</font></u></a>"<br />         xmlns:xsi="<a href="http://www.w3.org/2000/10/XMLSchema-instance"><u><font color="#0000ff">http://www.w3.org/2000/10/XMLSchema-instance</font></u></a>"&gt;<br />            &lt;service name="SoapTest"/&gt;<br />&lt;/deployment&gt;<br />和上面一样，对比一下就ok了。<br />五、客户端测试：<br />     客户端我们也可以使用java来进行测试，网上也有资料的，你可以去学习，很简单的。现在为了体现web服务的魅力，我用.NET平台来测试吧，客户端使用c#编写（先要安装.net framework sdk)：<br />    1）通过wsdl生成web服务代理，在net平台下运行：<br />      wsdl  /l:CS  /protocol:SOAP  /out:SoapTestClient.cs  <a href="http://localhost/WebserviceTest/services/SoapTest?wsdl"><u><font color="#0000ff">http://localhost/WebserviceTest/services/SoapTest?wsdl</font></u></a>  <br />        我们通过wsdl得到了一个cs文件SoapTestClient.cs（当前目录），你可以打开cs文件，研究一下里面的代码，那个getStr(string name)就是我们需要调用的方法，我们的客户端通过调用该方法就可以调用服务器端的方法，内部的转化wsdl.exe工具已经帮我们完成了，axis下的WSDL2Java工具也是一样的功能，可以参考我上面所说的关于Axis的内核内容<br />   2)编译cs文件成程序集dll：<br />      csc /target:library /r:System.Web.Services.dll  /r:System.Xml.dll SoapTestClient.cs<br />      最后我们等到了一个dll文件SoapTestClient.dll，客户端程序通过调用它就行了<br />   3）编写客户端应用程序SoapTestClientApp.cs<br />      using System;<br />      <br />      namespache  jws.client{<br />         public class SoapTestClientApp{<br />            public SoapTestClientApp(){<br />            }<br />            public static void Main(string[] args){<br />                if(args.Length!=1){<br />                    Console.WriteLine("Usage:SoapTestClientApp &lt;name&gt;");<br />                    Environment.Exit(1);<br />                }<br />                SoapTestService  st_service=new SoapTestService();<br />                st_service.getStr("Wang wenyin");<br />           }<br />        } <br />     }<br />４）编译文件csc  /r:SoapTestClient.dll  SoapTestClientApp.cs<br />    运行SoapTestClientApp<br />输出结果：<br />     Hello,Wang wenyin<br />与预期结果相符。<br /></p></div>
								</td>
						</tr>
						<tr>
								<td>
										<table cellspacing="0" border="0">
												<tbody>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/nbtymm/aggbug/51708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-09 15:51 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/09/51708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>