﻿<?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-&lt;font size="5"&gt;Web技术学习园地&lt;/font&gt;-文章分类-WebService</title><link>http://www.blogjava.net/CrazyJava/category/33796.html</link><description>&lt;marquee behavior="alternate" scrolldelay=3 scrollamount=3&gt;
&lt;font face="楷体_GB2312" color="#FFFF00" size="4"&gt;网络无所不在,信息无所不在,应用无所不在!&lt;/font&gt;
&lt;/marquee&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 23 Nov 2008 20:30:28 GMT</lastBuildDate><pubDate>Sun, 23 Nov 2008 20:30:28 GMT</pubDate><ttl>60</ttl><item><title>Tomcat+Axis+MyEclipse</title><link>http://www.blogjava.net/CrazyJava/articles/241979.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Sat, 22 Nov 2008 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/241979.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/241979.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/241979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/241979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/241979.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Tomcat+Axis+MyEclipse</span></p>
<table cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">转：http://blog.csdn.net/ziapple/archive/2007/05/19/1616736.aspx</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">WSDL:Web Service Description Language</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">环境：Tomcat5.0.28+Axis1.4+MyEclipse6.5</span></p>
            <p style="text-indent: -19.5pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Ax </span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">一、Axis三种开发方式</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Axis(Apache extensible Interaction system)</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">是Apache项目组织的一个开源项目。前身是Apache SOAP,它通过如下方法来扩展了soap2.0的功能：</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">AXIS</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">的关键功能和优势表现在速度(早期的SOAP的分析机制是基于DOM的，而AXIS是基于SAX的)，灵活性(提供了在引擎中插入新扩展的功能，可以对头部信息的处理和系统管理进行定制，在WSDD中对服务，Handler对象和串行并行程序进行描述)，面向组件展开(引入了链接chainable和 Handler的概念)，传输框架(SOAP可以建立在SMTP, FTP, HTTP等多种传输层协议上)。</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Axis</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">支持三种web service的部署和开发，分别为:</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　1、Dynamic Invocation Interface ( DII)</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　2、Dynamic Proxy方式</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　3、Stubs方式</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">对于前两种 Web Service的发布基本一样，客户端的访问也很类似，第一种发布就是直接将.java后缀改为.jws，并将生成的.class文件拷贝到WEB- INF/jwsclasses下面，这样的例子直接在Axis上就有，非常简单，但它也有缺陷，就是不适合程序部署和大型项目开发，而且不支持包（package）的形式（这个只是我的个人见解），第三种是目前比较流行的方式，stub意思是树桩，意味着服务端和客户端都是通过桩的形式来完成访问的，即在服务端将java转换成wsdl,在客户端将wsdl装换成java，这样就实现了良好的桩的分离。</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">二、</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Dynamic Invocation Interface ( DII)</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">开发方式</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">1</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">． 在Eclipse里新建一个Tomcat Project取名为testaxis，在接下来的工程中我们也统一用这一工程来演示。</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">2</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">． 接着是部署Axis所必须的步骤</span></p>
            <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">将axis-1_4"webapps"axis中几个必须的文件拷贝到你的AxisTest工程文件下，一个是WEB-INF"lib下的所有文件，一个是WEB-INF下面的web.xml文件，我们来简单看一下web.xml这个文件</span></p>
            <table style="margin-left: 14.4pt; width: 405pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="540" border="0">
                <tbody>
                    <tr style="height: 210.75pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 405pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 210.75pt" valign="top" width="540">
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;servlet&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.axis.transport.http.AxisServlet</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;/servlet&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;servlet-mapping&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/AxisServlet&lt;/url-pattern&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;/servlet-mapping&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;servlet-mapping&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;/servlet-mapping&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;servlet-mapping&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;</span></p>
                        <p style="text-indent: 12.6pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&lt;/servlet-mapping&gt;</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="margin-left: 21pt; text-indent: 17.65pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">就是说如果向容器请求/servlet/AxisServlet、*.jws、/services/*这几种映射会引起调用AxisServlet这个类，我们要用的就这几行，其他的可以直接删掉。</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">3</span><span style="line-height: 150%; font-family: 宋体">． 在WEB-INF/src下面新建一个myService.java文件，如下</span></p>
            <table style="margin-left: 62.4pt; width: 387.75pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="517" border="0">
                <tbody>
                    <tr style="height: 76.65pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 387.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 76.65pt" valign="top" width="517">
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">public class myService {</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getusername(String name){</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello "+name+",this is an Axis DII Web Service";</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">}</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="text-indent: 17.65pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">注意这个java文件是不属于任何package的，如果你要将其放入某个package那么Axis会提示你找不到它生成的class文件从而不能将其转换为wsdl文件。</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">4</span><span style="line-height: 150%; font-family: 宋体">． 将myService.java拷贝到AxisTest根目录下，将其后缀改为jws。</span></p>
            <p style="margin-left: 38.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">5</span><span style="line-height: 150%; font-family: 宋体">． 启动Tomcat输入http://localhost:8089/testaxis/myService.jws?wsdl,点击Click to see the WSDL,如果看到如下界面就表示你已经成功发布一个Web Service了，就这么简单，如果出现错误就表示你的配置错误，或者是你的web.xml有问题，或者是你的包引用有问题，多试几遍这个问题很容易搞定的，这个一定要正确，不然接下来的客户端就访问不到了，这时候你会在WEB-INF下面看到Axis会自动生成一个jwsClasses文件夹，jwsClasses下面会有一个myService.class文件。</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">6</span><span style="line-height: 150%; font-family: 宋体">． 接下来是编写客户端来访问这个getService，在com.axistest包下新建一个myServiceTestorByjws.java，代码如下：</span></p>
            <table style="margin-left: 23.4pt; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr style="height: 217.55pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 396pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 217.55pt" valign="top" width="528">
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">/**<br />
                        * <br />
                        */<br />
                        package com.axistest;</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">import java.net.MalformedURLException;<br />
                        import java.rmi.RemoteException;</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体"><br />
                        import javax.xml.rpc.ParameterMode;<br />
                        import javax.xml.rpc.ServiceException;</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">import org.apache.axis.client.Call;<br />
                        import org.apache.axis.client.Service;<br />
                        import org.apache.axis.encoding.XMLType;</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">public class myServiceTestorByjws {<br />
                        <br />
                        public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpoint="http://localhost:8089/testaxis/myService.jws";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name="</span><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">毛毛";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service service = new Service();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call call = (Call) service.createCall();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(endpoint));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("param1",XMLType.XSD_STRING,ParameterMode.IN);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName( "getusername" );<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setReturnType( XMLType.XSD_STRING );<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ret = (String) call.invoke( new Object[] { name } );<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("返回结果：" + ret);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        }</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">7</span><span style="line-height: 150%; font-family: 宋体">．</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">运行结果：返回结果：Hello 毛毛,this is an Axis DII Web Service</span></p>
            <p style="text-indent: -19.5pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: #333333; line-height: 150%; font-family: 宋体">三二、</span><span style="color: #333333; line-height: 150%; font-family: 宋体">Dynamic Proxy</span><span style="color: #333333; line-height: 150%; font-family: 宋体">方式，WSDD方式</span></p>
            <p style="text-indent: 17.65pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">动态代理就是通过wsdd来描述Web服务，而不是直接访问jws，前面说过jws是不支持包的，而且运行也不稳定，有时候可以访问有时候就不可以，所以不推荐此种方法，wsdd和wsdl的区别在于前者只描述Web服务和操作方法以及传输方式，它相对于wsdl要简单的多，更易被人读懂。为此我们需要作如下工作：</span></p>
            <p style="margin-left: 59.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">1.</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">为了更好的区分，我们将myService放入com.service包下，这就是WSDD的好处，它不像DII不能建包,并修改代码如下</span></p>
            <table style="margin-left: 110.05pt; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr style="height: 115.15pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 371.25pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 115.15pt" valign="top" width="495">
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">package com.service;</span></p>
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">public class MyserviceDP {<br />
                        public String getusername(String name){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello "+name+",this is an Axis Dynamic Proxy Web Service";<br />
                        &nbsp;&nbsp;&nbsp; }<br />
                        }</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">2.</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">在WEB-INF下新建一个server-config.wsdd文件，代码如下：</span></p>
            <table style="margin-left: 110.05pt; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr style="height: 15.1pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 360pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 15.1pt" valign="top" width="480">
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; background: white; color: red; line-height: 150%; font-family: 宋体">&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<br />
                        &lt;handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/&gt;&nbsp;&nbsp; <br />
                        &nbsp;&nbsp; &lt;service name="myService" provider="java:RPC"&gt;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="com.service.MyserviceDP"/&gt;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="getusername"/&gt;<br />
                        &nbsp;&nbsp;&nbsp; &lt;/service&gt;<br />
                        &lt;transport name="http"&gt;<br />
                        &lt;requestFlow&gt;<br />
                        &nbsp;&nbsp;&nbsp; &lt;handler type="URLMapper"/&gt;<br />
                        &lt;/requestFlow&gt;<br />
                        &lt;/transport&gt;<br />
                        &lt;/deployment&gt;</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">3.</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">测试发布的myService,重启Tomcat，在浏览器输入</span></p>
            <p style="margin-left: 41.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">http://localhost:8089/testaxis/servlet/AxisServlet</span><span style="line-height: 150%; font-family: 宋体">；如果出现如下界面表示你的Web Service发布成功（ 点 myServiceDP <a href="http://localhost:8089/testaxis/services/myServiceDP?wsdl"><em><span style="line-height: 150%">(wsdl)</em></a> </span>）</span></p>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">4.</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">接下来写客户端代码，在com.axistest下新建一个</span></p>
            <p style="text-indent: 0.35pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">myServiceTestorByWSDD.java</span><span style="line-height: 150%; font-family: 宋体">，代码如下：</span></p>
            <table style="margin-left: 38.05pt; width: 468pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="624" border="0">
                <tbody>
                    <tr style="height: 22.9pt">
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 468pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 22.9pt" valign="top" width="624">
                        <p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">package com.axistest;<br />
                        import java.net.MalformedURLException;<br />
                        import java.rmi.RemoteException;<br />
                        import javax.xml.rpc.ServiceException;<br />
                        import org.apache.axis.client.Call;<br />
                        import org.apache.axis.client.Service;<br />
                        public class myServiceTestorByWSDD {<br />
                        public static void main(String[] args) throws ServiceException,MalformedURLException, RemoteException {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpoint = "http://localhost:8089/testaxis/services/myServiceDP";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service service = new Service();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 12pt; color: red; line-height: 150%; font-family: 宋体">创建一个Service实例，注意是必须的！<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call call = (Call) service.createCall();&nbsp;&nbsp; // 创建Call实例，也是必须的！<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(endpoint));// 为Call设置服务的位置<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName("getusername");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注意方法名与JavaBeanWS.java中一样！！<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String res = (String) call.invoke(new Object[] { "毛毛" });&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 返回String，传入参数<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(res);<br />
                        }<br />
                        }</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">注意上述方法和jws方式唯一的不同就在于endpoint的引用方式不同，一个是直接引用jws文件，一个是引用一个wsdd描述的服务。</span></p>
            <p style="margin-left: 59.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">5.</span><span style="font-size: 7pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体">运行结果：Hello 毛毛,this is an Axis Dynamic Proxy Web Service</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: -19.5pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 12pt; color: #333333; line-height: 150%; font-family: 宋体">三、</span><span style="color: #333333; line-height: 150%; font-family: 宋体">Stubs</span><span style="color: #333333; line-height: 150%; font-family: 宋体">方式</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">这种实现方式是目前比较流行的方式，他将用于发布服务的提供商和用于引用服务的应用商有效的实现了分离，而且较之于前两种开发方法，Stubs不需要程序员关注WebService的返回类型，也就是不用我们去关心wsdl，因为他是axis自动生成的，例如webservice要返回一个Stirng[]类型，axis自动将其转化为Array，调用也简单。这种方式是在EJB基础上发展起来的，熟悉EJB的人应该很熟悉这种方式，所以stubs方式是这几种开发方式中最成熟的方法，下面是步骤：</span></p>
<p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">1</span><span style="line-height: 150%; font-family: 宋体">．在testaxis根目录下建立一个java2wsdl文件夹，在java2wsdl文件夹下新建一个名为build.xml的Ant构建，内容如下：</span></p>
<table style="margin-left: 5.4pt; width: 423pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="564" border="0">
    <tbody>
        <tr style="height: 7.3pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 423pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.3pt" valign="top" width="564">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;project name="Generate WSDL from JavaBeans as Web Services" default="j2w-all" basedir="."&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="build.dir" value="../../WebRoot/WEB-INF/classes"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="axis.dir" location="D:/Downloads/axis-src-1_4/axis-1_4"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;path id="classpath.id"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${axis.dir}/lib"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="*.jar"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; &lt;pathelement location="${build.dir}"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/path&gt;<br />
            &lt;taskdef name="axis-java2wsdl" classname="org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask"<br />
            &nbsp;&nbsp;&nbsp; loaderref="axis" &gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="classpath.id"/&gt;<br />
            &lt;/taskdef&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;target name="j2w-all"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antcall target="j2w-JavaBeanWS"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;target name="j2w-JavaBeanWS"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;axis-java2wsdl&nbsp;&nbsp;&nbsp; classname="com.service.MyServiceDP" classpath="${build.dir}"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; methods="getusername"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output="myService.wsdl"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; location="http://localhost:8089/testaxis/services/myServiceDP"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="http://localhost:8089/testaxis/services/myServiceDP"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespaceImpl="http://localhost:8089/testaxis/services/myServiceDP"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/axis-java2wsdl&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
            &lt;/project&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 27pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">关于Ant构建的语法请参考相关文章，简单说一下一个是axis.dir，就是你下载的Axis-1.4的目录，一个是&lt;target name="j2w-JavaBeanWS"&gt;，classname表示你的myService存放的路径，methods表示webservice中的方法，方法名称必须和myService中的方法一致，否则即使构建成功了也不能执行，output是输出的wsdl名称，locatlocation是myService的访问地址，用于客户调用，namespace是命名空间，有了命名空间你就可以通过namespace.webservice的方法来调用这个webservice，好了，关于Ant构建就介绍到这里。</span></p>
<p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">2</span><span style="line-height: 150%; font-family: 宋体">．运行Ant构建，在java2wsdl目录下会自动生成一个myService.wsdl的文件。</span></p>
<p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">3</span><span style="line-height: 150%; font-family: 宋体">．下面开始客户端的工作，客户端就是把服务端的wsdl文件转换为java文件以便于客户端的调用执行，理论上服务端和客户端是分离的，他们属于不同的系统和项目，两者毫无相干，唯一联系他们的是wsdl，但我们为了方便都放在AxisTest项目中，客户端的做法是将发布商发布的wsdl文件拷贝到自己的项目中，在这里我们已经有了这个wsdl就可以省去这一步，在testaxis新建一个源文件夹（Source Folder），注意是源文件夹不是文件夹，取名为wsdl2java，新建一个build.xml的Ant构建，内容如下：</span></p>
<table style="margin-left: 5.4pt; width: 423pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="564" border="0">
    <tbody>
        <tr style="height: 7.3pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 423pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.3pt" valign="top" width="564">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;project name="wsclient" default="all" basedir="."&gt;<br />
            &lt;property name="axis.home" location="D:/Downloads/axis-src-1_4/axis-1_4"/&gt;<br />
            &lt;property name="options.output" location="../wsdl2java"/&gt;<br />
            &lt;path id="axis.classpath"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;fileset dir="${axis.home}/lib"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="**/*.jar"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<br />
            &lt;/path&gt;<br />
            &lt;taskdef resource="axis-tasks.properties" classpathref="axis.classpath" /&gt;<br />
            &lt;target name="-WSDL2Axis" depends="init"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;mkdir dir="${options.output}"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;axis-wsdl2java output="${options.output}" url="${options.WSDL-URI}" verbose="true"/&gt;<br />
            &lt;/target&gt;<br />
            &lt;target name="init"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;echo&gt;Warning: please update the associated WSDL file(s) in the folder wsdl before running the target!&lt;/echo&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;echo&gt;Warning: Just run the target(s) related with your developing work!&lt;/echo&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;echo&gt;&lt;/echo&gt;<br />
            &lt;/target&gt;<br />
            &lt;target name="all"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antcall target="myService"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &lt;/target&gt;<br />
            &lt;target name="myService"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;antcall target="-WSDL2Axis"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="options.WSDL-URI" location="../src/java2wsdl/myService.wsdl"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/antcall&gt;<br />
            &lt;/target&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &lt;/project&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">4</span><span style="line-height: 150%; font-family: 宋体">．运行Ant构建，运行结果如下：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">这是在wsdl2java文件夹会自动生成几各类，别看Axis自动生成这么多类，其实都很简单，我们真正实际用到的就*ServiceLocator.java和*.java类，ServiceLocator是获得webservice的定位，*.java是具体实现类。</span></p>
<p style="margin-left: 38.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">5</span><span style="line-height: 150%; font-family: 宋体">． 编写客户端测试代码，在com.axistest新建一个myServiceTestorByStubs.java，内容如下：</span></p>
<table style="margin-left: 44.05pt; width: 423pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="564" border="0">
    <tbody>
        <tr style="height: 7.3pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 423pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.3pt" valign="top" width="564">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">package com.axistest;<br />
            import localhost.testaxis.services.myServiceDP.MyServiceDPServiceLocator;<br />
            import localhost.testaxis.services.myServiceDP.MyServiceDP;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">public class myServiceTestorByStubs {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp; MyServiceDPServiceLocator Service= new MyServiceDPServiceLocator();<br />
            &nbsp;&nbsp;&nbsp; MyServiceDP port= Service.getmyServiceDP();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response=port.getusername("</span><span style="font-size: 12pt; color: red; font-family: 宋体">毛毛");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(response);<br />
            &nbsp;&nbsp;&nbsp; }</span><span style="font-size: 12pt; font-family: 宋体"> <br />
            }</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-left: 38.65pt; text-indent: -18pt; line-height: 150%; text-align: left" align="left"><span style="line-height: 150%; font-family: 宋体">运行结果：Hello 毛毛,this is an Axis Dynamic Proxy Web Service(当然这里的&#8220;Dynamic Proxy &#8221;就不准确了。)</span></p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/241979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-11-22 16:57 <a href="http://www.blogjava.net/CrazyJava/articles/241979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Service开发的层次</title><link>http://www.blogjava.net/CrazyJava/articles/241939.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Sat, 22 Nov 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/241939.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/241939.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/241939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/241939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/241939.html</trackback:ping><description><![CDATA[Web Service是最近几年比较火的一个东西，它带来了一大堆的新名词，所以显得比较炫。看透其华而不实的表面，它也就不再神奇。下面的讨论均以Java为参考。 <br />
<br />
1 访问一个Web Service实际上可以看作调用一个函数，唯一不同的就是这个函数是远程的，这么一说，它和RMI就没有什么本质的区别了。 <br />
既然是一个函数，当然要有函数的声明了，完成这个工作的就是WSDL，它详细的定义函数的原型，包括函数名、入口参数、出口参数，这就是WSDL中opertion完成的工作。 <br />
既然是一个远程的函数，还要涉及与远程地址的一个绑定，这是WSDL中service的任务。 <br />
Axis是一个可以通过WSDL生成相应访问代码的开发包，JBuilder中将它集成了进去，通过Wizard的方式简化了原本需要在命令行中手工完成的操作。 <br />
<br />
2 既然是远程访问，就一定要有一个访问协议，Web Service的访问协议就是SOAP，SOAP建立在XML之上，不同的就是对XML原本没有限制的格式加上了一些限制，需要有envelope，在envelope中，还要分header和body。 <br />
如果利用SOAP开发Web Service的程序，那就需要根据WSDL的定义来自行组装SOAP包，这显然要比利用WSDL直接面向Web Service开发要复杂一些。 <br />
JAXM是一个利用SOAP进行通信的开发包，它简化了SOAP消息的打包过程。 <br />
<br />
3 SOAP是建立在XML之上的，那么显然XML的开发包同样适合于SOAP。 <br />
在这个层次上开发Web Service，除了要完成上一层的工作外，还要自行按照SOAP的格式组装SOAP消息，这显然又增加了工作量。 <br />
XML的开发工具就比较多了，从最简单的SAX和DOM到DOM4J、JDOM，还有不少XML到对象绑定的工具，如JAXB、Castor等等。 <br />
其实，不考虑Web Service，完全用XML做通信协议的情况也并不少见。知晓XML-RPC的存在，就不难理解了XML做通信的含义了。 <br />
<br />
截至到这里所讨论的内容，Sun提供了JWSDP（Java Web Service Developer Pack），其中包含从XML解析到WSDL生成的全套解决方案。 <br />
<br />
4 上面讨论的所有东西实际上都还停留在传递消息的内容上，并未涉及通信的过程。不要一看到Web Service的Web就想当然认为它只能通过HTTP来传输。前面的讨论可以看出，所有的消息内容与传输并无直接关系，所以，无论是以HTTP传输，还是SMTP或是自定义的协议都没有问题。 <br />
在这个层次上开发Web Service，前面的种种险阻之外，还要完成对XML的手工解析工作。 <br />
这里还是以最常见的HTTP方式来讨论。 <br />
HTTP的开发就将Server和Client区别对待，Server的实现通常的选择是Servlet，让Web Server替我们完成HTTP协议的解析可以省去我们很多的作。Client的实现可以选择JDK自带的Http Client，Apache的Jakarta项目下的Commons子项目也提供了一个HttpClient。 <br />
<br />
5 无论是HTTP还是SMTP，抑或是自定义协议，归根结底都是应用级的协议，底层的实现都是由Socket完成。到了这个层次基本就是原始时代了，什么都没有，一切都要手工完成。 <br />
在这个层次上开发Web Service，所有前面的困难都要一一经历，此外，还有协议的开发等待着不幸至此的人们。 <br />
到了这里，也不需要其它的工具了，JDK自带的Socket可以保打天下。 <br />
<br />
6 还想往下吗？再往下就是操作系统的实现了，Java的平台无关就失去了意义，也超出了我目前所了解的范围，到此打住吧！ <br />
<br />
前面所提及应该算是Web Service的一个基本知识结构，这里并没有讨论UDDI等等的内容，一来我对它并不了解，二来那应该属于应用，不应该算Web Service实现中。 <br />
<br />
虽然我们可能不会从最下层开发Web Service，但遇到底层的问题的情况却在所难免。 <br />
我就曾经在开发一个Web Service应用的时候，被人抓住HTTP头中的SOAPAction大小写与某个所谓的规范不同，我查了半天HTTP规范和SOAP规范，知道了HTTP是区分大小，而SOAPAction就是应该这么写，据理力争，指出所谓规范的错误。 <br />
<br />
经过前面的讨论，我们可以看出，Web Service并没有什么神秘可言，所有的东西都是建立在已有东西的基础之上。技术的发展不会是无中生有，只会是一个更好的解决方案而已，在追新求变之前，一个比较牢固的基础才是最重要
<img src ="http://www.blogjava.net/CrazyJava/aggbug/241939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-11-22 10:42 <a href="http://www.blogjava.net/CrazyJava/articles/241939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webservice之axis介绍1</title><link>http://www.blogjava.net/CrazyJava/articles/241883.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 21 Nov 2008 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/241883.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/241883.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/241883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/241883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/241883.html</trackback:ping><description><![CDATA[<p>Axis全称Apache eXtensible Interaction System，是apache组织下的一个开源项目，用来做webservice开发的，有java版的实现，也有c++版的实现，其前身最早是IBM的SOAP4J，后来捐给Apache后改名Apache SOAP，也就是支持SOAP1.1的那个版本，到现在的AXIS已经是第三代了，AXIS对Apache SOAP的改进有很多，比如用SAX代替以前的DOM，增加对WSDL的支持，支持SOAP1.2等等</p>
<p>使用axis很easy，在apache网站上把axis下载了后（最新版本1.2.1)，把%AXIS_HOME%\webapps\axis整个目录copy到tomcat的webapps目录下面，启动tomcat，浏览器中输入http://localhost:8080/axis就可以了</p>
<p>上面说的只是axis运行起来了，要想布置自己的webservice，axis支持两种方法：一种是用JWS（Java Web Service)，好处是只要有源码比如说Hello.java,把他改成Hello.jws后放到%TOMCAT_HOME%\webapps\axis目录下面就搞定，浏览器里面输入http://localhost:8080/axis/Hello.jws就可以了，不足的地方是能配置的地方有限（比如说Hello.java里面的所有public非static方法都会暴露），很多东西没办法弄；第二种方法就是使用wsdd(web service deploy description)，这个就是在TOMCAT_HOME%\webapps\axis\WEB-INF目录下写一个deploy.wsdd和undeploy.wsdd文件，然后通过java org.apache.axis.client.AdminClient deploy.wsdd就搞定了，卸载这个webservice就用org.apache.axis.client.AdminClient undeploy.wsdd，客户端输入http://localhost:8080/axis/services/Hello就可以了</p>
<p>介绍了部署webservice的两种方法后，下面说说客户端的访问方式，也有两种，一种是通过axis实现的java里面的JAX-RPC进行动态调用，另外一种就是通过服务器端产生的wsdl文件利用WSDL2Java工具生成Client Stub后访问。通过JAX-RPC的比较简单，需要提供的有SOAP router URL，service namespace，operation name，operation parameter types，operation return types，看看下面这个例子就明白了：</p>
<div class="HtmlCode" title="" style="cursor: pointer" onclick="preWin=window.open('','','');preWin.document.open();preWin.document.write(this.innerText);preWin.document.close();" pop="点击运行该代码！"  ;>&nbsp;&nbsp;&nbsp; public SOAPWrapper() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String location = "http://localhost:8080/axis/services/BookService";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service service = new Service();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call = (Call)service.createCall();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(new url(/location));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable t) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleError("SOAPWrapper (constructor) had an Exception.",t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</div>
<div class="HtmlCode" title="点击运行该代码！" style="cursor: pointer" onclick="preWin=window.open('','','');preWin.document.open();preWin.document.write(this.innerText);preWin.document.close();"  ;>
<p>&nbsp;&nbsp;&nbsp; public void create(Book book) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.removeAllParameters();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName("create");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("arg1",qn,ParameterMode.IN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setReturnType(XMLType.AXIS_VOID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.invoke(new Object[] {book});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable t) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleError("SOAPWrapper (create) had an Exception.",t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>程序中的Call和Service是对JAX-RPC中Call和Service的具体实现：org.apache.axis.client.Call implements javax.xml.rpc.Call，org.apache.axis.client.Service implements javax.xml.rpc.Service</p>
<p>第二种客户端的方法就是利用WSDL2Java产生Client stub后通过stub调用，WSDL2Java的操作对象是service所对应的wsdl文件，这个文件怎么产生呢？一种方法前面是由axis自动产生，如前面服务器端的配置所说，无论通过jws或是wsdd的方式，axis都会产生相应的wsdl；还有一种方式就是利用Java2WSDL对java源文件进行操作也可以产生相应的wsdl文件。</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/241883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-11-21 18:37 <a href="http://www.blogjava.net/CrazyJava/articles/241883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSDL(Web服务描述语言)详细解析</title><link>http://www.blogjava.net/CrazyJava/articles/223521.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 21 Aug 2008 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/223521.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/223521.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/223521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/223521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/223521.html</trackback:ping><description><![CDATA[WSDL (Web Services Description Language,Web服务描述语言)是一种XML
Application，他将Web服务描述定义为一组服务访问点，客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似
远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述，然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服
务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。&nbsp;本文将详细讲解WSDL文档的结构，并分析每个元素的作用。&nbsp;
<p>一：WSDL定义</p>
<p>&nbsp;&nbsp;&nbsp; WSDL是一个用于精确描述Web服务的文档，WSDL文档是一个遵循WSDL XML模式的XML文档。WSDL
文档将Web服务定义为服务访问点或端口的集合。在 WSDL
中，由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来，因此可以对抽象定义进行再次使用：消息，指对交换数据的抽象描述；而端
口类型，指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联，可以定义一
个端口，而端口的集合则定义为服务。</p>
<p>&nbsp;&nbsp;
一个WSDL文档通常包含7个重要的元素，即types、import、message、portType、operation、binding、
service元素。这些元素嵌套在definitions元素中，definitions是WSDL文档的根元素。文章的下一部分将会详细介绍WSDL
的基本结构。</p>
<p>二：WSDL的基本结构--概述</p>
<p>如第一部分最后描述的那样，一个基本的WSDL文档包含7个重要的元素。下面将分别介绍这几个元素以及他们的作用。</p>
<p>WSDL 文档在Web服务的定义中使用下列元素：</p>
<ul>
    <li><strong>Types</strong> - 数据类型定义的容器，它使用某种类型系统(一般地使用XML Schema中的类型系统)。 </li>
    <li><strong>Message</strong> - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。 </li>
    <li><strong>Operation</strong> - 对服务中所支持的操作的抽象描述，一般单个Operation描述了一个访问入口的请求/响应消息对。 </li>
    <li><strong>PortType</strong> - 对于某个访问入口点类型所支持的操作的抽象集合，这些操作可以由一个或多个服务访问点来支持。 </li>
    <li><strong>Binding</strong> - 特定端口类型的具体协议和数据格式规范的绑定。 </li>
    <li><strong>Port</strong> - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。 </li>
    <li><strong>Service</strong>- 相关服务访问点的集合。 </li>
</ul>
<p>&nbsp; 可以参考下图来理解一下WSDL的文档结构图：<img alt="WSDL文档元素的结构图" src="http://p.blog.csdn.net/images/p_blog_csdn_net/juxtapose/wsdl-01.gif" /></p>
<p>WSDL的xml schema可以参照如下网址：<a target="_blank" href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a></p>
<p>三：WSDL的基本结构--详述</p>
<p>本节将通过一个例子详细描述WSDL文档每个元素的作用。下面一个例子是一个简单的WSDL文档的内容，该文档的产生可以参见我的另外一篇文章：<a target="_blank" href="http://blog.csdn.net/juxtapose/archive/2007/09/10/1779849.aspx">xfire开发实例--HelloWorld篇</a>&nbsp;。</p>
<p>一个简单的Web Service的WSDL文档，该服务支持名为sayHello的唯一操作，该操作通过在http上运行<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>P协议来实现的。该请求接受一个字符串name，经过处理后返回一个简单的字符串。文档如下：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #0000ff;"><!--sp--><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:definitions<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">targetNamespace</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tns</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:wsdlsoap</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soap12</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsd</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soapenc11</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soapenc12</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2003/05/soap-encoding">http://www.w3.org/2003/05/soap-encoding"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soap11</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:wsdl</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/"</a></span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:schema&nbsp;</span><span style="color: #ff0000;">xmlns:xsd</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attributeFormDefault</span><span style="color: #0000ff;">="qualified"</span><span style="color: #ff0000;">&nbsp;elementFormDefault</span><span style="color: #0000ff;">="qualified"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetNamespace</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;nillable</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="xsd:string"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:element</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="out"</span><span style="color: #ff0000;">&nbsp;nillable</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="xsd:string"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:element</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:schema</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="parameters"</span><span style="color: #ff0000;">&nbsp;element</span><span style="color: #0000ff;">="tns:sayHelloResponse"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="parameters"</span><span style="color: #ff0000;">&nbsp;element</span><span style="color: #0000ff;">="tns:sayHello"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:portType&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServicePortType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message</span><span style="color: #0000ff;">="tns:sayHelloRequest"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message</span><span style="color: #0000ff;">="tns:sayHelloResponse"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:portType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:binding&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServiceHttpBinding"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff;">="tns:HelloServicePortType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:binding&nbsp;</span><span style="color: #ff0000;">style</span><span style="color: #0000ff;">="document"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/http">http://schemas.xmlsoap.org/soap/http"</a></span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:operation&nbsp;</span><span style="color: #ff0000;">soapAction</span><span style="color: #0000ff;">=""</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:body&nbsp;</span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:input</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:body&nbsp;</span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:output</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:binding</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:service&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:port&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServiceHttpPort"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binding</span><span style="color: #0000ff;">="tns:HelloServiceHttpBinding"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:address<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="<a target="_blank" href="http://localhost:8080/xfire/services/HelloService">http://localhost:8080/xfire/services/HelloService"</a></span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:port</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:service</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:definitions</span><span style="color: #0000ff;">&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
</div>
<p>&#9830; types元素使用XML模式语言声明在WSDL文档中的其他位置使用的复杂数据类型与元素；</p>
<p>&#9830; import元素类似于XML模式文档中的import元素，用于从其他WSDL文档中导入WSDL定义；</p>
<p>&#9830; message元素使用在WSDL文档的type元素中定义或在import元素引用的外部WSDL文档中定义的XML模式的内置类型、复杂类型或元素描述了消息的有效负载；</p>
<p>&#9830;&nbsp;portType元素和operation元素描述了Web服务的接口并定义了他的方法。portType元素和operation元素类似于
java接口和接口中定义的方法声明。operation元素使用一个或者多个message类型来定义他的输入和输出的有效负载；</p>
<p>&#9830; Binding元素将portType元素和operation元素赋给一个特殊的协议和编码样式；</p>
<p>&#9830; service元素负责将Internet地址赋给一个具体的绑定；</p>
<p>1、definitions元素</p>
<p>所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档，同时通过其name提供了一个WSDL文档。除了提供一个命名空间外，该元素没有其他作用，故不作详细描述。</p>
<p>下面的代码是一个definitions元素的结构：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:definitions<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">targetNamespace</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tns</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:wsdlsoap</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soap12</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsd</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soapenc11</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soapenc12</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2003/05/soap-encoding">http://www.w3.org/2003/05/soap-encoding"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:soap11</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:wsdl</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/"</a></span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:definitions</span><span style="color: #0000ff;">&gt;</span></span></div>
</div>
<p>2、types元素</p>
<p>&nbsp;WSDL采用了W3C
XML模式内置类型作为其基本类型系统。types元素用作一个容器，用于定义XML模式内置类型中没有描述的各种数据类型。当声明消息部分的有效负载
时，消息定义使用了在types元素中定义的数据类型和元素。在本文的WSDL文档中的types定义：</p>
<p>&nbsp;</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:schema&nbsp;</span><span style="color: #ff0000;">xmlns:xsd</span><span style="color: #0000ff;">="<a target="_blank" href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"</a></span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attributeFormDefault</span><span style="color: #0000ff;">="qualified"</span><span style="color: #ff0000;">&nbsp;elementFormDefault</span><span style="color: #0000ff;">="qualified"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetNamespace</span><span style="color: #0000ff;">="<a target="_blank" href="http://com.liuxiang.xfiredemo/HelloService">http://com.liuxiang.xfireDemo/HelloService"</a></span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;nillable</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="xsd:string"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:element</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xsd:element&nbsp;</span><span style="color: #ff0000;">maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="out"</span><span style="color: #ff0000;">&nbsp;nillable</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="xsd:string"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:sequence</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:complexType</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:element</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">xsd:schema</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span></span></span></span></span></span></span></span></span></div>
</div>
<p>上面是数据定义部分，该部分定义了两个元素，一个是sayHello，一个是sayHelloResponse：</p>
<p>sayHello：定义了一个复杂类型，仅仅包含一个简单的字符串，将来用来描述操作的参入传入部分；</p>
<p>sayHelloResponse：定义了一个复杂类型，仅仅包含一个简单的字符串，将来用来描述操作的返回值；</p>
<p>3、import元素</p>
<p>import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候，该功能是非常有效果的。</p>
<p>import的格式如下：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:import&nbsp;</span><span style="color: #ff0000;">namespace</span><span style="color: #0000ff;">="<a target="_blank" href="http://xxx.xxx.xxx/xxx/xxx">http://xxx.xxx.xxx/xxx/xxx"</a></span><span style="color: #ff0000;">&nbsp;location</span><span style="color: #0000ff;">="<a target="_blank" href="http://xxx.xxx.xxx/xxx/xxx.wsdl">http://xxx.xxx.xxx/xxx/xxx.wsdl"</a></span><span style="color: #0000ff;">/&gt;</span></div>
</div>
<p>必须有namespace属性和location属性：</p>
<p>namespace属性：值必须与正导入的WSDL文档中声明的targetNamespace相匹配；</p>
<p>location属性：必须指向一个实际的WSDL文档，并且该文档不能为空。</p>
<p>4、message元素</p>
<p>message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载；还可以描述<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>P文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。在本文中的message元素的定义，本文档使用了采用文档样式的消息传递：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="parameters"</span><span style="color: #ff0000;">&nbsp;element</span><span style="color: #0000ff;">="tns:sayHelloResponse"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="parameters"</span><span style="color: #ff0000;">&nbsp;element</span><span style="color: #0000ff;">="tns:sayHello"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span></span></span></div>
</div>
<p>该部分是消息格式的抽象定义：定义了两个消息sayHelloResponse和sayHelloRequest：</p>
<p>sayHelloRequest：sayHello操作的请求消息格式，由一个消息片断组成，名字为parameters,元素是我们前面定义的types中的元素；</p>
<p>sayHelloResponse：sayHello操作的响应消息格式，由一个消息片断组成，名字为parameters,元素是我们前面定义的types中的元素；</p>
<p>&nbsp;如果采用RPC样式的消息传递，只需要将文档中的element元素应以修改为type即可。</p>
<p>5、portType元素</p>
<p>portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口，都是定义了一个抽象类型和方法，没有定义实现。在WSDL
中，portType元素是由binding和service元素来实现的，这两个元素用来说明Web服务实现使用的Internet协议、编码方案以及
Internet地址。</p>
<p>一个portType中可以定义多个operation，一个operation可以看作是一个方法，本文中WSDL文档的定义：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:portType&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServicePortType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #ff0000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message</span><span style="color: #0000ff;">="tns:sayHelloRequest"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #ff0000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message</span><span style="color: #0000ff;">="tns:sayHelloResponse"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:portType</span><span style="color: #0000ff;">&gt;</span></span></span></div>
</div>
<p>portType定义了服务的调用模式的类型，这里包含一个操作sayHello方法，同时包含input和output表明该操作是一个请求／响
应模式，请求消息是前面定义的sayHelloRequest，响应消息是前面定义的sayHelloResponse。input表示传递到Web服务
的有效负载，output消息表示传递给客户的有效负载。</p>
<p>６、binding</p>
<p>binding元素将一个抽象portType映射到一组具体协议(<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>O和HTTP)、消息传递样式、编码样式。通常binding元素与协议专有的元素和在一起使用，本文中的例子：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:binding&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServiceHttpBinding"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff;">="tns:HelloServicePortType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:binding&nbsp;</span><span style="color: #ff0000;">style</span><span style="color: #0000ff;">="document"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport</span><span style="color: #0000ff;">="<a target="_blank" href="http://schemas.xmlsoap.org/soap/http">http://schemas.xmlsoap.org/soap/http"</a></span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHello"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:operation&nbsp;</span><span style="color: #ff0000;">soapAction</span><span style="color: #0000ff;">=""</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloRequest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:body&nbsp;</span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:input</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sayHelloResponse"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:body&nbsp;</span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:output</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:binding</span><span style="color: #0000ff;">&gt;</span></span></span></span></span></div>
</div>
<p>这部分将服务访问点的抽象定义与<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>P HTTP绑定，描述如何通过<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>P/HTTP来访问按照前面描述的访问入口点类型部署的访问入口。其中规定了在具体<a target="_blank" href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=102&amp;tagname=SOA">SOA</a>P调用时，应当使用的soapAction是""。</p>
<p>具体的使用需要参考特定协议定义的元素。</p>
<p>７、service元素和port元素</p>
<p>service元素包含一个或者多个port元素，其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding，甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。文档中的例子：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:service&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:port&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="HelloServiceHttpPort"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binding</span><span style="color: #0000ff;">="tns:HelloServiceHttpBinding"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdlsoap:address<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="<a target="_blank" href="http://localhost:8080/xfire/services/HelloService">http://localhost:8080/xfire/services/HelloService"</a></span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:port</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;"><span style="color: #800000;">wsdl:service</span><span style="color: #0000ff;">&gt;</span></span></span></div>
</div>
<p>这部分是具体的Web服务的定义，在这个名为HelloService的Web服务中，提供了一个服务访问入口，访问地址是<a target="_blank" href="http://localhost:8080/xfire/services/HelloService">http://localhost:8080/xfire/services/HelloService</a>，使用的消息模式是由前面的binding所定义的。</p>
<p>　　本文简单介绍了WSDL规范的用途，基本结构和使用方法，希望对大家学习WSDL有帮助。</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/223521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-08-21 15:32 <a href="http://www.blogjava.net/CrazyJava/articles/223521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.reflect.InvocationTargetException axis2 code generator error resolved</title><link>http://www.blogjava.net/CrazyJava/articles/223263.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Wed, 20 Aug 2008 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/223263.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/223263.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/223263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/223263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/223263.html</trackback:ping><description><![CDATA[&nbsp;Axis2 Eclipse plugin: Code Generator 在Finish 时产生Exception: java.lang.reflect.InvocationTargetException<br />
[版本]<br />
Eclipse 3.2<br />
Axis2 1.4<br />
<br />
[问题原因]<br />
主要的问题在于 Code Generator plugin 内缺少了 backport-util-concurrent-3.1.jar 包<br />
<br />
[解决方案]<br />
- 关闭 Eclipse<br />
- copy %AXIS2_HOME%\lib\backport-util-concurrent-3.1.jar 到下列 folder<br />
%ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\lib<br />
<br />
- 注册此 jar 包: 編輯 %ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\plugin.xml , 在 &lt;runtime&gt; 內加入下面的字串<br />
&lt;library name="lib/backport-util-concurrent-3.1.jar"&gt;<br />
&lt;export name="*"/&gt;<br />
&lt;/library&gt;<br />
<br />
- 执行 Eclipse 即可<br />
<br />
- 若问题仍存在, 尝试改变Eclipse 使用的 JRE, 换成 JAVA 6<br />
- 使用 JRE 1.6 启动 Eclipse 后, 若仍有问题, 试着加入 -clean 参数启动 Eclipse, 清除 osig cache:<br />
eclipse.exe -vm "c:\java\jre1.6.0_05\bin\java.exe" <strong>-clean</strong> -console -consoleLog -debug -vmargs -Xmx384M<br />
<br />
- 关闭 Eclipse 后, 再以一般方式启动 Eclipse, 应可解决问题<br />
<br />
[參考]<br />
Error while using Axis2 Code Generator Plugin for Eclipse<br />
http://www.nabble.com/Error-while-using-Axis2-Code-Generator-Plugin-for-Eclipse-td17147595.html<br />
http://web-latte.blogspot.com/2008/05/axis2-eclipse-plugin-code-generator.html
<img src ="http://www.blogjava.net/CrazyJava/aggbug/223263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-08-20 14:40 <a href="http://www.blogjava.net/CrazyJava/articles/223263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Service实践之——开始XFire</title><link>http://www.blogjava.net/CrazyJava/articles/223055.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 19 Aug 2008 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/223055.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/223055.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/223055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/223055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/223055.html</trackback:ping><description><![CDATA[<p>一、Axis与XFire的比较<br />
XFire是与Axis2 并列的新一代WebService平台。之所以并称为新一代，因为它：<br />
1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等；<br />
2、使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现；<br />
3、容易上手，可以方便快速地从pojo发布服务； <br />
4、Spring的结合；<br />
5、灵活的Binding机制，包括默认的Acegis,xmlbeans,jaxb2,castor。<br />
&nbsp;<br />
XFire与Axis1性能的比较<br />
1、XFire比Axis1.3快2-6倍<br />
2、XFire的响应时间是Axis1.3的1/2到1/5<br />
&nbsp;<br />
XFire与Axis2的比较<br />
虽
然XFire与Axis2都是新一代的WebService平台，但是Axis2的开发者太急于推出1.0版本，所以1.0还不是一个稳定的版本，它的开
发者宣称1.1版本即将推出，希望1.1版本会是个稳定的版本。在XFire捐献给apache后有人认为Axis2将会灭亡。其实在很多人眼
里，Axis2并不是pojo形式，现在也好象XFire比Axis更有市场，也有很多人开始从Axis转向XFire。<br />
据说，XFire确实比Axis2简单很多 </p>
<p>AXIS VS CXF<br />
在SOA领域，我们认为Web Service是SOA体系的构建单元（building
block）。对于作过WebService的开发人员来说，AXIS和CXF一定都不会陌生。这两个产品都是Apache孵化器下面的Web
Service开源开发工具。 Axis2的最新版本是1.3，CXF现在已经到了2.0版本。</p>
<p>这两个框架
都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和Celtix项目的结合产品。Axis2是从底层全
部重新实现，使用了新的扩展性更好模块架构。 CXF也重新的深化了XFire和Celtix这两个开发工具。</p>
<p>新产品的退出导致了几个问题。是不是现有的使用Axis
1.x，XFire和Celix的应用需要迁移的新的版本上。如果一个开发人员确定要迁移它的应用到新的框架上，那么他应该选择哪一个呢？相反的，如果一
个开发者决定从头开发一个新的Web Service，他应该使用哪个呢？ 这两个框架哪一个更好一些呢？</p>
<p>对于系统迁移来说，也许迁移到新的框架并不难。Axis和CXF都提供了迁移的指导。能够给开发者一些迁移的技巧和经验。但是对于这样迁移，这两个
开源项目都没有提供迁移的工具。对于这样的迁移工作，尽管很值得去寻找所有的可行方案。Axis2和CXF都有各自不同的WebService开发方法，
每个方法都有相当数量拥护者。</p>
<p>通过一个比较矩阵来比较Axis2和CXF变得有现实的意义。这两个项目都开发不够成熟，但是最主要的区别在以下几个方面：<br />
1. CXF支持 WS-Addressing，WS-Policy， WS-RM， WS-Security和WS-I Basic Profile。Axis2不支持WS-Policy，但是承诺在下面的版本支持。<br />
2. CXF可以很好支持Spring。Axis2不能<br />
3. AXIS2支持更广泛的数据并对，如XMLBeans，JiBX，JaxMe和JaxBRI和它自定义的数据绑定ADB。注意JaxME和JaxBRI都还是试验性的。CXF只支持JAXB和Aegis。在CXF2.1<br />
4. Axis2支持多语言-除了Java,他还支持C/C++版本。</p>
<p>比较这两个框架的Web Service开发方法与比较它们的特性同样重要。 从开发者的角度，两个框架的特性相当的不同。
Axis2的开发方式类似一个小型的应用服务器，Axis2的开发包要以WAR的形式部署到Servlet容器中，比如Tomcat，通过这些容器可以对
工作中的Web Service进行很好的监控和管理。Axis2 的Web
administrion模块可以让我们动态的配置Axis2.一个新的服务可以上载，激活，使之失效，修改web服务的参数。管理UI也可以管理一个或
者多个处于运行状态的服务。这种界面化管理方式的一个弊端是所有在运行时修改的参数没有办法保存，因为在重启动之后，你所做的修改就会全部失效。</p>
<p>Axis2允许自己作为独立的应用来发布Web
Service，并提供了大量的功能和一个很好的模型，这个模型可以通过它本身的架构（modular
architecture）不断添加新的功能。有些开发人员认为这种方式对于他们的需求太过于繁琐。这些开发人员会更喜欢CXF。</p>
<p>CXF更注重开发人员的工效（ergonomics）和嵌入能力（embeddability）。大多数配置都可以API来完成，替代了比较繁琐的
XML配置文件， Spring的集成性经常的被提及，CXF支持Spring2.0和CXF's
API和Spring的配置文件可以非常好的对应。CXF强调代码优先的设计方式（code-first
design)，使用了简单的API使得从现有的应用开发服务变得方便。</p>
<p>不过你选择Axis2还是CXF，你都可以从开源社区得到大量的帮助。这两个框架都有商业公司提供服务，WSO2提供AXIS2的支持，Iona提
供CXF的支持。这两公司都有很活跃的开发者社区。
Axis2出现的时间较早，CXF的追赶速度快。我的建议是：如果你需要多语言的支持，你应该选择AXIS2。如果你需要把你的实现侧重JAVA并希望和
Spring集成，CXF就是更好的选择，特别是把你的Web
Service嵌入其他的程序中。如果你觉得这两个框架的新特性对于你并没有太大的用处，你会觉得Axis1也是不错的选择，你应该继续使用它知道你有充
分的理由去更换它。</p>
<p><br />
二、开始XFire的生火之旅：<br />
1、配置XFire运行环境：<br />
在Tomcat下新建一个Web Applications，命名为stove，然后在其WEB-INF目录下新建一个web.xml文件，文件中输入：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-xml" start="1">
    <li><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"GB2312"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;!DOCTYPE&nbsp;web-app&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN"&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;"http://java.sun.com/dtd/web-app_2_3.dtd"<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">web-app</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>XFireServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>XFire&nbsp;Servlet</span><span class="tag">&lt;/</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>org.codehaus.xfire.transport.http.XFireConfigurableServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>XFireServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/servlet/XFireServlet/*</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>XFireServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/services/*</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">web-app</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="xml">&lt;?xml version="1.0" encoding="GB2312"&gt;
&lt;!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;
&lt;web-app&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;display-name&gt;XFire Servlet&lt;/display-name&gt;
&lt;servlet-class&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p>其中主要就是引入了XFireServlet，用以处理Web Service请求，并且负责提供Web Service的WSDL，如果你发布了一个名为BookService的WebService，则可以通过网址：<br />
http://&lt;服务器&gt;[:端口]/&lt;webapp名&gt;/services/BookService<br />
来访问这个WebService，并且通过地址：<br />
http://&lt;服务器&gt;[:端口]/&lt;webapp名&gt;/services/BookService?WSDL&nbsp; 来得到这个WebService的WSDL信息。</p>
<p>2、开发最简单的WebService<br />
在WEB-INF目录下新建src文件夹，然后再建一个package:<br />
cn.com.pansky.webservice.xfire.study<br />
，在这个包下面新建一个接口：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j" start="1">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.com.pansky.webservice.xfire.study;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;SayHiService{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;sayHi(String&nbsp;name);&nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">package cn.com.pansky.webservice.xfire.study;
public interface SayHiService{
public String sayHi(String name);
}
</pre>
<p>这个接口是告诉服务器你的WebService哪些方法可以被用户调用的。下面我们再来写一个SayHiService的实现类，以完成业务逻辑：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j" start="1">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.com.pansky.webservice.xfire.study;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SayHiServiceImpl&nbsp;</span><span class="keyword">implements</span><span>&nbsp;SayHiService{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;sayHi(String&nbsp;name){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(name==</span><span class="keyword">null</span><span>){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"连名字也不肯告诉我吗？"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;name+</span><span class="string">",&nbsp;你吃了吗？没吃回家吃去吧。"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;不告诉你(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"我的名字不告诉你！"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">package cn.com.pansky.webservice.xfire.study;
public class SayHiServiceImpl implements SayHiService{
public String sayHi(String name){
if(name==null){
return "连名字也不肯告诉我吗？";
}
return name+", 你吃了吗？没吃回家吃去吧。";
}
public String 不告诉你(){
return "我的名字不告诉你！";
}
}
</pre>
<p>&nbsp;这个类实现了sayHi方法，该方法是可以通过WebService调用访问到的。另外还实现了一个方法&#8220;不告诉你&#8221;，该方法因为没有在接口SayHiService中定义，所以不能被WebService调用到。<br />
&nbsp;&nbsp; 这个例子足够简单吧，就跟我们刚学Java时写的"Hello world"没什么两样。<br />
到这里为止，我们做的跟平时的Java开发没啥区别，该如何来发布WebService呢？</p>
<p>3、把JAVA类发布为WebService：<br />
在WEB-INF/classes目录下新建文件夹：META-INF/xfire，然后在该文件夹下新建一个XML文件：services.xml，文件内容如下：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-xml" start="1">
    <li><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://xfire.codehaus.org/config/1.0"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>SayHiService</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">namespace</span><span class="tag">&gt;</span><span>http://cn.com.pansky/SayHiService</span><span class="tag">&lt;/</span><span class="tag-name">namespace</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">serviceClass</span><span class="tag">&gt;</span><span>cn.com.pansky.webservice.xfire.study.SayHiService</span><span class="tag">&lt;/</span><span class="tag-name">serviceClass</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">implementationClass</span><span class="tag">&gt;</span><span>cn.com.pansky.webservice.xfire.study.SayHiServiceImpl</span><span class="tag">&lt;/</span><span class="tag-name">implementationClass</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="xml">&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;
&lt;service&gt;
&lt;name&gt;SayHiService&lt;/name&gt;
&lt;namespace&gt;http://cn.com.pansky/SayHiService&lt;/namespace&gt;
&lt;serviceClass&gt;cn.com.pansky.webservice.xfire.study.SayHiService&lt;/serviceClass&gt;
&lt;implementationClass&gt;cn.com.pansky.webservice.xfire.study.SayHiServiceImpl&lt;/implementationClass&gt;
&lt;/service&gt;
&lt;/beans&gt;
</pre>
<p>&nbsp;这个文件定义一个WebService: SayHiService，并同时定义了接口和实现类。<br />
好了，该建的文件基本建完了，现在想办法把src下的java文件编译成class，并复制到WEB-INF/classes目录下</p>
<p>4、启动Tomcat，测试WebService<br />
如果Tomcat还没配置好，抽两分钟再配一下。再把Tomcat启动起来。<br />
再打开浏览器，输入：<br />
<a href="http://localhost/stove/services">http://localhost/stove/services</a><br />
，服务器返回的结果如下：<br />
Available Services:<br />
&nbsp;&nbsp;&nbsp; * SayHiService [wsdl]<br />
&nbsp;&nbsp;&nbsp;&nbsp; Generated by XFire ( <a href="http://xfire.codehaus.org/">http://xfire.codehaus.org</a> ) <br />
我们看到我们的WebService已经布署成功了，我们再看看它的WSDL信息：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-xml" start="1">
    <li><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">wsdl:definitions</span><span>&nbsp;</span><span class="attribute">targetNamespace</span><span>=</span><span class="attribute-value">"http://cn.com.pansky/SayHiService"</span><span>&nbsp;</span><span class="attribute">xmlns:tns</span><span>=</span><span class="attribute-value">"http://cn.com.pansky/SayHiService"</span><span>&nbsp;</span><span class="attribute">xmlns:wsdlsoap</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/wsdl/soap/"</span><span>&nbsp;</span><span class="attribute">xmlns:soap12</span><span>=</span><span class="attribute-value">"http://www.w3.org/2003/05/soap-envelope"</span><span>&nbsp;</span><span class="attribute">xmlns:xsd</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema"</span><span>&nbsp;</span><span class="attribute">xmlns:soapenc11</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/soap/encoding/"</span><span>&nbsp;</span><span class="attribute">xmlns:soapenc12</span><span>=</span><span class="attribute-value">"http://www.w3.org/2003/05/soap-encoding"</span><span>&nbsp;</span><span class="attribute">xmlns:soap11</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/soap/envelope/"</span><span>&nbsp;</span><span class="attribute">xmlns:wsdl</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/wsdl/"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:schema</span><span>&nbsp;</span><span class="attribute">xmlns:xsd</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema"</span><span>&nbsp;</span><span class="attribute">attributeFormDefault</span><span>=</span><span class="attribute-value">"qualified"</span><span>&nbsp;</span><span class="attribute">elementFormDefault</span><span>=</span><span class="attribute-value">"qualified"</span><span>&nbsp;</span><span class="attribute">targetNamespace</span><span>=</span><span class="attribute-value">"http://cn.com.pansky/SayHiService"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHi"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span>&nbsp;</span><span class="attribute">maxOccurs</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;</span><span class="attribute">minOccurs</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"in0"</span><span>&nbsp;</span><span class="attribute">nillable</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"xsd:string"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiResponse"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span>&nbsp;</span><span class="attribute">maxOccurs</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;</span><span class="attribute">minOccurs</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"out"</span><span>&nbsp;</span><span class="attribute">nillable</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"xsd:string"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">xsd:schema</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiRequest"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"parameters"</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">"tns:sayHi"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:part</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:message</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiResponse"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"parameters"</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">"tns:sayHiResponse"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:part</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:message</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:portType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"SayHiServicePortType"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHi"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiRequest"</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">"tns:sayHiRequest"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:input</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:output</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiResponse"</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">"tns:sayHiResponse"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:output</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:portType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:binding</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"SayHiServiceHttpBinding"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"tns:SayHiServicePortType"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdlsoap:binding</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">"document"</span><span>&nbsp;</span><span class="attribute">transport</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/soap/http"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHi"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdlsoap:operation</span><span>&nbsp;</span><span class="attribute">soapAction</span><span>=</span><span class="attribute-value">""</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiRequest"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdlsoap:body</span><span>&nbsp;</span><span class="attribute">use</span><span>=</span><span class="attribute-value">"literal"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:input</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:output</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"sayHiResponse"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdlsoap:body</span><span>&nbsp;</span><span class="attribute">use</span><span>=</span><span class="attribute-value">"literal"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:output</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:binding</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:service</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"SayHiService"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdl:port</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"SayHiServiceHttpPort"</span><span>&nbsp;</span><span class="attribute">binding</span><span>=</span><span class="attribute-value">"tns:SayHiServiceHttpBinding"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">wsdlsoap:address</span><span>&nbsp;</span><span class="attribute">location</span><span>=</span><span class="attribute-value">"http://localhost/stove/services/SayHiService"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:port</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">wsdl:service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">wsdl:definitions</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;wsdl:definitions targetNamespace="http://cn.com.pansky/SayHiService" xmlns:tns="http://cn.com.pansky/SayHiService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"&gt;
&lt;wsdl:types&gt;
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://cn.com.pansky/SayHiService"&gt;
&lt;xsd:element name="sayHi"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="sayHiResponse"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;/xsd:schema&gt;
&lt;/wsdl:types&gt;
&lt;wsdl:message name="sayHiRequest"&gt;
&lt;wsdl:part name="parameters" element="tns:sayHi"&gt;
&lt;/wsdl:part&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="sayHiResponse"&gt;
&lt;wsdl:part name="parameters" element="tns:sayHiResponse"&gt;
&lt;/wsdl:part&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:portType name="SayHiServicePortType"&gt;
&lt;wsdl:operation name="sayHi"&gt;
&lt;wsdl:input name="sayHiRequest" message="tns:sayHiRequest"&gt;
&lt;/wsdl:input&gt;
&lt;wsdl:output name="sayHiResponse" message="tns:sayHiResponse"&gt;
&lt;/wsdl:output&gt;
&lt;/wsdl:operation&gt;
&lt;/wsdl:portType&gt;
&lt;wsdl:binding name="SayHiServiceHttpBinding" type="tns:SayHiServicePortType"&gt;
&lt;wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/&gt;
&lt;wsdl:operation name="sayHi"&gt;
&lt;wsdlsoap:operation soapAction=""/&gt;
&lt;wsdl:input name="sayHiRequest"&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:input&gt;
&lt;wsdl:output name="sayHiResponse"&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:output&gt;
&lt;/wsdl:operation&gt;
&lt;/wsdl:binding&gt;
&lt;wsdl:service name="SayHiService"&gt;
&lt;wsdl:port name="SayHiServiceHttpPort" binding="tns:SayHiServiceHttpBinding"&gt;
&lt;wsdlsoap:address location="http://localhost/stove/services/SayHiService"/&gt;
&lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;
&lt;/wsdl:definitions&gt;
</pre>
<p>&nbsp;这个文件跟我们用Axis生成的基本是一样的。</p>
<p>5、享受美味的时刻<br />
WebService这道大餐算是烹制好了，现在是享用美餐的时候了。<br />
我们写一个客户端吃掉这道大餐：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://www.javaeye.com/topic/195927#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j" start="1">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.com.pansky.webservice.xfire.study;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;java.net.MalformedURLException;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;java.util.Map;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.client.Client;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.client.XFireProxyFactory;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.Service;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.binding.ObjectServiceFactory;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.transport.http.CommonsHttpMessageSender;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SayHiClient{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serviceURL&nbsp;=&nbsp;<span class="string">"http://localhost/stove/services/SayHiService"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;serviceModel&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ObjectServiceFactory().create(SayHiService.</span><span class="keyword">class</span><span>,</span><span class="keyword">null</span><span>,</span><span class="string">"http://cn.com.pansky/SayHiService"</span><span>,</span><span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;XFireProxyFactory&nbsp;serviceFactory&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;XFireProxyFactory();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHiService&nbsp;service&nbsp;=&nbsp;(SayHiService)&nbsp;serviceFactory.create(serviceModel,&nbsp;serviceURL);&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;client&nbsp;=&nbsp;Client.getInstance(service);&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//client.addOutHandler(new&nbsp;OutHeaderHandler());</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;disable&nbsp;timeout</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT,&nbsp;<span class="string">"1"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hello&nbsp;=&nbsp;service.sayHi(<span class="string">"张山疯"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"服务器对[张山疯]&nbsp;的回答是："</span><span>&nbsp;+&nbsp;hello&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hello&nbsp;=&nbsp;service.sayHi(<span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"服务器胡言乱语说："</span><span>&nbsp;+&nbsp;hello&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(MalformedURLException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">package cn.com.pansky.webservice.xfire.study;
import java.net.MalformedURLException;
import java.util.Map;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;
public class SayHiClient{
public static void main(String args[]) {
String serviceURL = "http://localhost/stove/services/SayHiService";
Service serviceModel = new ObjectServiceFactory().create(SayHiService.class,null,"http://cn.com.pansky/SayHiService",null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
try{
SayHiService service = (SayHiService) serviceFactory.create(serviceModel, serviceURL);
Client client = Client.getInstance(service);
//client.addOutHandler(new OutHeaderHandler());
// disable timeout
client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "1");
String hello = service.sayHi("张山疯");
System.out.println("服务器对[张山疯] 的回答是：" + hello );
hello = service.sayHi(null);
System.out.println("服务器胡言乱语说：" + hello );
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
</pre>
<p>&nbsp;编译这个类，再执行一下，服务器服务的结果是：</p>
<p>2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase writeRequest<br />
信息: 100 (continue) read timeout. Resume sending the request<br />
2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase readResponse<br />
信息: Discarding unexpected response: HTTP/1.1 100 Continue<br />
服务器对[张山疯] 的回答是：张山疯, 你吃了吗？没吃回家吃去吧。<br />
2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase writeRequest<br />
信息: 100 (continue) read timeout. Resume sending the request<br />
2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase readResponse<br />
信息: Discarding unexpected response: HTTP/1.1 100 Continue<br />
服务器胡言乱语说：连名字也不肯告诉我吗？</p>
<p>好了，WebService布署成功。</p>
<p>下课！ </p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/223055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-08-19 16:49 <a href="http://www.blogjava.net/CrazyJava/articles/223055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2快速上手指南</title><link>http://www.blogjava.net/CrazyJava/articles/223049.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 19 Aug 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/223049.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/223049.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/223049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/223049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/223049.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文链接:http://ws.apache.org/axis2/1_1_1/quickstartguide.html本指南的目的是让你尽可能快的创建使用Axis2的服务和客户端，我们将使用一个简单的StockQuote服务并显示给你一些创建和部署它的不同的方式，以及快速的看看Axis2自带的一些工具，然后我们将看看创建访问这些服务的客户端。内容Java代...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/223049.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/223049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-08-19 16:38 <a href="http://www.blogjava.net/CrazyJava/articles/223049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML WebService完全实例详细解析</title><link>http://www.blogjava.net/CrazyJava/articles/222191.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 15 Aug 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/222191.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/222191.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/222191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/222191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/222191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接
口,里面有
函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他
们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.
<p>　　webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.</p>
<p>　　有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.</p>
<p>　　这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来 源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)</p>
<p>　　首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓,
甚至它本身
并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源
站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们
最需要关注的东西---资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和
SiteBService.两个服务间没有任何关系,内部提供的方法也完全没关联,只是需要把方法如何使用告诉ServiceGatherSite,意思
是,服务只提供查询接口,返回的数据如何处理,服务本身并不管,全由使用服务的站点分配.</p>
<p>　　写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构,下篇文章,我们将开始真正进入代码的设计阶段.</p>
<p>　　上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.</p>
<p>　　这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.</p>
<p>　　在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件-&gt;新建-&gt;项目-&gt;C#-&gt;Web服务应用程序)</p>
<p>　　建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不
关注,因
此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得
到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写
法.</p>
<p>　　下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须
在函数上面 添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:</p>
<p>　　以下是引用片段：</p>
<p>
</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td bgcolor="#f3f3f3">[WebMethod(Description="最简单的方法")]
            <p>　　public string HelloWorld()</p>
            <p>　　{</p>
            <p>　　return "Hello World";</p>
            <p>　　}</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.
<p>
</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td bgcolor="#f3f3f3">[WebMethod(Description="查询以获取需要的课件信息")]
            <p>　　public XmlDataDocument GetSiteAData(string AssignName)</p>
            <p>　　{</p>
            <p>　　XmlDataDocument xd=new XmlDataDocument(); //</p>
            <p>　　DataSet ds=new DataSet();</p>
            <p>　　CStoreProc cp=new CStoreProc("SearchAssign");</p>
            <p>　　cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);</p>
            <p>　　cp.AddParOut("@res",SqlDbType.Int);</p>
            <p>　　if(cp.SelectProc()) //如果执行成功,存储过程</p>
            <p>　　{</p>
            <p>　　cp.myData.EnforceConstraints=false; //不进行格式严格检查</p>
            <p>　　if((int)cp.GetReturnValue("@res")==-1)</p>
            <p>　　{</p>
            <p>　　string xml="";</p>
            <p>　　xd.LoadXml(xml);</p>
            <p>　　return xd;</p>
            <p>　　}</p>
            <p>　　xd=new XmlDataDocument(cp.myData);</p>
            <p>　　XmlNode root1=xd.DocumentElement;</p>
            <p>　　XmlNodeList roots=root1.SelectNodes("list");</p>
            <p>　　foreach(XmlNode roota in roots) //为所有元素加上站点名称标记</p>
            <p>　　{</p>
            <p>　　XmlElement Link=xd.CreateElement("SiteName");</p>
            <p>　　Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();</p>
            <p>　　roota.AppendChild(Link);</p>
            <p>　　}</p>
            <p>　　return xd;</p>
            <p>　　}</p>
            <p>　　else return null;</p>
            <p>　　}</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定asp.net基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.
<br />
<br />
细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显
然满足
条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml数据的传输来示例.
<p>　　接上篇文章,我们先简单解释下GetSiteAData(string AssignName)函数.</p>
<p>　　函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返
回一个空记
录.否则,我们把查询后的dataset生成一个XmlDataDocument,接下来,由于该项目的需要,我加入了一个循环,添加dataset里所
没有的节点,站点名称.在这之后,算是完成了一个符合我们期望格式的xml数据文档,我们把它返回.</p>
<p>　　好了,webservice的方法函数介绍完了(这里还有个web服务方法,稍后介绍),接下来我们的任务是怎么调用它了.首先把
webservice的
项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文件,执行GetSiteAData
(string
AssignName)方法,将提示你输入参数,你输入要搜索的内容,点确认,将返回给你一个xml数据,并在ie上显示出来,这就是你搜索到的内容拉.</p>
<p>　　这里对ServiceA的工作再做点介绍,在我们这个项目里,它是资源站点A提供的服务,意思是,它查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.</p>
<p>　　好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式
我强烈建议 调试时使用,非常方便.右击引用,点添加web引用,输入你的webservice地址,如:http:
//localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必
须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA,
那服务的实例化将是这样:SiteA.Service1 serviceA=new
SiteA.Service1();(Service1是服务的类名).</p>
<p>　　完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)</p>
<p>　　以下是引用片段：</p>
<p>　　</p>
<p>
</p>
//绑定数据
<p>　　public void BindData()</p>
<p>　　{</p>
<p>　　serviceA=new SiteA.Service1();</p>
<p>　　DataSet ds=new DataSet();</p>
<p>　　XmlNode xmlNode1;</p>
<p>　　XmlDataDocument xd=new XmlDataDocument();</p>
<p>　　StringBuilder xmlString1;</p>
<p>　　xmlNode1=serviceA.GetSiteAData(strSearch);</p>
<p>　　if(xmlNode1==null) //--存储过程执行失败</p>
<p>　　return;</p>
<p>　　xmlString1=new StringBuilder(xmlNode1.OuterXml);</p>
<p>　　if(xmlString1.ToString().Equals(""))</p>
<p>　　return ;</p>
<p>　　xd.LoadXml(xmlString1.ToString());</p>
<p>　　ds.ReadXml(new XmlNodeReader(xd));</p>
<p>　　DataGrid1.DataSource=ds.Tables["list"].DefaultView;</p>
<p>　　DataGrid1.DataBind();</p>
<p>　　}</p>
<p><br />
</p>
<p>此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在asp.net里,dataset占的作用之重,谁都知道的.其
他的请
朋友们先看(呵呵,个中高手就免了),在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案,写了三篇了,发现似乎还是有些朋友看的,那我就献
丑继续写下去好了,大家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)
</p>
<p>　　接上篇文章,我们先简单说明下绑定函数.首先实例化ServiceA,这个和一般类的实例化并没有不同..接下来用xmlNode1来接受函数的返回值,接下来是构造xml,并将其转化为dataset,这是通用的方法,如果是刚接触不久的朋友,最好能记下这种方法.</p>
<p>　　接下来给出异步调用两个服务的代码</p>
<p>　　以下是引用片段：</p>
<p>
</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td bgcolor="#f3f3f3">//绑定数据
            <p>　　public void BindData()</p>
            <p>　　{</p>
            <p>　　IAsyncResult ar1;</p>
            <p>　　IAsyncResult ar2;</p>
            <p>　　serviceA=new SiteA.Service1();</p>
            <p>　　serviceB=new SiteB.Service1();</p>
            <p>　　DataSet ds=new DataSet();</p>
            <p>　　XmlNode xmlNode1,xmlNode2;</p>
            <p>　　XmlDataDocument xd=new XmlDataDocument();</p>
            <p>　　StringBuilder xmlString1,xmlString2;</p>
            <p>　　//--简单的异步调用</p>
            <p>　　ar1=serviceA.BeginGetSiteAData(strSearch,null,null);</p>
            <p>　　ar2=serviceB.BeginGetSiteAData(strSearch,null,null);</p>
            <p>　　xmlNode1=serviceA.EndGetSiteAData(ar1);</p>
            <p>　　xmlNode2=serviceB.EndGetSiteAData(ar2);</p>
            <p>　　//----------</p>
            <p>　　if(xmlNode1==null&amp;&amp;xmlNode2==null) //--存储过程执行失败</p>
            <p>　　return;</p>
            <p>　　xmlString1=new StringBuilder(xmlNode1.OuterXml);</p>
            <p>　　xmlString2=new StringBuilder(xmlNode2.OuterXml);</p>
            <p>　　xmlString1=MakeNewXmlString(xmlString1,xmlString2); //生成新的xml</p>
            <p>　　if(xmlString1.ToString().Equals(""))</p>
            <p>　　return ;</p>
            <p>　　xd.LoadXml(xmlString1.ToString());</p>
            <p>　　ds.ReadXml(new XmlNodeReader(xd));</p>
            <p>　　DataGrid1.DataSource=ds.Tables["list"].DefaultView;</p>
            <p>　　DataGrid1.DataBind();</p>
            <p>　　}</p>
            <p>　　//生成新XML</p>
            <p>　　public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)</p>
            <p>　　{</p>
            <p>　　str1=str1.Replace("","");</p>
            <p>　　str2=str2.Replace("","");</p>
            <p>　　str1.Append(str2.ToString());</p>
            <p>　　return str1;</p>
            <p>　　}</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　这有两个需要注意的地方,一个是xml构造,还有就是异步调用的实现,请读者,自己理解
<p>　　下面讲下通过dll来引用webservice的方法,我只把流程介绍下.</p>
<p>　　首先,在ie输入服务的地址,如:http://www.xxx.com/service.asmx</p>
<p>　　然后写输入http://www.xxx.com/service.asmx?wsdl</p>
<p>　　打开后,另存为xxx.wsdl</p>
<p>　　然后用vs的命令提示符来编译:wsdl /namespace:SiteA ServiceA.wsdl</p>
<p>　　生成名字空间为sitea的代理类</p>
<p>　　最后csc /out:ServiceA.dll /t:library Service1.cs ,其中service1.cs为代理类文件</p>
<p>　　最后引用dll就可以了.</p>
<br />
<img src ="http://www.blogjava.net/CrazyJava/aggbug/222191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-08-15 11:25 <a href="http://www.blogjava.net/CrazyJava/articles/222191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>