﻿<?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-备忘录-文章分类-开源框架</title><link>http://www.blogjava.net/103335460/category/33636.html</link><description>记录学习过、研究过、使用过和总结过的内容，以备不时之需</description><language>zh-cn</language><lastBuildDate>Sat, 24 Mar 2012 20:45:59 GMT</lastBuildDate><pubDate>Sat, 24 Mar 2012 20:45:59 GMT</pubDate><ttl>60</ttl><item><title>如何阅读liunx内核源码（网上转载）</title><link>http://www.blogjava.net/103335460/articles/284254.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Fri, 26 Jun 2009 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/284254.html</guid><description><![CDATA[<p>核心源码的顶层是/usr/src/linux目录，在此目录下你可以看到大量子目录：</p>
<p><strong>arch</strong><br />
&nbsp;这个子目录包含了所有体系结构相关的核心代码。它还包含每种支持的体系结构的子目录，如i386。 <br />
<strong>include<br />
</strong>&nbsp;这个目录包括了用来重构核心的大多数include文件。对于每种支持的体系结构分别有一个子目录。 此目录中的asm子目录中是对应某种处理器的符号连接，如include/asm-i386。要修改处理器结构 则只需编辑核心的makefile并重新运行Linux核心配置程序。 <br />
<strong>init<br />
</strong>&nbsp;此目录包含核心启动代码。 <br />
<strong>mm</strong><br />
&nbsp;此目录包含了所有的内存管理代码。与具体体系结构相关的内存管理代码位于arch/*/mm目录下， 如arch/i386/mm/fault.c 。 <br />
<strong>drivers</strong><br />
&nbsp;系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动，如block。 <br />
<strong>ipc</strong><br />
&nbsp;此目录包含了核心的进程间通讯代码。 <br />
<strong>modules</strong><br />
&nbsp;此目录仅仅包含已建好的模块。 <br />
<strong>fs</strong><br />
&nbsp;所有的文件系统代码。它也被划分成对应不同文件系统的子目录，如vfat和ext2。 <br />
<strong>kernel</strong><br />
&nbsp;主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。 <br />
<strong>net</strong><br />
&nbsp;核心的网络部分代码。 <br />
<strong>lib</strong><br />
&nbsp;此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。 <br />
<strong>scripts</strong><br />
&nbsp;此目录包含用于配置核心的脚本文件（如awk和tk脚本）。</p>
<p><strong>从哪里入手,如何入手</strong></p>
<p>阅读象Linux核心代码这样的复杂程序令人望而生畏。它象一个越滚越大的雪球。阅读核心某个部分经常要 用到好几个其他的相关文件，不久你将会忘记你原来在干什么。本小节将给出一些提示。</p>
<p><strong>系统启动与初始化</strong> </p>
<p>在基于intel的系统上，Linux可以通过loadlin.exe或者LILO将核心载入内存并将控制传递给它。这部分程序 位于arch/i386/kerneld/head.S。此文件完成一些处理器相关操作并跳转到init/main.c中的main()例程。 </p>
<p>&nbsp;</p>
<p><strong>内存管理 </strong></p>
<p>这部分代码主要位于mm目录中但其处理器结构相关部分被放在arch/*/mm中。页面出错处理代码位于mm下的 memory.c文件中而内存映射与页面cache代码位于filemap.c中。buffer cache则在mm/buffer.c中实现， swap cache位于mm/swap_state.c和mm/swapfile.c中。 </p>
<p>&nbsp;</p>
<p><strong>核心</strong> </p>
<p>大多数通用代码位于kernel目录下而处理器相关代码被放在arch/*/kernel中。调度器位于kernel/sched.c 而fork代码位于kernel/fork.c中。底层部分处理代码位于include/linux/interrupt.h中。task_struct的 描叙则在/linux/sched.h中可以找到。 </p>
<p>&nbsp;</p>
<p><strong>PCI</strong> </p>
<p>PCI伪设备驱动位于drivers/pci/pci.c且其系统通用定义放在include/linux/pci.h中。每个处理器结构 具有特殊的PCI BIOS代码，Alpha AXP的位于arch/alpha/kernel/bios32.c中。 </p>
<p>&nbsp;</p>
<p><strong>进程间通讯 </strong></p>
<p>所有这些代码都在ipc目录中。系统V IPC对象都包含一个ipc_perm结构，它在include/linux/ipc.h中描叙。 系统V消息在ipc/msg.c中实现，共享内存在ipc/shm.c而信号灯位于ipc/sem.c中。管道在ipc/pipe.c中实现。 </p>
<p>&nbsp;</p>
<p><strong>中断处理</strong></p>
<p>核心的中断处理代码总是与微处理器结构相关。Intel系统的中断处理代码位于arch/i386/kernel/irq.c中， 其定义位于include/asm-i386/irq.h中。</p>
<p><strong>设备驱动 </strong></p>
<p>Linux核心源码的大多数都是设备驱动。所有Linux的设备驱动源码都放在drivers目录中并分成以下几类： </p>
<p><br />
<strong>/block<br />
</strong>&nbsp;块设备驱动包括IDE（在ide.c中）驱动。如果你想寻找这些可包含文件系统的设备的初始化过程 则应该在drivers/block/genhd.c中的device_setup()。当安装一个nfs文件系统时不但要初始化 硬盘还需初始化网络。块设备包括IDE与SCSI设备。 </p>
<p><br />
<strong>/char</strong><br />
&nbsp;此目录包含字符设备的驱动，如ttys，串行口以及鼠标。 </p>
<p><br />
<strong>/cdrom</strong><br />
&nbsp;包含所有Linux CDROM代码。在这里可以找到某些特殊的CDROM设备（如Soundblaster CDROM）。 IDE接口的CD驱动位于drivers/block/ide-cd.c中而SCSI CD驱动位于drivers/scsi/scsi.c中。 </p>
<p><br />
<strong>/pci</strong><br />
&nbsp;它包含了PCI伪设备驱动源码。这里可以找到关于PCI子系统映射与初始化的代码。另外位于 arch/alpha/kernel/bios32.c中的Alpha AXP PCI补丁代码也值得一读。 </p>
<p><br />
<strong>/scsi</strong><br />
&nbsp;这里可以找到所有的SCSI代码以及Linux支持的SCSI 设备的设备驱动。 </p>
<p><br />
<strong>/net</strong><br />
&nbsp;包含网络驱动源码，如tulip.c中的DECChip 21040 PCI以太网驱动。 </p>
<p><br />
<strong>/sound</strong><br />
&nbsp;所有的声卡驱动源码。 </p>
<p>&nbsp;</p>
<p><strong>文件系统 </strong></p>
<p>EXT2文件系统的源码位于fs/ext2中，其数据结构定义位于include/linux/ext2_fs.h, ext2_fs_i.h 以及 ext2_fs_sb.h中。虚拟文件系统数据结构在include/linux/fs.h中描叙且其代码在fs/*中。buffer cache 和update核心后台进程在fs/buffer.c中实现。 </p>
<p>&nbsp;</p>
<p><strong>网络 </strong></p>
<p>网络代码位于net目录而大多数包含文件位于include/net中。BSD套接口代码位于net/socket.c中。IPV4的 INET套接口代码位于net/ipv4/af_inet.c中。通用协议支撑代码（包括sk_buff处理过程）位于net/core中， 同时TCP/IP网络代码位于net/ipv4中。网络设备驱动位于drivers/net中。 </p>
<p>&nbsp;</p>
<p><strong>模块 </strong></p>
<p>核心模块代码部分位于核心中部分位于modules包中。核心代码位于kernel/modules.c且其数据结构与核心 后台进程kerneld消息位于include/linux/module.h和include/linux/kerneld.h目录中。同时必要时需查阅 include/linux/elf.h中的ELF文件格式。</p>
<img src ="http://www.blogjava.net/103335460/aggbug/284254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-06-26 12:28 <a href="http://www.blogjava.net/103335460/articles/284254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.0.x bean的作用域</title><link>http://www.blogjava.net/103335460/articles/260965.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Fri, 20 Mar 2009 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260965.html</guid><description><![CDATA[<p>bean的作用域 </p>
<p>在创建一个bean定义（通常为XML配置文件）时，你可以简单的将其理解为：用以创建由该bean定义所决定的实际对象实例的一张&#8220;<span class="emphasis"><em>处方（recipe）</em></span>&#8221;或者模板。就如class一样，根据一张&#8220;处方&#8221;你可以创建多个对象实例。</p>
<p>你不仅可以控制注入到对象（bean定义）中的各种依赖和配置值，还可以控制该对象的作用域。这样你可以灵活选择所建对象的作用域，而不必在 Java Class级定义作用域。Spring Framework支持五种作用域（其中有三种只能用在基于web的Spring <code class="interfacename">ApplicationContext</code>）。</p>
<p>内置支持的作用域分列如下：</p>
<div class="table"><a name="id441704"></a>
<p class="title"><strong>表 3.4. Bean作用域</strong></p>
<div class="table-contents">
<table summary="Bean作用域" border="1">
    <colgroup>
    <col></col>
    <col></col></colgroup>
    <thead>
        <tr>
            <th align="center">作用域</th>
            <th align="center">描述</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
            <p><a title="3.4.1.&nbsp;Singleton作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-singleton">singleton</a></p>
            </td>
            <td>
            <p>在每个Spring IoC容器中一个bean定义对应一个对象实例。</p>
            </td>
        </tr>
        <tr>
            <td>
            <p><a title="3.4.2.&nbsp;Prototype作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-prototype">prototype</a></p>
            </td>
            <td>
            <p>一个bean定义对应多个对象实例。</p>
            </td>
        </tr>
        <tr>
            <td>
            <p><a title="3.4.3.2.&nbsp;Request作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-request">request</a></p>
            </td>
            <td>
            <p>在一次HTTP请求中，一个bean定义对应一个实例；即每次HTTP请求将会有各自的bean实例，它们依据某个bean定义创建而成。该作用域仅在基于web的Spring <code class="interfacename">ApplicationContext</code>情形下有效。</p>
            </td>
        </tr>
        <tr>
            <td>
            <p><a title="3.4.3.4.&nbsp;global session作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-global-session">session</a></p>
            </td>
            <td>
            <p>在一个HTTP <code class="interfacename">Session</code>中，一个bean定义对应一个实例。该作用域仅在基于web的Spring <code class="interfacename">ApplicationContext</code>情形下有效。</p>
            </td>
        </tr>
        <tr>
            <td>
            <p><a title="3.4.3.4.&nbsp;global session作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-global-session">global session</a></p>
            </td>
            <td>
            <p>在一个全局的HTTP <code class="interfacename">Session</code>中，一个bean定义对应一个实例。典型情况下，仅在使用portlet context的时候有效。该作用域仅在基于web的Spring <code class="interfacename">ApplicationContext</code>情形下有效。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<p><br class="table-break" />
&nbsp;</p>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="beans-factory-scopes-singleton"></a>3.4.1. Singleton作用域</h3>
</div>
</div>
</div>
<p>当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个<span class="emphasis"><em>共享</em></span>的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。</p>
<p>换言之，当把一个bean定义设置为singlton作用域时，Spring IoC容器只会创建该bean定义的<span class="emphasis"><em>唯一</em></span>实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且<span class="emphasis"><em>所有针对该bean的后续请求和引用</em></span>都将返回被缓存的对象实例。</p>
<p>下图演示了Spring的singleton作用域。</p>
<p>&nbsp;</p>
<div class="mediaobject" align="center"><img src="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/images/singleton.png" align="center"  alt="" /></div>
<p>&nbsp;</p>
<p>请注意Spring的singleton bean概念与&#8220;四人帮&#8221;（GoF）模式一书中定义的Singleton模式是完全不同的。经典的GoF Singleton模式中所谓的对象范围是指在<span class="emphasis"><em>每一个<code class="classname">ClassLoader</code>中</em></span>指定class创建的实例有<span class="emphasis"><em>且仅有一个</em></span>。把Spring的singleton作用域描述成<span class="emphasis"><em>一个<code class="interfacename">container</code>对应一个bean</em></span>实例最为贴切。亦即，假如在单个Spring容器内定义了某个指定class的bean，那么Spring容器将会创建一个<span class="emphasis"><em>且仅有一个</em></span>由该bean定义指定的类实例。</p>
<p><span class="emphasis"><em>Singleton作用域是Spring中的缺省作用域</em></span>。要在XML中将bean定义成singleton，可以这样配置：</p>
<pre class="programlisting">&lt;bean id="accountService" class="com.foo.DefaultAccountService"/&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- the following is equivalent, though redundant (singleton scope is the default) --&gt;</span></em><br />
&lt;bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- the following is equivalent, though redundant (and preserved for backward compatibility) --&gt;</span></em><br />
&lt;bean id="accountService" class="com.foo.DefaultAccountService" singleton="true"/&gt;</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="beans-factory-scopes-prototype"></a>3.4.2. Prototype作用域</h3>
</div>
</div>
</div>
<p>Prototype作用域的bean会导致在每次对该bean请求（将其注入到另一个bean中，或者以程序的方式调用容器的<code class="literal">getBean()</code>方法）时都会<span class="emphasis"><em>创建一个新的bean实例</em></span>。根据经验，对所有有状态的bean应该使用prototype作用域，而对无状态的bean则应该使用singleton作用域。</p>
<p>下图演示了Spring的prototype作用域。<span class="emphasis"><em>请注意，典型情况下，DAO不会被配置成prototype，因为一个典型的DAO不会持有任何会话状态，因此应该使用singleton作用域。</em></span></p>
<p>&nbsp;</p>
<div class="mediaobject" align="center"><img src="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/images/prototype.png" align="center"  alt="" /></div>
<p>&nbsp;</p>
<p>要在XML中将bean定义成prototype，可以这样配置：</p>
<pre class="programlisting">&lt;bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- the following is equivalent too (and preserved for backward compatibility) --&gt;</span></em><br />
&lt;bean id="accountService" class="com.foo.DefaultAccountService" singleton="false"/&gt;</pre>
<p>对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责：容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不 闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将<span class="emphasis"><em>不会</em></span>被 调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用 bean的后置处理器，该处理器持有要被清除的bean的引用。）</p>
<p>谈及prototype作用域的bean时，在某些方面你可以将Spring容器的角色看作是Java <code class="literal">new</code>操作符的替代者。任何迟于该时间点的生命周期事宜都得交由客户端来处理。在<a title="3.5.1.&nbsp;Lifecycle接口" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s05.html#beans-factory-lifecycle">第 3.5.1 节 &#8220;Lifecycle接口&#8221;</a>一节中会进一步讲述Spring IoC容器中的bean生命周期。</p>
</div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<h3 class="title">向后兼容性：在XML中指定生命周期作用域</h3>
<p>如果你在bean定义文件中引用<code class="filename">'spring-beans.dtd'</code> DTD，要显式说明bean的生命周期作用域你必须使用"<code class="literal">singleton</code>"属性(记住<a title="3.4.1.&nbsp;Singleton作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-singleton">singleton生命周期作用域</a>是默认的)。 如果引用的是<code class="filename">'spring-beans-2.0.dtd'</code> DTD或者是Spring 2.0 XSD schema，那么需要使用"<code class="literal">scope</code>"属性(因为"<code class="literal">singleton</code>"属性被删除了，新的DTD和XSD文件使用"<code class="literal">scope</code>"属性)。</p>
<p>简单地说，如果你用"<code class="literal">singleton</code>"属性那么就<span class="emphasis"><em>必须<span class="emphasis"><em>在那个文件里</em></span></em></span>引用<code class="filename">'spring-beans.dtd'</code> DTD。 如果你用"<code class="literal">scope</code>"属性那么必须 <span class="emphasis"><em>在那个文件里</em></span>引用<code class="filename">'spring-beans-2.0.dtd'</code> DTD 或<code class="filename">'spring-beans-2.0.xsd'</code> XSD。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="beans-factory-scopes-other"></a>3.4.3. 其他作用域</h3>
</div>
</div>
</div>
<p>其他作用域，即<code class="literal">request</code>、<code class="literal">session</code>以及<code class="literal">global session</code>仅在基于web的应用中使用（不必关心你所采用的是什么web应用框架）。</p>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<h3 class="title">注意</h3>
<p>下面介绍的作用域<span class="emphasis"><em>仅仅</em></span>在使用基于web的Spring <code class="interfacename">ApplicationContext</code>实现（如<code class="classname">XmlWebApplicationContext</code>）时有用。如果在普通的Spring IoC容器中，比如像<code class="classname">XmlBeanFactory</code>或<code class="classname">ClassPathXmlApplicationContext</code>，尝试使用这些作用域，你<span class="emphasis"><em>将会</em></span>得到一个<code class="classname">IllegalStateException</code>异常（未知的bean作用域）。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="beans-factory-scopes-other-web-configuration"></a>3.4.3.1. 初始化web配置</h4>
</div>
</div>
</div>
<p>要使用<code class="literal">request</code>、<code class="literal">session</code>和 <code class="literal">global session</code>作用域的bean（即具有web作用域的bean），在开始设置bean定义之前，还要做少量的初始配置。请注意，假如你只想要&#8220;常规的&#8221;作用域，也就是singleton和prototype，就<span class="emphasis"><em>不需要</em></span>这一额外的设置。</p>
<p>在目前的情况下，根据你的特定servlet环境，有多种方法来完成这一初始设置。如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件<code class="literal">web.xml</code>中增加下述<code class="interfacename">ContextListener</code>即可</p>
<pre class="programlisting">&lt;web-app&gt;<br />
...<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;<br />
...<br />
&lt;/web-app&gt;</pre>
<p>如果你用的是早期版本的web容器（Servlet 2.4以前），那么你要使用一个<code class="interfacename">javax.servlet.Filter</code>的实现。请看下面的web.xml配置片段：</p>
<pre class="programlisting">&lt;web-app&gt;<br />
..<br />
&lt;filter&gt; <br />
&lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
&lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;<br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
...<br />
&lt;/web-app&gt;</pre>
<p><code class="classname">RequestContextListener</code>和<code class="classname">RequestContextFilter</code>两个类做的都是同样的工作：将HTTP request对象绑定到为该请求提供服务的<code class="classname">Thread</code>。这使得具有request和session作用域的bean能够在后面的调用链中被访问到。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="beans-factory-scopes-request"></a>3.4.3.2. Request作用域</h4>
</div>
</div>
</div>
<p>考虑下面bean定义：</p>
<pre class="programlisting">&lt;bean id="loginAction" class="com.foo.LoginAction" scope="request"/&gt;</pre>
<p>针对每次HTTP请求，Spring容器会根据<code class="literal">loginAction</code> bean定义创建一个全新的<code class="classname">LoginAction</code> bean实例，且该<code class="literal">loginAction</code> bean实例仅在当前HTTP request内有效，因此可以根据需要放心的更改所建实例的内部状态，而其他请求中根据<code class="literal">loginAction</code> bean定义创建的实例，将不会看到这些特定于某个请求的状态变化。当处理请求结束，request作用域的bean实例将被销毁。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="beans-factory-scopes-session"></a>3.4.3.3. Session作用域</h4>
</div>
</div>
</div>
<p>考虑下面bean定义：</p>
<pre class="programlisting">&lt;bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/&gt;</pre>
<p>针对某个HTTP <code class="interfacename">Session</code>，Spring容器会根据<code class="literal">userPreferences</code> bean定义创建一个全新的<code class="classname">userPreferences</code> bean实例，且该<code class="literal">userPreferences</code> bean仅在当前HTTP <code class="interfacename">Session</code>内有效。与<code class="literal">request作用域</code>一样，你可以根据需要放心的更改所创建实例的内部状态，而别的HTTP <code class="interfacename">Session</code>中根据<code class="literal">userPreferences</code>创建的实例，将不会看到这些特定于某个HTTP <code class="interfacename">Session</code>的状态变化。当HTTP <code class="interfacename">Session</code>最终被废弃的时候，在该HTTP <code class="interfacename">Session</code>作用域内的bean也会被废弃掉。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="beans-factory-scopes-global-session"></a>3.4.3.4. global session作用域</h4>
</div>
</div>
</div>
<p>考虑下面bean定义：</p>
<pre class="programlisting">&lt;bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/&gt;</pre>
<p><code class="literal">global session</code>作用域类似于标准的HTTP <code class="interfacename">Session</code>作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局<code class="interfacename">Session</code>的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在<code class="literal">global session</code>作用域中定义的bean被限定于全局portlet <code class="interfacename">Session</code>的生命周期范围内。</p>
<p>请注意，假如你在编写一个标准的基于Servlet的web应用，并且定义了一个或多个具有<code class="literal">global session</code>作用域的bean，系统会使用标准的HTTP <code class="interfacename">Session</code>作用域，并且不会引起任何错误。</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="beans-factory-scopes-other-injection"></a>3.4.3.5. 作用域bean与依赖</h4>
</div>
</div>
</div>
<p>能够在HTTP request或者<code class="interfacename">Session</code>（甚至<a title="3.4.4.&nbsp;自定义作用域" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html#beans-factory-scopes-custom">自定义</a>） 作用域中定义bean固然很好，但是Spring IoC容器除了管理对象（bean）的实例化，同时还负责协作者（或者叫依赖）的实例化。如果你打算将一个Http request范围的bean注入到另一个bean中，那么需要注入一个AOP代理来替代被注入的作用域bean。也就是说，你需要注入一个代理对象，该 对象具有与被代理对象一样的公共接口，而容器则可以足够智能的从相关作用域中（比如一个HTTP request）获取到真实的目标对象，并把方法调用委派给实际的对象。</p>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<h3 class="title">注意</h3>
<p><code class="literal">&lt;aop:scoped-proxy/&gt;</code><span class="emphasis"><em>不能</em></span>和作用域为<code class="literal">singleton</code>或<code class="literal">prototype</code>的bean一起使用。为singleton bean创建一个scoped proxy将抛出<code class="classname">BeanCreationException</code>异常。</p>
</div>
<p>让我们看一下将相关作用域bean作为依赖的配置，配置并不复杂（只有一行），但是理解&#8220;<span class="quote">为何这么做</span>&#8221;以及&#8220;<span class="quote">如何做</span>&#8221;是很重要的。</p>
<pre class="programlisting">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xmlns:aop="http://www.springframework.org/schema/aop"<br />
xsi:schemaLocation="<br />
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- a HTTP <code class="interfacename">Session</code>-scoped bean exposed as a proxy --&gt;</span></em><br />
&lt;bean id="userPreferences" class="com.foo.UserPreferences" <span class="bold"><strong>scope="session"</strong></span>&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- this next element effects the proxying of the surrounding bean --&gt;</span></em><br />
<span class="bold"><strong>&lt;aop:scoped-proxy/&gt;</strong></span><br />
&lt;/bean&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- a singleton-scoped bean <span class="bold"><strong>injected with a proxy to the above bean</strong></span> --&gt;</span></em><br />
&lt;bean id="userService" class="com.foo.SimpleUserService"&gt;<br />
<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- a reference to the <span class="bold"><strong>proxied</strong></span> <code class="literal">'userPreferences'</code> bean --&gt;</span></em><br />
&lt;property name="userPreferences" ref="userPreferences"/&gt;<br />
<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;</pre>
<p>在XML配置文件中，要创建一个作用域bean的代理，只需要在作用域bean定义里插入一个<code class="literal">&lt;aop:scoped-proxy/&gt;</code>子元素即可（你可能还需要在classpath里包含CGLIB库，这样容器就能够实现基于class的代理；还可能要使用基于XSD的配置）。上述XML配置展示了&#8220;<span class="quote">如何做</span>&#8221;，现在讨论&#8220;<span class="quote">为何这么做</span>&#8221;。在作用域为<code class="literal">request</code>、<code class="literal">session</code>以及<code class="literal">globalSession</code>的bean定义里，为什么需要这个<code class="literal">&lt;aop:scoped-proxy/&gt;</code>元素呢？下面我们从去掉<code class="literal">&lt;aop:scoped-proxy/&gt;</code>元素的XML配置开始说起：</p>
<pre class="programlisting">&lt;bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/&gt;<br />
<br />
&lt;bean id="userManager" class="com.foo.UserManager"&gt;<br />
&lt;property name="userPreferences" ref="userPreferences"/&gt;<br />
&lt;/bean&gt;</pre>
<p>从上述配置中可以很明显的看到singleton bean <code class="literal">userManager</code>被注入了一个指向HTTP <code class="interfacename">Session</code>作用域bean <code class="literal">userPreferences</code>的引用。singleton <code class="literal">userManager</code> bean会被容器仅实例化<span class="emphasis"><em>一次</em></span>，并且其依赖（<code class="literal">userPreferences</code> bean）也仅被注入一次。这意味着，<code class="literal">userManager</code>在理论上只会操作同一个<code class="literal">userPreferences</code>对象，即原先被注入的那个bean。而注入一个HTTP <code class="interfacename">Session</code>作用域的bean作为依赖，有违我们的初衷。因为我们想要的只是一个<code class="literal">userManager</code>对象，在它进入一个HTTP <code class="interfacename">Session</code>生命周期时，我们希望去使用一个HTTP <code class="interfacename">Session</code>的<code class="literal">userPreferences</code>对象。</p>
<p>当注入某种类型对象时，该对象实现了和<code class="classname">UserPreferences</code>类一样的公共接口（即<code class="classname">UserPreferences</code>实例）。并且不论我们底层选择了何种作用域机制（HTTP request、<code class="interfacename">Session</code>等等），容器都会足够智能的获取到<code class="interfacename">真正的</code><code class="classname">UserPreferences</code>对象，因此我们需要将该对象的代理注入到<code class="literal">userManager</code> bean中, 而<code class="literal">userManager</code> bean并不会意识到它所持有的是一个指向<code class="classname">UserPreferences</code>引用的代理。在本例中，当<code class="interfacename">UserManager</code>实例调用了一个使用<code class="classname">UserPreferences</code>对象的方法时，实际调用的是代理对象的方法。随后代理对象会从HTTP <code class="interfacename">Session</code>获取真正的<code class="classname">UserPreferences</code>对象，并将方法调用委派给获取到的实际的<code class="classname">UserPreferences</code>对象。</p>
<p>这就是为什么当你将<code class="literal">request</code>、<code class="literal">session</code>以及<code class="literal">globalSession</code>作用域bean注入到协作对象中时需要如下正确而完整的配置：</p>
<pre class="programlisting">&lt;bean id="userPreferences" class="com.foo.UserPreferences" scope="session"&gt;<br />
<span class="bold"><strong><code class="literal">&lt;aop:scoped-proxy/&gt;</code></strong></span><br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="userManager" class="com.foo.UserManager"&gt;<br />
&lt;property name="userPreferences" ref="userPreferences"/&gt;<br />
&lt;/bean&gt;</pre>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="beans-factory-scopes-custom"></a>3.4.4. 自定义作用域</h3>
</div>
</div>
</div>
<p>在Spring 2.0中，Spring的bean作用域机制是可以扩展的。这意味着，你不仅可以使用Spring提供的预定义bean作用域； 还可以定义自己的作用域，甚至重新定义现有的作用域（不提倡这么做，而且你<span class="emphasis"><em>不能</em></span>覆盖内置的<code class="literal">singleton</code>和<code class="literal">prototype</code>作用域）。</p>
<p>作用域由接口<code class="interfacename">org.springframework.beans.factory.config.Scope</code>定义。要将你自己的自定义作用域集成到Spring容器中，需要实现该接口。它本身非常简单，只有两个方法，分别用于底层存储机制获取和删除对象。自定义作用域可能超出了本参考手册的讨论范围，但你可以参考一下Spring提供的<code class="interfacename">Scope</code>实现，以便于去如何着手编写自己的Scope实现。</p>
<p>在实现一个或多个自定义<code class="interfacename">Scope</code>并测试通过之后，接下来就是如何让Spring容器识别你的新作用域。<code class="interfacename">ConfigurableBeanFactory</code>接口声明了给Spring容器注册新<code class="interfacename">Scope</code>的主要方法。（大部分随Spring一起发布的<code class="interfacename">BeanFactory</code>具体实现类都实现了该接口）；该接口的主要方法如下所示：</p>
<pre class="programlisting">void registerScope(String scopeName, Scope scope);</pre>
<p><code class="methodname">registerScope(..)</code>方法的第一个参数是与作用域相关的全局唯一名称；Spring容器中该名称的范例有<code class="literal">singleton</code>和<code class="literal">prototype</code>。<code class="methodname">registerScope(..)</code>方法的第二个参数是你打算注册和使用的自定义<code class="interfacename">Scope</code>实现的一个实例。</p>
<p>假设你已经写好了自己的自定义<code class="interfacename">Scope</code>实现，并且已经将其进行了注册：</p>
<pre class="programlisting"><em class="lineannotation"><span class="lineannotation">// note: the <code class="classname">ThreadScope</code> class does <span class="bold"><strong>not</strong></span> exist; I made it up for the sake of this example</span></em><br />
Scope customScope = new ThreadScope();<br />
beanFactory.registerScope("<span class="bold"><strong>thread</strong></span>", scope);</pre>
<p>然后你就可以像下面这样创建与自定义<code class="interfacename">Scope</code>的作用域规则相吻合的bean定义了：</p>
<pre class="programlisting">&lt;bean id="..." class="..." <span class="bold"><strong>scope="thread"</strong></span>/&gt;</pre>
<p>如果你有自己的自定义<code class="interfacename">Scope</code>实现，你不仅可以采用编程的方式注册自定义作用域，还可以使用<code class="interfacename">BeanFactoryPostProcessor</code>实现：<code class="classname">CustomScopeConfigurer</code>类，以声明的方式注册<code class="interfacename">Scope</code>。<code class="interfacename">BeanFactoryPostProcessor</code>接口是扩展Spring IoC容器的基本方法之一，在本章的<a title="3.7.2.&nbsp;用BeanFactoryPostProcessor定制配置元数据" href="http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s07.html#beans-factory-extension-factory-postprocessors">BeanFactoryPostProcessor</a>中将会介绍。</p>
<p>使用<code class="classname">CustomScopeConfigurer</code>，以声明方式注册自定义<code class="interfacename">Scope</code>的方法如下所示：</p>
<pre class="programlisting">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xmlns:aop="http://www.springframework.org/schema/aop"<br />
xsi:schemaLocation="<br />
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&gt;<br />
<br />
&lt;bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"&gt;<br />
&lt;property name="scopes"&gt;<br />
&lt;map&gt;<br />
<span class="bold"><strong>&lt;entry key="thread" value="com.foo.ThreadScope"/&gt;</strong></span><br />
&lt;/map&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="bar" class="x.y.Bar" <span class="bold"><strong>scope="thread"</strong></span>&gt;<br />
&lt;property name="name" value="Rick"/&gt;<br />
&lt;aop:scoped-proxy/&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="foo" class="x.y.Foo"&gt;<br />
&lt;property name="bar" ref="bar"/&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;/beans&gt;</pre>
<p><code class="classname">CustomScopeConfigurer</code>既允许你指定实际的<code class="classname">Class</code>实例作为entry的值，也可以指定实际的<code class="interfacename">Scope</code>实现类实例；详情请参见<code class="classname">CustomScopeConfigurer</code>类的JavaDoc</p>
</div>
<img src ="http://www.blogjava.net/103335460/aggbug/260965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-20 09:39 <a href="http://www.blogjava.net/103335460/articles/260965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring ApplicationContext.xml配置的12个技巧和Bean属性说明</title><link>http://www.blogjava.net/103335460/articles/260845.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Thu, 19 Mar 2009 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260845.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring ApplicationContext.xml配置的12个技巧&nbsp;Spring是一个强有力的java程序框架，其被广泛应用于java的程序中。它用POJO提供了企业级服务。 Spring利用依赖注入可以获得简单而有效的测试能力。Spring beans，依赖关系，以及服务所需要的bean都将在配置文件中予以描述，配置文件一般采用XML格式。然而XML配置文件冗长而不易使...&nbsp;&nbsp;<a href='http://www.blogjava.net/103335460/articles/260845.html'>阅读全文</a><img src ="http://www.blogjava.net/103335460/aggbug/260845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-19 17:43 <a href="http://www.blogjava.net/103335460/articles/260845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties配置文件详解</title><link>http://www.blogjava.net/103335460/articles/260838.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Thu, 19 Mar 2009 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260838.html</guid><description><![CDATA[<div class="google-adsense-right"><font size="2">
<p>Struts 2框架有两个核心配置文件:<br />
<br />
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;struts.xml</font>和<font color="#ff0000">struts.properties</font><br />
<br />
<clk>&nbsp;&nbsp;&nbsp;&nbsp;其中struts.xml文件主要负责<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,0,"")' onmouseout="kwL(event,this)">管理</nobr>应用中的Action映射，以及该Action包含的Result定义等。除此之外，Struts 2框架还包含一个struts.properties文件，该文件定义了Struts 2框架的大量属性，开发者可以通过改变这些属性来<nobr oncontextmenu="return false" onmousemove="kwM(3)" id="clickeyekey3" onmouseover="kwE(event,3, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,3,"")' onmouseout="kwL(event,this)">满足</nobr>应用的需求。</clk><br />
<br />
<clk>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struts.properties文件是一个<nobr oncontextmenu="return false" onmousemove="kwM(5)" id="clickeyekey5" onmouseover="kwE(event,5, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,5,"")' onmouseout="kwL(event,this)">标准</nobr>的Properties文件，该文件包含了系列的key-value对象，每个key就是一个Struts 2属性，该key对应的value就是一个Struts 2属性值。</clk><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struts.properties文件通常放在Web应用的WEB-INF/classes路径下。实际上，只要将该文件放在Web应用的CLASSPATH路径下，Struts 2框架就可以加载该文件。</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实，struts.properties文件的内容均可在struts.xml中以<font color="#ff0000">&lt;constant name="" value=""&gt;&lt;/constant&gt;</font>加载。
<p>下面将该文件的配置参数详细列举出来，方便大家查看；</p>
<div><font color="#ff0000"><font color="#000000"><font color="#ff0000">struts.configuration</font></font></font></div>
<div><font color="#ff0000"><font color="#000000"><br />
&nbsp;&nbsp;&nbsp; 该属性指定加载Struts 2配置文件的配置文件管理器。该属性的默认值是org.apache.Struts2.config.DefaultConfiguration，这是Struts 2默认的配置文件管理器。如果需要实现自己的配置管理器，开发者则可以实现一个实现Configuration接口的类，该类可以自己加载Struts 2配置文件。<br />
<br />
<br />
</font></font>
<div><font color="#ff0000"><font color="#000000"><font color="#ff0000">struts.locale</font></font></font></div>
<div><font color="#ff0000"><font color="#000000"><br />
指定Web应用的默认Locale。<br />
<br />
</font></font><font color="#ff0000">struts.i18n.encoding</font></div>
<div><font color="#ff0000"><font color="#000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp; 指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用，对于获取中文请求参数值，应该将该属性值设置为GBK或者GB2312。<br />
<br />
提示&nbsp; 当设置该参数为GBK时，相当于调用HttpServletRequest的setCharacterEncoding方法。<br />
<br />
<br />
</font></font></div>
<div><font color="#ff0000"><font color="#000000"><font color="#ff0000">struts.objectFactory</font></font></font></div>
<div><font color="#ff0000"><font color="#000000"><br />
&nbsp;&nbsp;&nbsp; 指定Struts 2默认的ObjectFactory Bean，该属性默认值是spring。<br />
<br />
</font></font><font color="#ff0000">struts.objectFactory.spring.autoWrite</font></div>
<div><font color="#ff0000"><font color="#000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp; 指定Spring框架的自动装配模式，该属性的默认值是name，即默认根据Bean的name属性自动装配。<br />
<br />
<font color="#ff0000">struts.objectFactory.spring.useClassCache</font></font></font></div>
<div><font color="#ff0000"><font color="#000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该属性指定整合Spring框架时，是否缓存Bean实例，该属性只允许使用true和false两个属性值，它的默认值是true。通常不建议修改该属性值。<br />
<br />
<br />
<br />
</font></font></div>
<div><font color="#ff0000">struts.objectTypeDeterminer</font></div>
<div><font color="#ff0000"><font color="#000000"><clk>&nbsp;&nbsp;&nbsp;&nbsp;该属性指定Struts 2的类型<nobr oncontextmenu="return false" onmousemove="kwM(2)" id="clickeyekey2" onmouseover="kwE(event,2, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,2,"")' onmouseout="kwL(event,this)">检测</nobr>机制，通常支持tiger和notiger两个属性值。</clk><br />
<br />
<br />
<font color="#ff0000"></font></font></font></div>
<div><font color="#ff0000"><font color="#000000"><font color="#ff0000">&nbsp;struts.multipart.parser</font>：该属性指定处理multipart/form-data的MIME类型（文件上传）请求的框架，该属性支持cos、pell和jakarta等属性值，即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。<br />
<br />
注意&nbsp; 如果需要使用cos或者pell的文件上传方式，则应该将对应的JAR文件复制到Web应用中。例如，使用cos上传方式，则需要自己下载cos框架的JAR文件，并将该文件放在WEB-INF/lib路径下。<br />
<br />
</font></font><font color="#ff0000">struts.multipart.saveDir</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性指定上传文件的临时保存路径，该属性的默认值是javax.servlet.context.tempdir。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.multipart.maxSize</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Struts 2文件上传中整个请求内容允许的最大字节数。<br />
<br />
</font></font><font color="#ff0000">struts.custom.properties</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性指定Struts 2应用加载用户自定义的属性文件，该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性。如果需要加载多个自定义属性文件，多个自定义属性文件的文件名以英文逗号（,）隔开。<br />
<br />
</font></font><font color="#ff0000">struts.mapper.class</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;指定将HTTP请求映射到指定Action的映射器，Struts 2提供了默认的映射器：org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默认映射器根据请求的前缀与Action的name属性完成映射。<br />
<br />
</font></font><font color="#ff0000">struts.action.extension</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该属性指定需要Struts 2处理的请求后缀，该属性的默认值是action，即所有匹配*.action的请求都由Struts 2处理。如果用户需要指定多个请求后缀，则多个后缀之间以英文逗号（,）隔开。<br />
<br />
</font></font><font color="#ff0000">struts.serve.static</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性设置是否通过JAR文件提供静态内容服务，该属性只支持true和false属性值，该属性的默认属性值是true。<br />
<br />
</font></font><font color="#ff0000">struts.serve.static.browserCache</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时，我们希望每次请求都获得服务器的最新响应，则可设置该属性为false。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.enable.DynamicMethodInvocation</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;该属性设置Struts 2是否支持动态方法调用，该属性的默认值是true。如果需要关闭动态方法调用，则可设置该属性为false。<br />
<br />
</font></font><font color="#ff0000">struts.enable.SlashesInActionNames</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;该属性设置Struts 2是否允许在Action名中使用斜线，该属性的默认值是false。如果开发者希望允许在Action名中使用斜线，则可设置该属性为true。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.tag.altSyntax</font></div>
<div><font color="#ff0000"><font color="#000000"><clk>&nbsp;&nbsp;&nbsp;该属性指定是否允许在Struts 2标签中使用表达式<nobr oncontextmenu="return false" onmousemove="kwM(4)" id="clickeyekey4" onmouseover="kwE(event,4, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,4,"")' onmouseout="kwL(event,this)">语法</nobr>，因为通常都需要在标签中使用表达式语法，故此属性应该设置为true，该属性的默认值是true。</clk><br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.devMode</font></div>
<div><font color="#ff0000"><font color="#000000">该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true，则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值，该属性的默认值是false。通常，应用在开发阶段，将该属性设置为true，当进入产品发布阶段后，则该属性设置为false。<br />
<br />
</font></font><font color="#ff0000">struts.i18n.reload</font></div>
<div><font color="#ff0000"><font color="#000000">该属性设置是否每次HTTP请求到达时，系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发，但在产品发布阶段应将该属性设置为false。<br />
<br />
</font><font color="#000000"><font face="楷体_GB2312"><clk>提示&nbsp; 开发阶段将该属性设置了true，将可以在每次请求时都重新加载国际化资源文件，从而可以让开发者看到实时开发<nobr oncontextmenu="return false" onmousemove="kwM(1)" id="clickeyekey1" onmouseover="kwE(event,1, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick='kwC(event,1,"")' onmouseout="kwL(event,this)">效果</nobr>；产品发布阶段应该将该属性设置为false，是为了提供响应性能，每次请求都需要重新加载资源文件会大大降低应用的性能。</clk><br />
<br />
</font></font></font><font color="#ff0000">struts.ui.theme</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定视图标签默认的视图主题，该属性的默认值是xhtml。<br />
<br />
</font></font><font color="#ff0000">struts.ui.templateDir</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定视图主题所需要模板文件的位置，该属性的默认值是template，即默认加载template路径下的模板文件。<br />
<br />
</font></font><font color="#ff0000">struts.ui.templateSuffix</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定模板文件的后缀，该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp，分别对应FreeMarker、Velocity和JSP模板。<br />
<br />
</font></font><font color="#ff0000">struts.configuration.xml.reload</font></div>
<div><font color="#ff0000"><font color="#000000">该属性设置当struts.xml文件改变后，系统是否自动重新加载该文件。该属性的默认值是false。<br />
<br />
</font></font><font color="#ff0000">struts.velocity.configfile</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.velocity.contexts</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Velocity框架的Context位置，如果该框架有多个Context，则多个Context之间以英文逗号（,）隔开。<br />
<br />
</font></font><font color="#ff0000">struts.velocity.toolboxlocation</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Velocity框架的toolbox的位置。<br />
<br />
</font></font><font color="#ff0000">struts.url.http.port</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Web应用所在的监听端口。该属性通常没有太大的用户，只是当Struts 2需要生成URL时（例如Url标签），该属性才提供Web应用的默认端口。<br />
<br />
</font></font><font color="#ff0000">struts.url.https.port</font></div>
<div><font color="#ff0000"><font color="#000000">该属性类似于struts.url.http.port属性的作用，区别是该属性指定的是Web应用的加密服务端口。<br />
<br />
</font></font><font color="#ff0000">struts.url.includeParams</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值，分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。<br />
<br />
<br />
</font></font>
<div><font color="#ff0000">&nbsp; struts.custom.i18n.resources</font></div>
<div><font color="#ff0000"><font color="#000000">该属性指定Struts 2应用所需要的国际化资源文件，如果有多份国际化资源文件，则多个资源文件的文件名以英文逗号（,）隔开。<br />
<br />
<br />
</font></font>
<div><font color="#ff0000">struts.dispatcher.parametersWorkaround</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;对于某些Java EE服务器，不支持HttpServlet Request调用getParameterMap()方法，此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器，通常应该设置该属性为true。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.freemarker.manager.classname</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager，这是Struts 2内建的FreeMarker管理器。<br />
<br />
</font></font><font color="#ff0000">struts.freemarker.wrapper.altMap</font></div>
<div><font color="#ff0000"><font color="#000000">该属性只支持true和false两个属性值，默认值是true。通常无需修改该属性值。<br />
<br />
</font></font><font color="#ff0000">&nbsp;struts.xslt.nocache</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时，该属性通常被设置为true；当应用处于产品使用阶段时，该属性通常被设置为false。<br />
<br />
</font></font><font color="#ff0000">struts.configuration.files</font></div>
<div><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;该属性指定Struts 2框架默认加载的配置文件，如果需要指定默认加载多个配置文件，则多个配置文件的文件名之间以英文逗号（,）隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml，看到该属性值，读者应该明白为什么Struts 2框架默认加载struts.xml文件了</font></font></div>
</div>
</div>
</div>
<br />
<br />
struts.action.extension<br />
&nbsp; &nbsp; &nbsp; The URL extension to use to determine if the request is meant for a Struts action <br />
&nbsp; &nbsp; &nbsp; 用URL扩展名来确定是否这个请求是被用作Struts action，其实也就是设置 action的后缀，例如login.do的'do'字。<br />
<br />
struts.configuration<br />
&nbsp; &nbsp; &nbsp; The org.apache.struts2.config.Configuration implementation class<br />
&nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.config.Configuration接口名<br />
<br />
struts.configuration.files<br />
&nbsp; &nbsp; &nbsp; A list of configuration files automatically loaded by Struts <br />
&nbsp; &nbsp; &nbsp; struts自动加载的一个配置文件列表<br />
<br />
struts.configuration.xml.reload<br />
&nbsp; &nbsp; &nbsp; Whether to reload the XML configuration or not<br />
&nbsp; &nbsp; &nbsp; 是否加载xml配置(true,false)<br />
<br />
struts.continuations.package<br />
&nbsp; &nbsp; &nbsp; The package containing actions that use Rife continuations<br />
&nbsp; &nbsp; &nbsp; 含有actions的完整连续的package名称<br />
<br />
struts.custom.i18n.resources<br />
&nbsp; &nbsp; &nbsp; Location of additional localization properties files to load <br />
&nbsp; &nbsp; &nbsp; 加载附加的国际化属性文件（不包含.properties后缀）<br />
<br />
struts.custom.properties<br />
&nbsp; &nbsp; &nbsp; Location of additional configuration properties files to load<br />
&nbsp; &nbsp; &nbsp; 加载附加的配置文件的位置<br />
<br />
<br />
struts.devMode<br />
&nbsp; &nbsp; &nbsp; Whether Struts is in development mode or not<br />
&nbsp; &nbsp; &nbsp; 是否为struts开发模式<br />
<br />
struts.dispatcher.parametersWorkaround<br />
&nbsp; &nbsp; &nbsp; Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic<br />
&nbsp; &nbsp; &nbsp; &nbsp; （某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）<br />
<br />
struts.enable.DynamicMethodInvocation<br />
&nbsp; &nbsp; &nbsp; Allows one to disable dynamic method invocation from the URL<br />
&nbsp; &nbsp; &nbsp; &nbsp; 允许动态方法调用<br />
<br />
struts.freemarker.manager.classname<br />
&nbsp; &nbsp; &nbsp; The org.apache.struts2.views.freemarker.FreemarkerManager implementation class <br />
&nbsp; &nbsp; &nbsp; org.apache.struts2.views.freemarker.FreemarkerManager接口名<br />
<br />
struts.i18n.encoding<br />
&nbsp; &nbsp; &nbsp; The encoding to use for localization messages<br />
&nbsp; &nbsp; &nbsp; 国际化信息内码<br />
<br />
struts.i18n.reload<br />
&nbsp; &nbsp; &nbsp; Whether the localization messages should automatically be reloaded<br />
&nbsp; &nbsp; &nbsp; 是否国际化信息自动加载<br />
<br />
struts.locale<br />
&nbsp; &nbsp; &nbsp; The default locale for the Struts application<br />
&nbsp; &nbsp; &nbsp; 默认的国际化地区信息<br />
<br />
struts.mapper.class<br />
&nbsp; &nbsp; &nbsp; The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class<br />
&nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.mapper.ActionMapper接口<br />
<br />
struts.multipart.maxSize<br />
&nbsp; &nbsp; &nbsp; The maximize size of a multipart request (file upload)<br />
&nbsp; &nbsp; &nbsp; multipart请求信息的最大尺寸（文件上传用）<br />
<br />
struts.multipart.parser<br />
&nbsp; &nbsp; &nbsp; The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a multipart request (file upload) <br />
&nbsp; &nbsp; &nbsp; 专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）<br />
<br />
<br />
struts.multipart.saveDir<br />
&nbsp; &nbsp; &nbsp; The directory to use for storing uploaded files <br />
&nbsp; &nbsp; &nbsp; 设置存储上传文件的目录夹<br />
<br />
struts.objectFactory<br />
&nbsp; &nbsp; &nbsp; The com.opensymphony.xwork2.ObjectFactory implementation class<br />
&nbsp; &nbsp; &nbsp; com.opensymphony.xwork2.ObjectFactory接口（spring）<br />
<br />
struts.objectFactory.spring.autoWire<br />
&nbsp; &nbsp; &nbsp; Whether Spring should autoWire or not<br />
&nbsp; &nbsp; &nbsp; 是否自动绑定Spring<br />
<br />
struts.objectFactory.spring.useClassCache<br />
&nbsp; &nbsp; &nbsp; Whether Spring should use its class cache or not<br />
&nbsp; &nbsp; &nbsp; 是否spring应该使用自身的cache<br />
<br />
struts.objectTypeDeterminer<br />
&nbsp; &nbsp; &nbsp; The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class<br />
&nbsp; &nbsp; &nbsp; &nbsp; com.opensymphony.xwork2.util.ObjectTypeDeterminer接口<br />
<br />
struts.serve.static.browserCache<br />
&nbsp; &nbsp; &nbsp; If static content served by the Struts filter should set browser caching header properties or not <br />
&nbsp; &nbsp; &nbsp; 是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br />
<br />
struts.serve.static<br />
&nbsp; &nbsp; &nbsp; Whether the Struts filter should serve static content or not <br />
&nbsp; &nbsp; &nbsp; 是否struts过滤器应该提供静态内容<br />
<br />
struts.tag.altSyntax<br />
&nbsp; &nbsp; &nbsp; Whether to use the alterative syntax for the tags or not <br />
&nbsp; &nbsp; &nbsp; 是否可以用替代的语法替代tags<br />
<br />
struts.ui.templateDir<br />
&nbsp; &nbsp; &nbsp; The directory containing UI templates<br />
&nbsp; &nbsp; &nbsp; UI templates的目录夹<br />
<br />
struts.ui.theme<br />
&nbsp; &nbsp; &nbsp; The default UI template theme<br />
&nbsp; &nbsp; &nbsp; 默认的UI template主题<br />
<br />
struts.url.http.port<br />
&nbsp; &nbsp; &nbsp; The HTTP port used by Struts URLs<br />
&nbsp; &nbsp; &nbsp; 设置http端口<br />
<br />
struts.url.https.port<br />
&nbsp; &nbsp; &nbsp; The HTTPS port used by Struts URLs <br />
&nbsp; &nbsp; &nbsp; 设置https端口<br />
<br />
struts.url.includeParams<br />
&nbsp; &nbsp; &nbsp; The default includeParams method to generate Struts URLs <br />
&nbsp; &nbsp; &nbsp; 在url中产生 默认的includeParams<br />
<br />
struts.velocity.configfile<br />
&nbsp; &nbsp; &nbsp; The Velocity configuration file path<br />
&nbsp; &nbsp; &nbsp; velocity配置文件路径<br />
<br />
struts.velocity.contexts<br />
&nbsp; &nbsp; &nbsp; List of Velocity context names<br />
&nbsp; &nbsp; &nbsp; velocity的context列表<br />
<br />
<br />
struts.velocity.manager.classname<br />
&nbsp; &nbsp; &nbsp; org.apache.struts2.views.velocity.VelocityManager implementation class<br />
&nbsp; &nbsp; &nbsp; org.apache.struts2.views.velocity.VelocityManager接口名<br />
<br />
struts.velocity.toolboxlocation<br />
&nbsp; &nbsp; &nbsp; The location of the Velocity toolbox<br />
&nbsp; &nbsp; &nbsp; velocity工具盒的位置<br />
struts.xslt.nocache<br />
&nbsp; &nbsp; &nbsp; Whether or not XSLT templates should not be cached<br />
&nbsp; &nbsp; &nbsp; 是否XSLT模版应该被缓存</font></div>
<img src ="http://www.blogjava.net/103335460/aggbug/260838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-19 17:22 <a href="http://www.blogjava.net/103335460/articles/260838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个典型的Spring的applicationcontext.xml配置文件（转）</title><link>http://www.blogjava.net/103335460/articles/260836.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Thu, 19 Mar 2009 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260836.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&lt;beans&nbsp;&nbsp;&nbsp;&nbsp;xmlns="http://www.springframework.org/schema/beans"&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/200...&nbsp;&nbsp;<a href='http://www.blogjava.net/103335460/articles/260836.html'>阅读全文</a><img src ="http://www.blogjava.net/103335460/aggbug/260836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-19 17:21 <a href="http://www.blogjava.net/103335460/articles/260836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring总结(转)</title><link>http://www.blogjava.net/103335460/articles/260835.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Thu, 19 Mar 2009 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260835.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: spring 7大组成模块：&nbsp;1:spring core：提供了spring 的核心功能，BeanFactory是spring核心容器的主要组件，&nbsp;&nbsp;&nbsp;&nbsp;它通过Ioc把程序的配置和依赖性与实际的代码分开，是整个spring的基础&nbsp;2:spring context：通过配置文件向spring提供上下文信息，&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/103335460/articles/260835.html'>阅读全文</a><img src ="http://www.blogjava.net/103335460/aggbug/260835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-19 17:18 <a href="http://www.blogjava.net/103335460/articles/260835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Criteria和DetachedCriteria的区别(转)</title><link>http://www.blogjava.net/103335460/articles/260141.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 16 Mar 2009 17:20:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/260141.html</guid><description><![CDATA[<p><font size="4"><font face="Times New Roman">最近在项目中使用 Spring 和 Hibernate 进行开发，有感于 Criteria 比较好用，在查询方法</font><br />
<br />
<font face="Times New Roman">设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 Hibernate的Criteria 的用法进行总结：</font><br />
<font face="Times New Roman">&nbsp;&nbsp; Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口，下面提供了 Criteria和DetachedCriteria </font>。 <br />
&nbsp;&nbsp; Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样， Criteria 是在线的，所<br />
<font face="Times New Roman">以它是由 Hibernate Session 进行创建的；而 DetachedCriteria 是离线的，创建时无需 </font><br />
<font face="Times New Roman">Session，DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) </font><br />
<font face="Times New Roman">进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate</font><br />
<font face="Times New Roman">().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结</font><br />
</font><font size="4"><font face="Times New Roman">果。 <br />
&nbsp;&nbsp; Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设</font><br />
<font face="Times New Roman">置 FetchMode( 联合查询抓取的模式 ) ，设置排序方式。对于 Criteria 还可以设置 FlushModel </font><br />
<font face="Times New Roman">（冲刷 Session 的方式）和 LockMode （数据库锁模式）。 </font><br />
<font face="Times New Roman">下面对 Criterion 和 Projection 进行详细说明。</font><br />
<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来</font><br />
</font><font size="4"><font face="Times New Roman">添加查询条件。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Criterion 接口的主要实现包括： Example 、 Junction 和 SimpleExpression 。而 </font><br />
<font face="Times New Roman">Junction 的实际使用是它的两个子类 conjunction 和 disjunction ，分别是使用 AND 和 OR 操</font><br />
</font><font size="4"><font face="Times New Roman">作符进行来联结查询条件集合。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Criterion 的实例可以通过 Restrictions 工具类来创建，Restrictions 提供了大量的静态</font><br />
<font face="Times New Roman">方法，如 eq （等于）、 ge （大于等于）、 between 等来方法的创建 Criterion 查询条件 </font><br />
<font face="Times New Roman">（SimpleExpression 实例）。除此之外， Restrictions 还提供了方法来创建 conjunction 和 </font><br />
<font face="Times New Roman">disjunction 实例，通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合</font><br />
</font><font size="4"><font face="Times New Roman">。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 至于 Example 的创建有所不同， Example 本身提供了一个静态方法 create(Object </font><br />
<font face="Times New Roman">entity) ，即根据一个对象（实际使用中一般是映射到数据库的对象）来创建。然后可以设置一些</font><br />
</font><font size="4"><font face="Times New Roman">过滤条件： <br />
Example exampleUser =Example.create(u) <br />
.ignoreCase() // 忽略大小写 <br />
.enableLike(MatchMode.ANYWHERE); <br />
// 对 String 类型的属性，无论在那里值在那里都匹配。相当于 %value% </font><br />
<font face="Times New Roman">Project 主要是让 Criteria 能够进行报表查询，并可以实现分组。 Project 主要有 </font><br />
<font face="Times New Roman">SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 </font><br />
<font face="Times New Roman">ProjectionList 的实例化是由内建的 Projections 来完成，如提供的 avg 、 count 、 max 、 </font><br />
</font><font size="4"><font face="Times New Roman">min 、 sum 可以让开发者很容易对某个字段进行统计查询。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property 是对某个字段进行查询条件的设置，如通过Porperty.forName(&#8220;color&#8221;).in</font><br />
<font face="Times New Roman">(new String[]{&#8220;black&#8221;,&#8221;red&#8221;,&#8221;write&#8221;}); 则可以创建一个 Project 实例。通过 </font><br />
<font face="Times New Roman">criteria 的 add(Project) 方法加入到查询条件中去。 </font><br />
<font face="Times New Roman">&nbsp;&nbsp;&nbsp; 使用 Criteria 进行查询，主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查</font><br />
<font face="Times New Roman">询条件的创建和组装，下面介绍几种用法：</font><br />
</font><font size="4"><font face="Times New Roman">1. 创建一个Criteria 实例<br />
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。<br />
Criteria crit = sess.createCriteria(Cat.class);<br />
crit.setMaxResults(50);<br />
List cats = crit.list();<br />
<br />
2. 限制结果集内容<br />
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。</font><br />
<br />
</font><font size="4"><font face="Times New Roman">org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.between("weight", minWeight, maxWeight) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
</font><font size="4"><font face="Times New Roman">约束可以按逻辑分组。 <br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.or(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Restrictions.eq( "age", new Integer(0) ),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Restrictions.isNull("age")<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.isNull("age") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(0) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(1) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(2) ) )<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许</font><br />
<br />
</font><font size="4"><font face="Times New Roman">你直接使用SQL。<br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", </font><br />
<br />
</font><font size="4"><font face="Times New Roman">Hibernate.STRING) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
{alias}占位符应当被替换为被查询实体的列别名。 <br />
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个</font><br />
<br />
</font><font size="4"><font face="Times New Roman">Property。 <br />
<br />
Property age = Property.forName("age");<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.isNull() )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(0) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(1) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(2) ) )<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
3. 结果集排序<br />
你可以使用org.hibernate.criterion.Order来为查询结果排序。 <br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("name") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("age") )<br />
&nbsp;&nbsp;&nbsp; .setMaxResults(50)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("name").like("F%") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Property.forName("name").asc() )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Property.forName("age").desc() )<br />
&nbsp;&nbsp;&nbsp; .setMaxResults(50)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
4. 关联<br />
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。<br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .createCriteria("kittens")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
</font><font face="Times New Roman"><br />
<font size="4">注意第二个 createCriteria()返回一个新的 Criteria实例，该实例引用kittens 集合中的元素。 <br />
接下来，替换形态在某些情况下也是很有用的。<br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .createAlias("kittens", "kt")<br />
&nbsp;&nbsp;&nbsp; .createAlias("mate", "mt")<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eqProperty("kt.name", "mt.name") )<br />
&nbsp;&nbsp;&nbsp; .list();</font></font><br />
<br />
<font face="Times New Roman"><br />
<font size="4">(createAlias()并不创建一个新的 Criteria实例。) <br />
Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得</font></font><br />
<br />
<font size="4"><font face="Times New Roman">符合条件的kittens， 你必须使用returnMaps()。 <br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .createCriteria("kittens", "kt")<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("name", "F%") )<br />
&nbsp;&nbsp;&nbsp; .returnMaps()<br />
&nbsp;&nbsp;&nbsp; .list();<br />
Iterator iter = cats.iterator();<br />
while ( iter.hasNext() ) {<br />
&nbsp;&nbsp;&nbsp; Map map = (Map) iter.next();<br />
&nbsp;&nbsp;&nbsp; Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);<br />
&nbsp;&nbsp;&nbsp; Cat kitten = (Cat) map.get("kt");<br />
}</font><br />
<br />
</font><font size="4"><font face="Times New Roman">5. 动态关联抓取<br />
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 <br />
<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .setFetchMode("mate", FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp; .setFetchMode("kittens", FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
这个查询可以通过外连接抓取mate和kittens。<br />
<br />
6. 查询示例<br />
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。<br />
<br />
Cat cat = new Cat();<br />
cat.setSex('F');<br />
cat.setColor(Color.BLACK);<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Example.create(cat) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
</font><font face="Times New Roman"><br />
<font size="4">版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 <br />
可以自行调整Example使之更实用。 <br />
<br />
Example example = Example.create(cat)<br />
&nbsp;&nbsp;&nbsp; .excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //exclude zero valued properties<br />
&nbsp;&nbsp;&nbsp; .excludeProperty("color") //exclude the property named "color"<br />
&nbsp;&nbsp;&nbsp; .ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //perform case insensitive string comparisons<br />
&nbsp;&nbsp;&nbsp; .enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //use like for string comparisons<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add(example)<br />
&nbsp;&nbsp;&nbsp; .list();</font></font><br />
<br />
<font face="Times New Roman"><br />
<font size="4">甚至可以使用examples在关联对象上放置条件。<br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Example.create(cat) )<br />
&nbsp;&nbsp;&nbsp; .createCriteria("mate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Example.create( cat.getMate() ) )<br />
&nbsp;&nbsp;&nbsp; .list();</font></font><br />
<br />
<font face="Times New Roman"><br />
<font size="4">7. 投影(Projections)、聚合（aggregation）和分组（grouping）<br />
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 </font></font><br />
<br />
<font size="4"><font face="Times New Roman">setProjection()应用投影到一个查询。 <br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.rowCount() )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("color", Color.BLACK) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount() )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.avg("weight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.max("weight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.groupProperty("color") )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
</font></p>
<p><font face="Times New Roman"><br />
<font size="4">在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影，他</font></font><br />
<br />
<font size="4"><font face="Times New Roman">们也出现在SQL的group by子句中。 </font><br />
<br />
<font face="Times New Roman">可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的</font><br />
<br />
</font><font face="Times New Roman" size="4">实现方式：<br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("colr") )<br />
&nbsp;&nbsp;&nbsp; .list();</font></p>
<p><br />
&nbsp;</p>
<p><font size="4"><font face="Times New Roman">List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.groupProperty("color").as("colr") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("colr") )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之，</font><br />
<br />
</font><font size="4"><font face="Times New Roman">当你添加一个投影到一个投影列表中时 你可以为它指定一个别名： <br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount(), "catCountByColor" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.avg("weight"), "avgWeight" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.max("weight"), "maxWeight" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.groupProperty("color"), "color" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("avgWeight") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
</font><font face="Times New Roman"><br />
<font size="4">List results = session.createCriteria(Domestic.class, "cat")<br />
&nbsp;&nbsp;&nbsp; .createAlias("kittens", "kit")<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.property("cat.name"), "catName" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.property("kit.name"), "kitName" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("catName") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("kitName") )<br />
&nbsp;&nbsp;&nbsp; .list();</font></font><br />
<br />
<font face="Times New Roman"><br />
<font size="4">也可以使用Property.forName()来表示投影：<br />
<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("name") )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("color").eq(Color.BLACK) )<br />
&nbsp;&nbsp;&nbsp; .list();</font></font><br />
<font size="4"><font face="Times New Roman">List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount().as("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("weight").avg().as("avgWeight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("weight").max().as("maxWeight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("color").group().as("color" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("avgWeight") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
</font><font face="Times New Roman"><br />
<font size="4">8. 离线(detached)查询和子查询<br />
DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的 Session来</font></font><br />
<br />
<font size="4"><font face="Times New Roman">执行它。<br />
<br />
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("sex").eq('F') );<br />
//创建一个Session<br />
Session session = .;<br />
Transaction txn = session.beginTransaction();<br />
List results = query.getExecutableCriteria(session).setMaxResults(100).list();<br />
txn.commit();<br />
session.close();</font><br />
<br />
</font><font face="Times New Roman"><br />
<font size="4">DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者</font></font><br />
<font size="4"><font face="Times New Roman">Property获得。<br />
<br />
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight").avg() );<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("weight).gt(avgWeight) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
</font><font size="4"><font face="Times New Roman">DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight") );<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Subqueries.geAll("weight", weights) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
</font><font face="Times New Roman"><br />
<font size="4">相互关联的子查询也是有可能的：<br />
<br />
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight").avg() )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("cat2.sex").eqProperty("cat.sex") );<br />
session.createCriteria(Cat.class, "cat")<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("weight).gt(avgWeightForSex) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>如图</span> <span lang="EN-US">1</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>。</span> <span lang="EN-US">Hibernate</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>设计了</span> <span lang="EN-US">CriteriaSpecification</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>作为</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的顶级接口，其下面提供了</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>。</span> </p>
<p><span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的主要区别在于创建的形式不一样，</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>是在线的，所以它是由</span> <span lang="EN-US">Hibernate Session</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>进行创建的；而</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>是离线的，创建时无需</span> <span lang="EN-US">Session</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>，</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>提供了</span> <span lang="EN-US">4</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>个静态方法</span> <span lang="EN-US">forClass(Class)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>或</span> <span lang="EN-US">forEntityName(Name)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>进行</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>实例的创建。</span> <span lang="EN-US">Spring</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的框架提供了</span> </p>
<p><span lang="EN-US">getHibernateTemplate().findByCriteria(detachedCriteria)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>方法可以很方便地根据</span> </p>
<p><span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>来返回查询结果。</span> </p>
<p><span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>如图</span> <span lang="EN-US">1</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>，</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">DetachedCriteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>均可使用</span> <span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">Projection</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>设置查询条件。可以设置</span> <span lang="EN-US">FetchMode(</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>联合查询抓取的模式</span> <span lang="EN-US">)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>，设置排序方式。对于</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>还可以设置</span> <span lang="EN-US">FlushModel</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>（冲刷</span> <span lang="EN-US">Session</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的方式）和</span> <span lang="EN-US">LockMode</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>（数据库锁模式）。</span> </p>
<p><span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>下面就对</span> <span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">Projection</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>进行详细说明。</span></p>
<img height="489" alt="" src="http://www.blogjava.net/images/blogjava_net/103335460/20060810151147914.gif" width="643" border="0" /><br />
<br />
&nbsp; Criterion <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>是</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的查询条件。</span>
<p><span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>提供了</span> <span lang="EN-US">add(Criterion criterion)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>方法来添加查询条件。图</span> <span lang="EN-US">2</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>是</span> <span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的结构图。</span> <span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>接口的主要实现包括：</span> <span lang="EN-US">Example</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">Junction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">SimpleExpression</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>。而</span> <span lang="EN-US">Junction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的实际使用是它的两个子类</span> <span lang="EN-US">conjunction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">disjunction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>，分别是使用</span> <span lang="EN-US">AND</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">OR</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>操作符进行来联结查询条件集合。</span> </p>
<p><span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的实例可以通过</span> <span lang="EN-US">Restrictions</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>工具类来创建，</span> <span lang="EN-US">Restrictions</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>提供了大量的静态方法，如</span> <span lang="EN-US">eq</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>（等于）、</span> <span lang="EN-US">ge</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>（大于等于）、</span> <span lang="EN-US">between</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>等来方法的创建</span> <span lang="EN-US">Criterion</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>查询条件</span> </p>
<p><span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>（</span> <span lang="EN-US">SimpleExpression</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>实例）。除此之外，</span> <span lang="EN-US">Restrictions</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>还提供了方法来创建</span> <span lang="EN-US">conjunction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">disjunction</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>实例，通过往该实例的</span> <span lang="EN-US">add(Criteria)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>方法来增加查询条件形成一个查询条件集合。</span> </p>
<p><span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>至于</span> <span lang="EN-US">Example</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的创建有所不同，</span> <span lang="EN-US">Example</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>本身提供了一个静态方法</span> <span lang="EN-US">create(Object entity)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>，即根据一个对象（实际使用中一般是映射到数据库的对象）来创建。然后可以设置一些过滤条件：</span> </p>
<p><span lang="EN-US">Example exampleUser =Example.create(u)</span> </p>
<p><span lang="EN-US">.ignoreCase() //</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>忽略大小写</span> </p>
<p><span lang="EN-US">.enableLike(MatchMode.ANYWHERE);</span> </p>
<p><span lang="EN-US">//</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>对</span> <span lang="EN-US">String</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>类型的属性，无论在那里值在那里都匹配。相当于</span> <span lang="EN-US">%value%</span> </p>
<img height="295" alt="" src="http://www.blogjava.net/images/blogjava_net/103335460/20060810151205930.gif" width="643" border="0" /><br />
<p>&nbsp;
<p><span lang="EN-US">Project </span><span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>主要是让</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>能够进行报表查询，并可以实现分组。</span> <span lang="EN-US">Project</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>主要有</span> <span lang="EN-US">SimpleProjection</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">ProjectionList</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">Property</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>三个实现。其中</span> <span lang="EN-US">SimpleProjection</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>和</span> <span lang="EN-US">ProjectionList</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的实例化是由内建的</span> <span lang="EN-US">Projections</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>来完成，如提供的</span> <span lang="EN-US">avg</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">count</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">max</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">min</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>、</span> <span lang="EN-US">sum</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>可以让开发者很容易对某个字段进行统计查询。</span> </p>
<p><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Property</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>是对某个字段进行查询条件的设置，如通过</span> </p>
<p><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Porperty.forName(&#8220;color&#8221;).in(new String[]);</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>则可以创建一个</span> <span lang="EN-US">Project</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>实例。通过</span> <span lang="EN-US">criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>的</span> <span lang="EN-US">add(Project)</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>方法加入到查询条件中去。</span> <br />
<img height="330" alt="" src="http://www.blogjava.net/images/blogjava_net/103335460/20060810151219743.gif" width="643" border="0" /><br />
<span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>使用</span> <span lang="EN-US">Criteria</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>进行查询，主要要清晰的是</span> <span lang="EN-US">Hibernate</span> <span style="font-family: 宋体; mso-ascii-font-family: "  Times Roman?; mso-hansi-font-family: ?Times New Roman??>提供了那些类和方法来满足开发中查询条件的创建和组装，其结构层次如何。这样使用起来便可得心应手。</span></p>
</font></font>
<img src ="http://www.blogjava.net/103335460/aggbug/260141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2009-03-17 01:20 <a href="http://www.blogjava.net/103335460/articles/260141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用XFire编写web service的上传文件的例子</title><link>http://www.blogjava.net/103335460/articles/229366.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Wed, 17 Sep 2008 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/229366.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/229366.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/229366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/229366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/229366.html</trackback:ping><description><![CDATA[<p style="font-size: 12pt"><span style="font-size: 12pt; font-family: 宋体">运行环境：jdk1.5.0_11 + Tomcat5.5 </span>+ <span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">XFire-1.2.6<br />
编译工具：MyEclipse 5.5.1 GA&nbsp; &nbsp;( + Eclipse 3.2.2)<br />
操作系统：Wiindows XP 番茄花园版<br />
<br />
<strong>概述</strong>：利用<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">xfire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">生成</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">服务客户端的方法有多种，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Eclipse Plugin</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">为</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">WSDL-&gt;Code generator</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">提供了</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">支持，它需要</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Eclipse 3.2</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">和</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Java 5</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">。这里我们用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Eclipse Plugin</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">根据</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">wsdl</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">文件地址生成客户端代码，而我们只需要编写几行代码即可实现调用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">服务。</span><br />
<br />
<span style="color: #000000"><strong>一、安装XFire插件</strong></span><span style="color: red"><br />
<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开MyEclipse中的Help-----&gt;&#8221;Software Updates&#8221;-----&gt;&#8221;Find and Install.&#8221;-----&gt;"Search for new features to install"，然后点击Next，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击"New Remote Site..."， 在Name中输入&#8220;XFire1.2.6&#8221;，在URL中输入&#8220;<a href="http://dist.codehaus.org/xfire/update/">http://dist.codehaus.org/xfire/update/</a>&#8221;后，点击&#8220;OK&#8221; ，点击Finish。<br />
&nbsp;&nbsp;&nbsp; 注意完成上述操作后，eclipse要下载和安装插件，时间长短要视网速而定，请耐心等待，安装完成时还要重启eclipse。<br />
<br />
<strong>二、编写服务端<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>1、创建服务端项目</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开MyEclipse中File-----&gt;New----&gt;Project，选择Web Service Project，点击Next，Project Name为Web_Server，点击Next，保持默认设置不变，继续点击Next，在Project Library Configuration（Add MyEclipse XFire and User libraries to project）界面里，选择相应的Libraries。勾选了Xfire1.2 Core Libraries、HTTP Client Libraries、XML Beans Libraries ，点击&#8220;Finish&#8221;完成了项目创建。目录结构如下所示：<br />
Web_Server<br />
&nbsp;&nbsp;&nbsp;&nbsp;src<br />
&nbsp;&nbsp;&nbsp;&nbsp;JRE System Library<br />
&nbsp;&nbsp;&nbsp;&nbsp;J2EE 1.4 Libraries<br />
&nbsp;&nbsp;&nbsp;&nbsp;XFire 1.2 Core Libraries<br />
&nbsp;&nbsp;&nbsp;&nbsp;XFire 1.2 HTTP Client Libraries<br />
&nbsp;&nbsp;&nbsp;&nbsp;XFire 1.2 XML Beans Libraries&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;WebRoot<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;META-INF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;WebServices<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;services.xml<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;打开web.xml文件，可以看到如下片断：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、<strong>编写提供服务的业务类</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在com.server.service（Package）里，新建两个java类，一个是IFileUploadUtil，另一个是FileUploadUtil。其中IFileUploadUtil是interface，内有一个fileUpload的抽象方法，而FileUploadUtil则是IFileUploadUtil接口的实现类。代码如下</p>
<p>package com.server.service;</p>
<p>public interface IFileUploadUtil {</p>
<p>&nbsp;/**<br />
&nbsp; * 文件上传<br />
&nbsp; * @param fileByteBuf&nbsp; 要上传的文件的字节流<br />
&nbsp; * @param strRoot 上传目的地路径<br />
&nbsp; * @param fileName 自定义文件名<br />
&nbsp; * @return 上传成功则返回"ok",否则则返回"err:****"错误信息<br />
&nbsp; */<br />
&nbsp;public abstract String fileUpload(byte[] fileByteBuf,String strRoot,String fileName);<br />
}<br />
<br />
<br />
</p>
<p>package com.server.service;</p>
<p>import java.io.BufferedInputStream;<br />
import java.io.BufferedOutputStream;<br />
import java.io.ByteArrayInputStream;<br />
import java.io.File;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import java.io.OutputStream;</p>
<p>public class FileUploadUtil implements IFileUploadUtil {</p>
<p>&nbsp;public String fileUpload(byte[] fileByteBuf, String strRoot, String fileName) {<br />
//&nbsp;&nbsp;验证文件字节数组是否为空<br />
&nbsp;&nbsp;if (fileByteBuf == null || fileByteBuf.length == 0)<br />
&nbsp;&nbsp;&nbsp;return "err：上传文件的字节数组为空!";<br />
&nbsp;&nbsp;//验证上传目的地路径是否存在<br />
&nbsp;&nbsp;if (strRoot == null || strRoot == "")<br />
&nbsp;&nbsp;&nbsp;return "err：上传目的地路径为空!";<br />
&nbsp;&nbsp;//验证指定的文件名是否为空<br />
&nbsp;&nbsp;if (fileName == null || fileName== "")<br />
&nbsp;&nbsp;&nbsp;return "err：指定的文件名为空!";<br />
&nbsp;&nbsp;if (fileName.lastIndexOf(".") == -1)<br />
&nbsp;&nbsp;&nbsp;return "err：指定的文件名无后缀名!";<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 声明四种I/O流<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;ByteArrayInputStream fInStream = null;// 文件输入流<br />
&nbsp;&nbsp;BufferedInputStream bInStream = null;// 输入缓冲流<br />
&nbsp;&nbsp;OutputStream fOutStream = null;// 输出流<br />
&nbsp;&nbsp;BufferedOutputStream bOutStream = null;// 输出缓冲流<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * 赋值<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;//得到字节数组输入流<br />
&nbsp;&nbsp;&nbsp;fInStream = new ByteArrayInputStream(fileByteBuf);<br />
&nbsp;&nbsp;&nbsp;//得到输入缓冲流<br />
&nbsp;&nbsp;&nbsp;bInStream = new BufferedInputStream(fInStream);</p>
<p>&nbsp;&nbsp;&nbsp;//判断上传的目的地路径是否是目录，不是则新建目录<br />
&nbsp;&nbsp;&nbsp;File folderSave = new File(strRoot);<br />
&nbsp;&nbsp;&nbsp;if (!folderSave.isDirectory())<br />
&nbsp;&nbsp;&nbsp;&nbsp;folderSave.mkdirs();<br />
&nbsp;&nbsp;&nbsp;//验证目标文件<br />
&nbsp;&nbsp;&nbsp;File fileSave = new File(strRoot + "/" + fileName);<br />
&nbsp;&nbsp;&nbsp;if (fileSave.exists()){//当此抽象路径名表示的文件存在时<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!fileSave.canWrite())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "err：文件不可写入!";<br />
&nbsp;&nbsp;&nbsp;}else if (!fileSave.createNewFile())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "err：文件不能新建!";<br />
&nbsp;&nbsp;&nbsp;//得到输出流<br />
&nbsp;&nbsp;&nbsp;fOutStream = new FileOutputStream(fileSave);<br />
&nbsp;&nbsp;&nbsp;//得到输出缓冲流<br />
&nbsp;&nbsp;&nbsp;bOutStream = new BufferedOutputStream(fOutStream);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * 循环<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;int intByte = 512 * 1024;//缓冲区大小<br />
&nbsp;&nbsp;&nbsp;byte[] fileData = new byte[intByte];//定义一个缓冲区<br />
&nbsp;&nbsp;&nbsp;int intIndex = 0;<br />
&nbsp;&nbsp;&nbsp;while ((intIndex = bInStream.read(fileData, 0, intByte)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;bOutStream.write(fileData, 0, intIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;bOutStream.flush();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;folderSave = null;<br />
&nbsp;&nbsp;&nbsp;fileSave = null;<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;return ("err：" + e.getMessage());<br />
&nbsp;&nbsp;} finally{<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * 用完后，关闭I/O流<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (fInStream != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInStream.close();//关闭方法无效？！！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInStream = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (bInStream != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bInStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bInStream = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (fOutStream != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fOutStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fOutStream = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (bOutStream != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bOutStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bOutStream = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return ("err：" + e.getMessage());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return "ok";<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>3、配置services.xml</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的代码如下：<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;service&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FileUpload&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;namespace&gt;server&lt;/namespace&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;serviceClass&gt;com.server.service.IFileUploadUtil&lt;/serviceClass&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;implementationClass&gt;com.server.service.FileUploadUtil&lt;/implementationClass&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;wrapped&lt;/style&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;use&gt;literal&lt;/use&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;scope&gt;application&lt;/scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/service&gt;<br />
&lt;/beans&gt;<br />
</p>
<p><span class="hilite2">Web</span> <span class="hilite3">Service</span>s的定义包含在元素中，它还含有一些子元素。</p>
<p>第一个子元素（name）是<name></name>FileUpload，它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如，在服务准备好以后，你将在浏览器上使用这个名字来查看WSDL。</p>
<p><font face="Verdana">下一个子元素（<font face="Verdana">namespace</font>）是<namespace></namespace>任何合法的XML名字都是可以的。<namespace></namespace>用来唯一标识你的服务的各个参数。（注释@）</font></p>
<p><font face="Verdana"><em>注释@：Namespace派什么用？namespace的作用是要避免命名冲突。如果我建立一项<span class="hilite2">Web</span> <br />
<span class="hilite3">Service</span>，其中的WSDL文件包含一个名为"foo"的元素，而你想要使用我的服务与另一项服务连接作为补充，这样的话另一项服务的WSDL文件就不能包含名为"foo"的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时，才可以取相同的名字。如果有了表示区别的namespace，我的网络服务里的"foo"就可以表示完全不同于另一个网络服务里"foo"的含义。在你的客户端里，你只要加以限制就可以引用我的"foo"。<br />
</em></font><font face="Verdana"><br />
<serviceclass></serviceclass>serviceClass元素包含了Java类的名字，它指定了方法签名。在我们的例子中，它是接口IFileUploadUtil。如果Java类没有实现任何接口，你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为<span class="hilite2">Web</span> <span class="hilite3">Service</span>s。<br />
<br />
implementationClass</font><a><font face="Verdana">保存了实现方法的Java类名。这是一个可选元素。如果上一个元素<serviceclass></serviceclass>包含了一个接口，那么相应的实现类必须在这里指定。</font></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4<strong>、测试服务是否正常</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发布项目Web_Server到Tomcat5.5中，启动Tomcat5.5，查看地址是：<a href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl">http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl</a>，可看到如下信息：<br />
<span class="m">&lt;?</span><span class="pi">xml version="1.0" encoding="UTF-8" </span><span class="m">?&gt;</span> </p>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:definitions</span><span class="t"> targetNamespace</span><span class="m">="</span><strong>server</strong><span class="m">"</span><span class="ns"> xmlns:tns</span><span class="m">="</span><strong class="ns">server</strong><span class="m">"</span><span class="ns"> xmlns:wsdlsoap</span><span class="m">="</span><strong class="ns">http://schemas.xmlsoap.org/wsdl/soap/</strong><span class="m">"</span><span class="ns"> xmlns:soap12</span><span class="m">="</span><strong class="ns">http://www.w3.org/2003/05/soap-envelope</strong><span class="m">"</span><span class="ns"> xmlns:xsd</span><span class="m">="</span><strong class="ns">http://www.w3.org/2001/XMLSchema</strong><span class="m">"</span><span class="ns"> xmlns:soapenc11</span><span class="m">="</span><strong class="ns">http://schemas.xmlsoap.org/soap/encoding/</strong><span class="m">"</span><span class="ns"> xmlns:soapenc12</span><span class="m">="</span><strong class="ns">http://www.w3.org/2003/05/soap-encoding</strong><span class="m">"</span><span class="ns"> xmlns:soap11</span><span class="m">="</span><strong class="ns">http://schemas.xmlsoap.org/soap/envelope/</strong><span class="m">"</span><span class="ns"> xmlns:wsdl</span><span class="m">="</span><strong class="ns">http://schemas.xmlsoap.org/wsdl/</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:types</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:schema</span><span class="ns"> xmlns:xsd</span><span class="m">="</span><strong class="ns">http://www.w3.org/2001/XMLSchema</strong><span class="m">"</span><span class="t"> attributeFormDefault</span><span class="m">="</span><strong>qualified</strong><span class="m">"</span><span class="t"> elementFormDefault</span><span class="m">="</span><strong>qualified</strong><span class="m">"</span><span class="t"> targetNamespace</span><span class="m">="</span><strong>server</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:element</span><span class="t"> name</span><span class="m">="</span><strong>fileUpload</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:complexType</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:sequence</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">xsd:element</span> <span class="t">maxOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> minOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> name</span><span class="m">="</span><strong>in0</strong><span class="m">"</span><span class="t"> nillable</span><span class="m">="</span><strong>true</strong><span class="m">"</span><span class="t"> type</span><span class="m">="</span><strong>xsd:base64Binary</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">xsd:element</span> <span class="t">maxOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> minOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> name</span><span class="m">="</span><strong>in1</strong><span class="m">"</span><span class="t"> nillable</span><span class="m">="</span><strong>true</strong><span class="m">"</span><span class="t"> type</span><span class="m">="</span><strong>xsd:string</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">xsd:element</span> <span class="t">maxOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> minOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> name</span><span class="m">="</span><strong>in2</strong><span class="m">"</span><span class="t"> nillable</span><span class="m">="</span><strong>true</strong><span class="m">"</span><span class="t"> type</span><span class="m">="</span><strong>xsd:string</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:sequence</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:complexType</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:element</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:element</span><span class="t"> name</span><span class="m">="</span><strong>fileUploadResponse</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:complexType</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">xsd:sequence</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">xsd:element</span> <span class="t">maxOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> minOccurs</span><span class="m">="</span><strong>1</strong><span class="m">"</span><span class="t"> name</span><span class="m">="</span><strong>out</strong><span class="m">"</span><span class="t"> nillable</span><span class="m">="</span><strong>true</strong><span class="m">"</span><span class="t"> type</span><span class="m">="</span><strong>xsd:string</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:sequence</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:complexType</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:element</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">xsd:schema</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:types</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:message</span><span class="t"> name</span><span class="m">="</span><strong>fileUploadResponse</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdl:part</span> <span class="t">name</span><span class="m">="</span><strong>parameters</strong><span class="m">"</span><span class="t"> element</span><span class="m">="</span><strong>tns:fileUploadResponse</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:message</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:message</span><span class="t"> name</span><span class="m">="</span><strong>fileUploadRequest</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdl:part</span> <span class="t">name</span><span class="m">="</span><strong>parameters</strong><span class="m">"</span><span class="t"> element</span><span class="m">="</span><strong>tns:fileUpload</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:message</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:portType</span><span class="t"> name</span><span class="m">="</span><strong>FileUploadPortType</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:operation</span><span class="t"> name</span><span class="m">="</span><strong>fileUpload</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdl:input</span> <span class="t">name</span><span class="m">="</span><strong>fileUploadRequest</strong><span class="m">"</span><span class="t"> message</span><span class="m">="</span><strong>tns:fileUploadRequest</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdl:output</span> <span class="t">name</span><span class="m">="</span><strong>fileUploadResponse</strong><span class="m">"</span><span class="t"> message</span><span class="m">="</span><strong>tns:fileUploadResponse</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:operation</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:portType</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:binding</span><span class="t"> name</span><span class="m">="</span><strong>FileUploadHttpBinding</strong><span class="m">"</span><span class="t"> type</span><span class="m">="</span><strong>tns:FileUploadPortType</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdlsoap:binding</span> <span class="t">style</span><span class="m">="</span><strong>document</strong><span class="m">"</span><span class="t"> transport</span><span class="m">="</span><strong>http://schemas.xmlsoap.org/soap/http</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:operation</span><span class="t"> name</span><span class="m">="</span><strong>fileUpload</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdlsoap:operation</span> <span class="t">soapAction</span><span class="m">="</span><strong></strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:input</span><span class="t"> name</span><span class="m">="</span><strong>fileUploadRequest</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdlsoap:body</span> <span class="t">use</span><span class="m">="</span><strong>literal</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:input</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:output</span><span class="t"> name</span><span class="m">="</span><strong>fileUploadResponse</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdlsoap:body</span> <span class="t">use</span><span class="m">="</span><strong>literal</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:output</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:operation</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:binding</span><span class="m">&gt;</span></div>
</div>
</div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:service</span><span class="t"> name</span><span class="m">="</span><strong>FileUpload</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div class="c" style="margin-left: 1em; text-indent: -2em"><a class="b" onfocus="h()" onclick="return false" href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl#">-</a> <span class="m">&lt;</span><span class="t">wsdl:port</span><span class="t"> name</span><span class="m">="</span><strong>FileUploadHttpPort</strong><span class="m">"</span><span class="t"> binding</span><span class="m">="</span><strong>tns:FileUploadHttpBinding</strong><span class="m">"</span><span class="m">&gt;</span></div>
<div>
<div class="e">
<div style="margin-left: 1em; text-indent: -2em"><span class="b">&nbsp;</span> <span class="m">&lt;</span><span class="t">wsdlsoap:address</span> <span class="t">location</span><span class="m">="</span><strong>http://127.0.0.1:8080/Web_Server/services/FileUpload</strong><span class="m">"</span><span class="m"> /&gt;</span> </div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:port</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:service</span><span class="m">&gt;</span></div>
</div>
</div>
<div><span class="b">&nbsp;</span> <span class="m">&lt;/</span><span class="t">wsdl:definitions</span><span class="m">&gt;</span></div>
</div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个XML文档叫做服务的WSDL。如果你看到了，这就是你的应用作为<span class="hilite2">Web</span> <span class="hilite3">Service</span>已经可用的第一个证明。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是这个测试是不够的。可能会发生这种情况，可以看到WSDL，但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了，我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<strong>三、编写客户端<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到此为止，服务端已经编好了，我们现在来编写一个Web Project来作客户端。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>1、创建Web Project</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开MyEclipse中File-----&gt;New----&gt;Project，选择（Java）Web Project，点击Next，Project Name为Web_Client，建名为com.client.service的Package。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;2、自动生成web serives客户端</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择菜单<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">File-----&gt;New-----&gt;Other </span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">，选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">文件夹下的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Code generation from WSDL document</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">，点击&#8220;Next&#8221;，显示&#8220;WSDL 2 Java Code generator with XFire&#8221;界面，<br />
&nbsp;&nbsp;&nbsp;&nbsp;在WSDL URL or path处填写&#8220;<a href="http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl">http://127.0.0.1:8080/Web_Server/services/FileUpload?wsdl</a>&#8221;（注意此时，服务端项目确保还在Tomcate5.5中跑），<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Output directory处选择&#8220;/Web_Client/src&#8221;，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Package处则选择com.client.service，<br />
&nbsp;&nbsp;&nbsp;&nbsp;点击&#8220;Finish&#8221;即可。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;3、添加XFire类库</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时，在调用服务之前，还有一个重要的步骤，从<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Web_Client</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">项目的右键菜单里调出</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Properties</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">配置窗口，选中左面一栏中的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">项，右面会列出所有与</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos">运行有关的类库。我们在原有类库基础上再勾选第一个类库（Commons Codec）和第六个类库（Commons HttpClient），点&#8220;OK&#8221;完成操作。</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;4、编写调用上传服务的JSP文件</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于我们使用commons-fileupload（-1.1）组件来进行操作，所以需要向项目<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ; mso-fareast-font-family: 宋体">Web_Client</span>中导入commons-fileupload-1.1.jar和commons-io-1.1.jar。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上传JSP名称为index.jsp，代码如下：<br />
</p>
<p>&lt;%@page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%&gt;<br />
&lt;%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%&gt;<br />
&lt;%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br />
&lt;%@page import="org.apache.commons.fileupload.FileUploadException"%&gt;<br />
&lt;%@page import="org.apache.commons.fileupload.FileItemFactory"%&gt;<br />
&lt;%@page import="org.apache.commons.fileupload.FileItem"%&gt;<br />
&lt;%@page import="java.util.List"%&gt;<br />
&lt;%@page import="com.client.service.FileUploadClient"%&gt;<br />
&lt;%@page import="com.client.service.FileUploadPortType"%&gt;<br />
&lt;%<br />
String path = request.getContextPath();<br />
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";<br />
%&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;base href="&lt;%=basePath%&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;上传文件&lt;/title&gt;<br />
&nbsp;&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="expires" content="0"&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />
&nbsp;&lt;meta http-equiv="description" content="This is my page"&gt;<br />
&nbsp;&lt;!--<br />
&nbsp;&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />
&nbsp;--&gt;<br />
&nbsp; &lt;/head&gt;</p>
<p>&nbsp; &lt;body&gt;<br />
&nbsp; &lt;% <br />
&nbsp; &nbsp;try {<br />
&nbsp; &nbsp;&nbsp;//得到上传文件转化的字节数组<br />
&nbsp; &nbsp;&nbsp;FileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----1------");<br />
&nbsp; &nbsp;&nbsp;ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----2------");<br />
&nbsp; &nbsp;&nbsp;List fileItems = upload.parseRequest(request);<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----3------");<br />
&nbsp; &nbsp;&nbsp;FileItem item = (FileItem)fileItems.get(0);<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----4------");<br />
&nbsp; &nbsp;&nbsp;byte[] fileBytes = item.get();<br />
&nbsp; &nbsp;&nbsp;System.out.println("上传的文件名：" + item.getName());<br />
&nbsp; &nbsp;&nbsp;System.out.println("原始文件名称：" + item.getName().substring(item.getName().lastIndexOf("\\") + 1));<br />
&nbsp; &nbsp;&nbsp;System.out.println("文件MINI类型：" + item.getContentType());<br />
&nbsp;&nbsp;System.out.println("文件大小：" + item.getSize());<br />
&nbsp;&nbsp;System.out.println("字节长度：=" + fileBytes.length);<br />
&nbsp; &nbsp;&nbsp;System.out.println("item.getFieldName：" + item.getFieldName());<br />
&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp;//调用web service的上传方法<br />
&nbsp; &nbsp;&nbsp;FileUploadClient client = new FileUploadClient();<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----2--1------");<br />
&nbsp; &nbsp;&nbsp;FileUploadPortType port = client.getFileUploadHttpPort();<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----2--2------");<br />
&nbsp; &nbsp;&nbsp;//参数：文件的字节数组，上传目的地路径，文件名称<br />
&nbsp; &nbsp;&nbsp;String returnValue = port.fileUpload(fileBytes,"E:\\temp",item.getName().substring(item.getName().lastIndexOf("\\") + 1));<br />
&nbsp; &nbsp;&nbsp;System.out.println("-----2--3------");<br />
&nbsp; &nbsp;&nbsp;//打印返回值<br />
&nbsp; &nbsp;&nbsp;System.out.println("returnValue = " + returnValue);<br />
&nbsp; &nbsp;}catch (FileUploadException e){<br />
&nbsp; &nbsp;&nbsp;e.printStackTrace();<br />
&nbsp; &nbsp;&nbsp;//打印该块代码中的异常<br />
&nbsp; &nbsp;&nbsp;System.out.println(e.getMessage());<br />
&nbsp; &nbsp;}<br />
&nbsp; <br />
&nbsp; %&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form name="upload" action="" method="post" enctype="multipart/form-data"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;table align="center"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;tr&gt;&lt;td align="center"&gt;上传文件&lt;/td&gt;&lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;tr&gt;&lt;td&gt;&lt;input type="file" name="file"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;tr&gt;&lt;td&gt;&lt;input type="submit" name="go" value="提交"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/table&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>5、运行测试客户端</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发布项目Web_Client到Tomcate5.5中，启动Tomcate5.5后，注意：客户端和服务端项目都要跑起来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开<a href="http://127.0.0.1:8080/Web_Client/">http://127.0.0.1:8080/Web_Client/</a>&nbsp; ，进入上传页面，选择一个文件上传，如我上传的是xfire-distribution-1.2.6-sources.jar。上传成功后，在控制台上打印如下信息：<br />
-----1------<br />
-----2------<br />
-----3------<br />
-----4------<br />
上传的文件名：c:\documents and settings\zy20022630\桌面\xfire-distribution-1.2.6-sources.jar<br />
原始文件名称：xfire-distribution-1.2.6-sources.jar<br />
文件MINI类型：application/x-zip-compressed<br />
文件大小：544149<br />
字节长度：=544149<br />
item.getFieldName：file<br />
-----2--1------<br />
-----2--2------<br />
-----2--3------<br />
returnValue = ok<br />
<br />
上述信息表示上传成功，在服务端项目所在的主机里相应位置（E:\\temp）可看到上传的文件。<br />
<br />
到此已全部完成XFire生成和调用web service服务的操作！！！<br />
</span></span></span></p>
 <img src ="http://www.blogjava.net/103335460/aggbug/229366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-17 11:05 <a href="http://www.blogjava.net/103335460/articles/229366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mule介绍（转）</title><link>http://www.blogjava.net/103335460/articles/227993.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227993.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227993.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227993.html</trackback:ping><description><![CDATA[Mule是一个企业服务总线(ESB)消息框架.它的主要特性包括:<br />
1.基于J2EE1.4的企业消息总线(ESB)和消息代理(broker).<br />
2.可插入的连接性:比如Jms,jdbc,tcp,udp,multicast,http,servlet,smtp,pop3, file,xmpp等.<br />
3.支持任何传输之上的异步，同步和请求响应事件处理机制.<br />
4.支持Axis或者Glue的Web Service. <br />
5.灵活的部署结构[Topologies]包括Client/Server, P2P, ESB 和Enterprise Service Network. <br />
6.与Spring 框架集成:可用作ESB 容器，也可以很容易的嵌入到Spring应用中.<br />
7.使用基于SEDA处理模型的高度可伸缩的企业服务器.<br />
8.强大的基于EIP模式的事件路由机制等.<br />
Mule发布最新版本1.1，这个发布包括集成了<a title="JBI" href="http://mule.codehaus.org/JBI">JBI</a>，对 <a title="BPEL" href="http://mule.codehaus.org/BPEL"><strong><font color="#008800">BPEL</font></strong></a>的支持,还增加一些新的传输器(transport)Quartz,FTP,RMI与EJB等。 <br />
<br />
<h2><a name="Mule-%E4%B8%80%E3%80%81%E6%80%BB%E8%BF%B0%26nbsp%3B%26nbsp%3B"></a>一、总述&nbsp;&nbsp;</h2>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/" rel="nofollow">Mule Homepage<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mulesource.org/display/MULE2INTRO/Overview" rel="nofollow">Mule2.0 Overview<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>
    <li><a title="Mule1.4" href="http://wiki.springside.org.cn/display/calvin/Mule1.4">Mule1.4 时代的旧笔记</a> </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mule的运作能力也许是它在开源ESB中最大的优势：商业的支持公司<span class="nobr"><a title="Visit page outside Confluence" href="http://www.mulesource.com/" rel="nofollow">Mulesource.com<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>，给大家贡献代码的<span class="nobr"><a title="Visit page outside Confluence" href="http://www.muleforge.org/" rel="nofollow">MuleForge.org<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>，年度大会MuleConf，还挖来了CXF的作者与SaleForces的CXO......</p>
<h2><a name="Mule-%E4%BA%8C%E3%80%81%E7%A4%BA%E4%BE%8B"></a>二、示例</h2>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2INTRO/LoanBroker" rel="nofollow">LoanBroker<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>&nbsp;EAI界经典例子，有ESB(JMS MessageBus)、ESN（WebService同步/异步)，JBPM工作流等模式。
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://java.dzone.com/print/3172" rel="nofollow">Pattern Based Development with Mule 2.0<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> 《Open-Source ESBs in Action》作者
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://dist.muleforge.org/mule-transport-cxf/Mule%20and%20CXF.ppt" rel="nofollow">CXF and Mule ppt<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> CXF 作者 (for 1.4)
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://www.infoq.com/articles/SEDA-Mule" rel="nofollow">Using SEDA to Ensure Service Availability(InfoQ)<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> (for 1.4) </li>
</ul>
<h2><a name="Mule-%E4%B8%89%E3%80%81Mule%E7%9A%84%E5%8A%9F%E8%83%BD"></a>三、Mule的功能</h2>
<h3><a name="Mule-1.%26nbsp%3B%E9%87%8D%E6%B8%A9ESB%E7%9A%84%E5%8A%9F%E8%83%BD"></a>1.&nbsp; 重温ESB的功能</h3>
<ul>
    <li><strong>解耦中介</strong>：客户对实际服务提供者的身份、物理位置、传输协议和接口定义都是不知道也不关心的，交互集成代码提取到了业务逻辑之外，由ESB平台进行中央的宣告式定义。<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB平台实现<strong>协议转换</strong>(WebService，Http，JMS...)，<strong>消息转换</strong>(转换、充实、过滤)，<strong>消息路由</strong>(同步/异步、发布/订阅、基于内容路由、分支与聚合...)。<strong>&nbsp;</strong>
    <li><strong>服务中介</strong>：ESB平台作为中介提供服务交互中的基础服务。<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB平台实现<strong>SLA</strong>(可靠性保证，负载均衡，流量控制，缓存，事务控制，加密传输)，<strong>服务管理监控</strong>(异常处理，服务调用及消息数据记录，系统及服务的状态监控，ESB配置管理)，<strong>统一安全管理</strong>(这个有点理想主义)<strong>。</strong>
    <li><strong>服务编排</strong>：多个服务进行编排形成新的服务。<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB支持一个直观的形式定义新组合服务的流程(工作流、BPEL 或 代码级编排)。 </li>
</ul>
<h3><a name="Mule-2.Mule%E7%9A%84%E8%A7%A3%E8%80%A6%E4%B8%AD%E4%BB%8B"></a>2. Mule的解耦中介</h3>
<p>&nbsp;&nbsp;&nbsp; Pluggable的传输层，路由器，转换器是所有ESB必然支持的核心功能，作为<a title="EIP" href="http://wiki.springside.org.cn/display/calvin/EIP">《Enterprise Intergration Patterns》</a>的遵循者提供如下：</p>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULEUSER/Transports+Guide" rel="nofollow">Transport<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>：WebService、JMS等常用的协议都已满足，IBM MQ在企业版中提供，只缺Weblogic Tuxedo了。
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Using+Message+Routers" rel="nofollow">Router<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>/<span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Using+Filters" rel="nofollow">Filter<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>:提供<a title="EIP" href="http://wiki.springside.org.cn/display/calvin/EIP">EIP</a>中描述的路由<br />
    1.基于内容路由，Fillter提供消息类型、消息属性、JXPath和OGNL表达式的基础过滤能力。另有去除重复消息的Router。<br />
    2.接收表基类，由用户自行实现。<br />
    3.分拆聚合重排路由。<br />
    4.流程编排路由见后。
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Using+Transformers" rel="nofollow">Transformer<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>：提供基础层次上的的协议类型转换、XML&lt;-&gt;Java转换、编码、压缩、加密转换。业务级转换由用户实现。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过，1.4版中的Transport的实现质量很一般，而Router、Filter、Transformer都实现得较简单和基础，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，Mule额外提供了POJO的编程模型，而不是痛苦的XQuery Base的XML消息。</p>
<h3><a name="Mule-3.Mule%E7%9A%84%E6%9C%8D%E5%8A%A1%E4%B8%AD%E4%BB%8B"></a>3. Mule的服务中介</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 提供较基本的中介服务：</p>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Transaction+Management" rel="nofollow">事务<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>(支持XA的JDBC,JMS,VM queue)
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Error+Handling" rel="nofollow">异常处理<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>(支持异常控制策略与Dead Letter Channel)
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Configuring+Security" rel="nofollow">安全<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>&nbsp;(用Acegi意思了一下，弱)
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Home#Home-Administration" rel="nofollow">JMX监控及其他工具<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 其他的能力如流量控制、负载均衡，可基于Mule的机制自行实现。</p>
<h3><a name="Mule-4.%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92"></a>4. 服务编排</h3>
<ul>
    <li>ChainRouter简单实现Pipeline模式
    <li>JBPM Router(见loanbroker example)。
    <li>在1.4版中还有<span class="nobr"><a title="Visit page outside Confluence" href="http://www.mulesource.org/display/OSWORKFLOW/Home" rel="nofollow">OSWorkflow Router<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>&nbsp; 和Apache PXE BPEL Router。 </li>
</ul>
<h3><a name="Mule-5.ServiceContainer"></a>5. Service Container</h3>
<p>&nbsp;&nbsp; 这是个额外的Bonus。Mule的身份并不纯粹。如果Component是什么都不干的Bridge Component，它就是真正纯调度外部服务的ESB。<br />
&nbsp;&nbsp; 如果Component是业务POJO，在Mule中运行业务逻辑，Mule就成为一个Service Container，类似于SCA Domain。<br />
&nbsp;&nbsp; 这时候它本身就是Spring+CXF的，额外有多通信协议支持，有<a title="SEDA" href="http://wiki.springside.org.cn/display/calvin/SEDA">SEDA</a>(Staged Event-Driven Architecture)，有异步编程模式，有服务中介基础设施，作为后台服务容器也是个不错的选择。<br />
&nbsp;&nbsp; 日后自己可能会越来越多使用Mule 2.0+Terracotta作为自己的服务容器方案。</p>
<h2><a name="Mule-%E5%9B%9B%E3%80%81Mule2.0%E5%8D%B0%E8%B1%A1"></a>四、Mule2.0 印象</h2>
<p><strong>&nbsp;&nbsp;&nbsp; 与Mule 2.0抵死缠绵了两周，喜忧掺半。但只在2.0之后，Mule才算真正站到了ESB的起跑线上。</strong></p>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://www.infoq.com/cn/news/2008/04/mule2" rel="nofollow">InfoQ中文站新闻<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mulesource.org/display/MULE2INTRO/Whats+New+in+Mule+2.0" rel="nofollow">Mule2.0的What's new<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2INTRO/Migrating+Mule+1.x+to+2.0" rel="nofollow">Migrating Mule 1.x to 2.0<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> </li>
</ul>
<h3><a name="Mule-1.%E5%BE%88Spring%EF%BC%8C%E5%BE%88SCA%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"></a>1. 很Spring，很SCA的配置文件</h3>
<ul>
    <li><strong>全Spring又全nameSpace化的配置文件，简洁而规范，在IDE中有良好的提示。</strong><br />
    尤其是transport相关的endpoint的改进明显，原来的URI<font color="#000000">&lt;endpoint address=</font><font color="#000000">"pop3://bob:secret@localhost:62002"&gt;</font> <font color="#000000">或如下的connector</font> </li>
</ul>
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;connector name=<span class="code-quote">"SystemStreamConnector"</span> className=<span class="code-quote">"org.mule.providers.stream.SystemStreamConnector"</span>&gt;
&lt;properties&gt;
&lt;property name=<span class="code-quote">"promptMessage"</span> value=<span class="code-quote">"Please enter something: "</span>/&gt;
&lt;property name=<span class="code-quote">"messageDelayTime"</span> value=<span class="code-quote">"1000"</span>/&gt;
&lt;/properties&gt;
&lt;/connector&gt;</pre>
</div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改为transport特定的namespace后，IDE中清晰显示了可选的配置项。</p>
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;stdio:connector name=<span class="code-quote">"SystemStreamConnector"</span> promptMessage=<span class="code-quote">"Please enter something: "</span>messageDelayTime=<span class="code-quote">"1000"</span>/&gt;</pre>
</div>
</div>
<ul>
    <li><strong>SCA的Service/Component概念。</strong><br />
    Service/Component代替了原来注定要被遗忘的MuleDescriptor，其中Component定义业务逻辑的POJO，Service定义如何以服务的方式管理组件的配置。<br />
    在POJO中调用远程服务的Nested Router也改为了很SCA的Binding。<br />
    Component也有Component 与 PooledComponent的选项。完整的例子如下： </li>
</ul>
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;pooled-component&gt;
&lt;spring-object bean=<span class="code-quote">"mySpringPojo"</span>/&gt;
&lt;binding <span class="code-keyword">interface</span>=<span class="code-quote">"org.mule.example.loanbroker.credit.CreditAgencyService"</span>&gt;
&lt;outbound-endpoint ref=<span class="code-quote">"CreditAgency"</span>/&gt;
&lt;/binding&gt;
&lt;pooling-profile exhaustedAction=<span class="code-quote">"WHEN_EXHAUSTED_FAIL"</span> initialisationPolicy=<span class="code-quote">"INITIALISE_ALL"</span>
&nbsp;     maxActive=<span class="code-quote">"1"</span> maxIdle=<span class="code-quote">"2"</span>maxWait=<span class="code-quote">"3"</span>/&gt;
&lt;/pooled-component&gt;</pre>
</div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上文按pooling-profile定义的pooled-component，在spring中定义mySpringPojo，并将一个远程的CXF Endpoint binding到POJO的CreditAgencyService变量中，可直接调用；</p>
<ul>
    <li><strong>可视化拖拽的Eclipse 插件Mule IDE。</strong><br />
    虽然还非常原始，但总算有个盼头。 </li>
</ul>
<h3><a name="Mule-2.%E6%9E%B6%E6%9E%84%E7%9A%84%E6%9B%B4%E6%94%B9"></a>2. 架构的更改</h3>
<ol>
    <li><strong>Web Service支持增强</strong><br />
    随着CXF作者的加入，Web Service这事实上SOA里最重要的Transport得到了加强，WSDL终于可以通过annotation准确配置。<br />
    虽然无奈，就冲这个理由就应该升级到2.0了。不是2.0太好，而是1.4太差了。<strong>&nbsp;</strong>
    <li><strong>REST支持增强</strong><br />
    <span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE/Mule+RESTpack" rel="nofollow">Mule RESTPack<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>，支持apache abdera(Atom Publish协议实现)，Jersey(JSR131 RESTful WebService实现)和Restlet 三种Transport。
    <li><strong>代码结构的合理化</strong><br />
    抽象出相对稳定的org.mule.api接口包，代替原来的org.mule.umo包。<br />
    开发团队还检查调整了Mule中所有对象的定义，使其更加准确。
    <li><strong>各个模块的升级</strong><br />
    如核心MuleManager大对象拆成MuleContext and Registry，运行时Reistry支持动态加载Service，支持向OSGI进军；<br />
    如以流的方式转换处理消息。<br />
    如SEDA模型定义的细化，见后。
    <li><strong>工具增强</strong><br />
    <span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Controlling+the+Infrastructure+with+Mule+Galaxy" rel="nofollow">Mule Galaxy<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> SOA治理工具(开源)， <span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Monitoring+Data+with+Mule+Saturn" rel="nofollow">Mule Saturn <sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>消息流监控工具，<span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Using+Mule+HQ" rel="nofollow">Mule HQ<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span> 底层监控工具。<br />
    不过还没试用不知道实际效果如何。 </li>
</ol>
<h3><a name="Mule-3.%E9%81%97%E6%86%BE%E7%9A%84%E5%9C%B0%E6%96%B9%EF%BC%9A"></a>3. <strong>遗憾的地方：</strong></h3>
<ol>
    <li><strong>性能下降</strong><br />
    无论是代替XFire的CXF还是Mule 2.0，都拖得性能大大下降。(但用JDK6的话情况又好一点)
    <li><strong>仍然没有自带的</strong><strong><span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULECDEV/Mule+Clustering+i.e.+Mule+114" rel="nofollow"><strong>集群</strong><sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span></strong><strong>，负载均衡，流量控制实现。</strong><br />
    不像BEA、ServiceMix都使用JMS的底层，Mule使用vm queue在单一JVM的节点间流动。<br />
    我们团队主要用<a title="Terracotta" href="http://wiki.springside.org.cn/display/calvin/Terracotta">TerraCotta</a>在集群里同步状态数据，流量控制与负载均衡也是自己实现。
    <li><strong>CXF transport 仍然使用Mule自己实现的Http Connector。</strong><br />
    CXF Standlone也是用Jetty的，看tomcat们努力的劲头，相信谁都能随便实现一个不错的Http Connector。
    <li><strong>从1.4升到2.0非常的花时间。</strong><br />
    估计团队重构的太兴奋了，从代码到配置文件再到XFire to CXF，一些代码级修改还没文档详述。
    <li><strong>文档从1.4版更新到2.0版的进度太慢，而且文档仍然简略。</strong>
    <li><strong>质量仍然在使用中检验。</strong><br />
    文档说2.0版本的比1.x版本增加了30%的单元测试用例，按理来说项目质量应该提高了。<br />
    但还是被我发现了在很重要的AbstractEntryPointResolver类里，居然有内存泄漏。(<span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/jira/browse/MULE-3521" rel="nofollow">http://mule.mulesource.org/jira/browse/MULE-3521<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>)<br />
    原因是用了StringBuffer作为HashMap的key，而SB并没有重载Object的equals()函数的，结果map永远都在增大。 </li>
</ol>
<p>这说明了，开源项目的质量，最终是靠一个积极使用和反馈的用户群和一个活跃的开发团队，"用"出来的。</p>
<h2><a name="Mule-%E4%BA%94%E3%80%81%E8%AF%A1%E5%BC%82%E7%9A%84%E6%B6%88%E6%81%AF%E6%B5%81"></a>五、诡异的消息流</h2>
<p>&nbsp; &nbsp;&nbsp; 不同的inbound-outbound模式下，Mule中的消息流与交互模式非常诡异，不熟悉的人会很痛苦，详见<span class="nobr"><a title="Visit page outside Confluence" href="http://mule.mulesource.org/display/MULE2USER/Messaging+Patterns" rel="nofollow">交互编程模式 <sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span></p>
<ul>
    <li><strong>同步模式</strong>：如果component有outbound，最终向调用者的返回结果就是outbound的返回结果而不是component的。<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当不再有outbound后，如果component的函数返回null，则返回NullPayload，如果函数为void，返回请求参数，其余正常返回。
    <li><strong>异步请求应答模式</strong>：一个同步Inbound，一个Ountbound（通常有reply-to的配置），一个 async-reply。Component请求，发给outbound，在async等待outbound返回，再返回给调用者。 </li>
</ul>
<h2><a name="Mule-%E5%85%AD%E3%80%81%E8%AF%A1%E5%BC%82%E7%9A%84SEDA%E6%A8%A1%E5%9E%8B"></a>六、诡异的SEDA模型</h2>
<p>&nbsp;&nbsp; Mule 2.0的SEDA模型配置更加细腻，但却没有文档描述，以下都是从配置文件的Schema读出。</p>
<p>&nbsp; SEDA的配置项仍然分Thread Pool、Component Pool、Queue三项，但其中Thread Pool又细分Receiver,Dispatcher ,Component 三项。</p>
<ul>
    <li>&lt;configuration&gt;可设定全局的Thread Pool，又分default-threading-profile与default-receiver-threading-profile等四项。后面三项如果没有特别设定，则采用第一项的值。
    <li>&lt;connector&gt;可设自己的dispatcher与receiver threading profile。
    <li>&lt;model&gt;可设自己的queue profile。
    <li>&lt;service&gt;可设自己的component-threading-profile与queue profile
    <li>&lt;pooled-component&gt;可设自己的pooling-profile。 </li>
</ul>
<p>换个角度描述：</p>
<ul>
    <li>Threading：&lt;configuration&gt;描述全局默认Threading，&lt;connector&gt;描述dispatcher与receiver，service描述compent-threading
    <li>Compoent Pool:&lt;pooled-component&gt;
    <li>Queue:&lt;model&gt;，&lt;service&gt; </li>
</ul>
<p>最后结果，配了default-threading-profile为100后，系统开了100条的http.receiver，其他component和vm.receiver都只有1条线程。在典型场景的CXF -&gt; component-&gt;同步VM Queue -&gt;component的情况下，一个请求的两个component都在同一个http.receiver线程内执行。</p>
<p>相对于1.4的改进：</p>
<p>&nbsp; Thread Pool的配置细腻了，而且不会去开N条实际用不到的vm.receiver</p>
<p>&nbsp; Component 不再默认有个对象池，也可以是&lt;component&gt;指向自身或Spring的单例，&lt;pool-component&gt;时才做池化处理。</p>
<img src ="http://www.blogjava.net/103335460/aggbug/227993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 17:03 <a href="http://www.blogjava.net/103335460/articles/227993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战Mule:利用Mule调用XFire发布的文件上传服务（转）</title><link>http://www.blogjava.net/103335460/articles/227982.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227982.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227982.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227982.html</trackback:ping><description><![CDATA[<div class="blog_content"><strong>配置Mule和XFire环境</strong> <br />
参考前面的文章<span style="color: red">实战Mule:利用Mule调用XFire发布的Web服务</span>。 <br />
<br />
<strong>利用XFire发布一个文件上传Web服务UploadService</strong> <br />
在Eclipse里新建项目webservice，目录结构如下: <br />
<pre class="java" name="code">webservice
src-service
cn.hidetoishandsome.xfire.service
IUploadService.java
cn.hidetoishandsome.xfire.service.impl
UploadService.java
src-conf
META-INF
xfire
services.xml
web
WEB-INF
lib
web.xml
</pre>
<br />
其中services.xml如下: <br />
<pre class="java" name="code">&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;
&lt;service&gt;
&lt;name&gt;UploadService&lt;/name&gt;
&lt;namespace&gt;http://localhost:9090/webservice/services/UploadService&lt;/namespace&gt;
&lt;serviceClass&gt;cn.hidetoishandsome.xfire.service.IUploadService&lt;/serviceClass&gt;
&lt;implementationClass&gt;cn.hidetoishandsome.xfire.service.impl.UploadService&lt;/implementationClass&gt;
&lt;/service&gt;
&lt;/beans&gt;
</pre>
<br />
让我们看看UploadService.java: <br />
<pre class="java" name="code">package cn.hidetoishandsome.xfire.service.impl;
import java.io.File;
import java.io.FileOutputStream;
import org.codehaus.xfire.util.Base64;
import cn.hidetoishandsome.xfire.service.IUploadService;
public class UploadService implements IUploadService {
public String upload(String encodedFileString) {
FileOutputStream fos = null;
File file = new File("D:\\test.jpg");
byte[] bytes = Base64.decode(encodedFileString);
try {
fos = new FileOutputStream(file);
fos.write(bytes);
fos.flush();
fos.close();
} catch (Exception e) {
return "Wrong!";
}
return "Success!";
}
}
</pre>
<br />
这里我们假设上传一张jpg图片，并将Base64binary encode为String，然后在UploadService里decode为byte[]并写入Disk。 <br />
<br />
<strong>利用Mule构建我们的ESB中心</strong> <br />
在Eclipse里创建新项目esb，目录结构如下: <br />
<pre class="java" name="code">esb
web
WEB-INF
lib
mule-services-config.xml
web.xml
index.jsp
</pre>
<br />
其中mule-services-config.xml配置了我们的UploadService: <br />
<pre class="java" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
"http://mule.mulesource.org/dtds/mule-configuration.dtd"&gt;
&lt;mule-configuration id="Mule_Demo" version="1.0"&gt;
&lt;mule-descriptor name="UploadService" inboundEndpoint="vm://uploadservice" implementation="org.mule.components.simple.BridgeComponent"&gt;
&lt;outbound-router&gt;
&lt;router className="org.mule.routing.outbound.OutboundPassThroughRouter"&gt;
&lt;endpoint address="wsdl-xfire:http://localhost:9090/webservice/services/UploadService?wsdl&amp;method=upload"/&gt;
&lt;/router&gt;
&lt;/outbound-router&gt;
&lt;/mule-descriptor&gt;
&lt;/mule-configuration&gt;
</pre>
<br />
看看我们怎么在前台index.jsp页面上传文件数据: <br />
<pre class="java" name="code">&lt;%@ page import="org.mule.extras.client.MuleClient, org.mule.umo.UMOMessage, org.apache.commons.fileupload.disk.DiskFileItemFactory, org.apache.commons.fileupload.servlet.ServletFileUpload, org.apache.commons.fileupload.*, java.util.List, org.codehaus.xfire.util.Base64"%&gt;
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" %&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Mule Upload Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
try {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List fileItems = upload.parseRequest(request);
FileItem item = (FileItem) fileItems.get(0);
MuleClient client = new MuleClient();
byte[] bytes = item.get();
String encodedFileString = Base64.encode(bytes);
UMOMessage message = client.send("vm://uploadservice", encodedFileString, null);
out.print(message.getPayload());
} catch(Exception e) {
}
%&gt;
&lt;form method="POST" name="uploadFile" action="" enctype="multipart/form-data"&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;
&lt;input type="file" name="file"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" name="Go" value=" Go " /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/form&gt;
&lt;p/&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<br />
注意这里我们用到了commons-fileupload组件库，其他库采用上一篇<span style="color: red">实战Mule:利用Mule调用XFire发布的Web服务</span>的库。 <br />
我们用org.codehaus.xfire.util.Base64工具类把上传文件的byte数组encode为String，并作为参数传递给Web服务。 <br />
<br />
<strong>测试及源代码</strong> <br />
按照上篇文章<span style="color: red">实战Mule:利用Mule调用XFire发布的Web服务</span>的讲述来启动两个Tomcat测试，打开 <br />
浏览器访问<a href="http://localhost:8080/esb" target="_blank">http://localhost:8080/esb</a>并Browse一张jpg图片，然后点击提交，看看我们的"D:\"下是不是多了一张test.jpg? </div>
<img src ="http://www.blogjava.net/103335460/aggbug/227982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 16:27 <a href="http://www.blogjava.net/103335460/articles/227982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战Mule:利用Mule调用XFire发布的Web服务（转）</title><link>http://www.blogjava.net/103335460/articles/227981.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227981.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227981.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227981.html</trackback:ping><description><![CDATA[<strong>下载和安装XFire和Mule</strong> <br />
参考http://www.blogjava.net/103335460/articles/227980.html和http://www.blogjava.net/103335460/articles/227979.html对XFire和Mule的介绍 <br />
本文例子也以上述两篇文章的例子为背景。 <br />
<br />
<strong>利用XFire发布一个Web服务BookService</strong> <br />
在Eclipse里新建项目webservice，目录结构如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>webservice &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;src-service &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.model &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.service &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBookService.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.service.impl &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookService.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;src-conf &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;META-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xfire &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;services.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;web &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.xml&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">webservice
src-service
cn.hidetoishandsome.xfire.model
Book.java
cn.hidetoishandsome.xfire.service
IBookService.java
cn.hidetoishandsome.xfire.service.impl
BookService.java
src-conf
META-INF
xfire
services.xml
web
WEB-INF
lib
web.xml
</pre>
<br />
其中web.xml: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;web-app&nbsp;xmlns=</span><span class="string">"http://java.sun.com/xml/ns/j2ee"</span><span>&nbsp;xmlns:xsi=</span><span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;version=</span><span class="string">"2.4"</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=</span><span class="string">"http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-</span><span class="keyword">class</span><span>&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-</span><span class="keyword">class</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/web-app&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;xfire&lt;/servlet-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;xfire&lt;/servlet-name&gt;
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<br />
以及services.xml: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;beans&nbsp;xmlns=</span><span class="string">"http://xfire.codehaus.org/config/1.0"</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;service&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;BookService&lt;/name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;namespace&gt;http:</span><span class="comment">//localhost:9090/webservice/services/BookService&lt;/namespace&gt;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;serviceClass&gt;cn.hidetoishandsome.xfire.service.IBookService&lt;/serviceClass&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;implementationClass&gt;cn.hidetoishandsome.xfire.service.impl.BookService&lt;/implementationClass&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/service&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/beans&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;
&lt;service&gt;
&lt;name&gt;BookService&lt;/name&gt;
&lt;namespace&gt;http://localhost:9090/webservice/services/BookService&lt;/namespace&gt;
&lt;serviceClass&gt;cn.hidetoishandsome.xfire.service.IBookService&lt;/serviceClass&gt;
&lt;implementationClass&gt;cn.hidetoishandsome.xfire.service.impl.BookService&lt;/implementationClass&gt;
&lt;/service&gt;
&lt;/beans&gt;
</pre>
<br />
我们发布BookService类的findBookByISBN方法，通过传入book的isbn返回查询到的book的title <br />
注意services.xml中我们把BookService的namespace设置为http://localhost:9090/webservice/services/BookService，这是为了在同一机器上同时 <br />
启动两个Tomcat实例来测试我们的demo，我们将启动一个Tomcat来host我们发布的BookService，并且port设置为9090，而启动的第二个Tomcat用来 <br />
host我们的Mule ESB，以及前台页面调用测试。 <br />
好了，现在我们已经可以启动第一个Tomcat实例来发布BookService了，访问http://localhost:9090/webservice/services/BookService?wsdl可以看 <br />
到XFire自动生成的WSDL文档。 <br />
<br />
<strong>利用Mule构建我们的ESB中心</strong> <br />
在Eclipse里创建新项目esb，目录结构如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>esb &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;web &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mule-services-config.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;index.jsp&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">esb
web
WEB-INF
lib
mule-services-config.xml
web.xml
index.jsp
</pre>
<br />
其中web.xml: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;</span><span class="string">"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN"</span><span>&nbsp;</span><span class="string">"http://java.sun.com/dtd/web-app_2_3.dtd"</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;web-app&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;Mule&lt;/display-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;Mule&nbsp;Demo&lt;/description&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;context-param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;org.mule.config&lt;/param-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/mule-services-config.xml,&lt;/param-value&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/context-param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-</span><span class="keyword">class</span><span>&gt;org.mule.config.builders.MuleXmlBuilderContextListener&lt;/listener-</span><span class="keyword">class</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listener&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file-list&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/welcome-file-list&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/web-app&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&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;display-name&gt;Mule&lt;/display-name&gt;
&lt;description&gt;Mule Demo&lt;/description&gt;
&lt;context-param&gt;
&lt;param-name&gt;org.mule.config&lt;/param-name&gt;
&lt;param-value&gt;/WEB-INF/mule-services-config.xml,&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;listener&gt;
&lt;listener-class&gt;org.mule.config.builders.MuleXmlBuilderContextListener&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app&gt;
</pre>
<br />
以及mule-services-config.xml: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;!DOCTYPE&nbsp;mule-configuration&nbsp;PUBLIC&nbsp;</span><span class="string">"-//MuleSource&nbsp;//DTD&nbsp;mule-configuration&nbsp;XML&nbsp;V1.0//EN"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">"http://mule.mulesource.org/dtds/mule-configuration.dtd"</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;mule-configuration&nbsp;id=</span><span class="string">"Mule_Demo"</span><span>&nbsp;version=</span><span class="string">"1.0"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mule-descriptor&nbsp;name=</span><span class="string">"BookService"</span><span>&nbsp;inboundEndpoint=</span><span class="string">"vm://bookservice"</span><span>&nbsp;implementation=</span><span class="string">"org.mule.components.simple.BridgeComponent"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;outbound-router&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;router&nbsp;className=</span><span class="string">"org.mule.routing.outbound.OutboundPassThroughRouter"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;endpoint&nbsp;address=</span><span class="string">"wsdl-xfire:http://localhost:9090/webservice/services/BookService?wsdl&amp;method=findBookByISBN"</span><span>/&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/router&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/outbound-router&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mule-descriptor&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;/mule-configuration&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
"http://mule.mulesource.org/dtds/mule-configuration.dtd"&gt;
&lt;mule-configuration id="Mule_Demo" version="1.0"&gt;
&lt;mule-descriptor name="BookService" inboundEndpoint="vm://bookservice" implementation="org.mule.components.simple.BridgeComponent"&gt;
&lt;outbound-router&gt;
&lt;router className="org.mule.routing.outbound.OutboundPassThroughRouter"&gt;
&lt;endpoint address="wsdl-xfire:http://localhost:9090/webservice/services/BookService?wsdl&amp;method=findBookByISBN"/&gt;
&lt;/router&gt;
&lt;/outbound-router&gt;
&lt;/mule-descriptor&gt;
&lt;/mule-configuration&gt;
</pre>
<br />
这里我们配置了我们要调用的BookService的outbound router endpoint的address为: <br />
wsdl-xfire:http://localhost:9090/webservice/services/BookService?wsdl&amp;method=findBookByISBN <br />
好了，我们的Mule ESB已经构建好了，并且我们在自己的ESB中注入了一个Web服务BookService，我们不用担心底层的实现，我们只需按照接口简单调用即可。 <br />
下面我们写前端调用代码index.jsp: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/65607#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;%@&nbsp;page&nbsp;</span><span class="keyword">import</span><span>=</span><span class="string">"org.mule.extras.client.MuleClient,&nbsp;org.mule.umo.UMOMessage"</span><span>%&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;%@&nbsp;page&nbsp;language=</span><span class="string">"java"</span><span>&nbsp;contentType=</span><span class="string">"text/html;&nbsp;charset=UTF-8"</span><span>&nbsp;%&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;html&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;head&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;title&gt;Mule&nbsp;Echo&nbsp;Example&lt;/title&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/head&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;body&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;%&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;request.getParameter(</span><span class="string">"isbn"</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(s!=</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MuleClient&nbsp;client&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MuleClient();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UMOMessage&nbsp;message&nbsp;=&nbsp;client.send(</span><span class="string">"vm://bookservice"</span><span>,&nbsp;s,&nbsp;</span><span class="keyword">null</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>%&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;h3&gt;The&nbsp;book&nbsp;with&nbsp;isbn&nbsp;</span><span class="string">"&lt;%=s%&gt;"</span><span>&nbsp;is&nbsp;:&nbsp;&lt;&lt;&lt;%=message.getPayload()%&gt;&gt;&gt;&lt;/h3&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%}%&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>Please&nbsp;enter&nbsp;the&nbsp;isbn&nbsp;of&nbsp;book:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;form&nbsp;method=</span><span class="string">"POST"</span><span>&nbsp;name=</span><span class="string">"submitISBM"</span><span>&nbsp;action=</span><span class="string">""</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;&lt;td&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type=</span><span class="string">"text"</span><span>&nbsp;name=</span><span class="string">"isbn"</span><span>/&gt;&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=</span><span class="string">"submit"</span><span>&nbsp;name=</span><span class="string">"Go"</span><span>&nbsp;value=</span><span class="string">"&nbsp;Go&nbsp;"</span><span>&nbsp;/&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&lt;/tr&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/form&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;p/&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/body&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/html&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;%@ page import="org.mule.extras.client.MuleClient, org.mule.umo.UMOMessage"%&gt;
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" %&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Mule Echo Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
String s = request.getParameter("isbn");
if(s!=null) {
MuleClient client = new MuleClient();
UMOMessage message = client.send("vm://bookservice", s, null);
%&gt;
&lt;h3&gt;The book with isbn "&lt;%=s%&gt;" is : &lt;&lt;&lt;%=message.getPayload()%&gt;&gt;&gt;&lt;/h3&gt;
&lt;%}%&gt;
Please enter the isbn of book:
&lt;form method="POST" name="submitISBM" action=""&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;
&lt;input type="text" name="isbn"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" name="Go" value=" Go " /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/form&gt;
&lt;p/&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<br />
现在让我们启动第二个Tomcat实例，然后访问http://localhost:8080/esb，输入isbn号码&#8220;123456&#8221;，提交来查看返回的Book的Title。 <br />
<br />
<strong>源代码</strong> <br />
将源代码打包提供如下，WEB-INF/lib下面的jar包都删除了，请参考http://www.blogjava.net/103335460/articles/227980.html和http://www.blogjava.net/103335460/articles/227979.html来 <br />
添加jar包。 
<img src ="http://www.blogjava.net/103335460/aggbug/227981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 16:25 <a href="http://www.blogjava.net/103335460/articles/227981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire快速上手（转）</title><link>http://www.blogjava.net/103335460/articles/227980.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227980.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227980.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227980.html</trackback:ping><description><![CDATA[<strong>下载XFrie</strong> <br />
首先，去<a href="http://xfire.codehaus.org/" target="_blank">http://xfire.codehaus.org</a>下载最新版本的XFire <br />
<br />
<strong>搭建webservice工程环境</strong> <br />
在eclipse里创建一个叫webservice的java工程，然后依次添加src-service、src-conf、src-test和src-util这几个Source Folder以及web这个Folder <br />
目录结构及文件如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>webservice &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;src-service &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.model &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.service &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookService.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.service.impl &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookServiceImpl.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;src-conf &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;META-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xfire &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;services.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;src-test &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.test &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookServiceTest.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;src-util &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.xfire.util &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XfireClientFactory.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;web &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index.html&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">webservice
src-service
cn.hidetoishandsome.xfire.model
Book.java
cn.hidetoishandsome.xfire.service
BookService.java
cn.hidetoishandsome.xfire.service.impl
BookServiceImpl.java
src-conf
META-INF
xfire
services.xml
src-test
cn.hidetoishandsome.xfire.test
BookServiceTest.java
src-util
cn.hidetoishandsome.xfire.util
XfireClientFactory.java
web
WEB-INF
lib
web.xml
index.html
</pre>
<br />
然后将解压后的xfire的lib目录下所有jar包和xfire-all-1.*.jar复制到WEB-INF/lib目录 <br />
web.xml内容如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;web-app&nbsp;xmlns=</span><span class="string">"http://java.sun.com/xml/ns/j2ee"</span><span>&nbsp;xmlns:xsi=</span><span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;version=</span><span class="string">"2.4"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=</span><span class="string">"http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-</span><span class="keyword">class</span><span>&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-</span><span class="keyword">class</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;/web-app&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;xfire&lt;/servlet-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;xfire&lt;/servlet-name&gt;
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<br />
<br />
<strong>写一个BookService</strong> <br />
我们将创建一个从ISBM号得到Book的Title的简单查询Web服务 <br />
首先创建Book.java <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.xfire.model; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Book&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;title; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;isbn; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getIsbn()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;isbn; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setIsbn(String&nbsp;isbn)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.isbn&nbsp;=&nbsp;isbn; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getTitle()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;title; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setTitle(String&nbsp;title)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.xfire.model;
public class Book {
private String title;
private String isbn;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
</pre>
<br />
然后写一个BookService接口BookService.java <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.xfire.service; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;cn.hidetoishandsome.xfire.model.Book; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;BookService&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;findBookByISBN(String&nbsp;isbn); &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.xfire.service;
import cn.hidetoishandsome.xfire.model.Book;
public interface BookService {
Book findBookByISBN(String isbn);
}
</pre>
<br />
然后是BookService的实现BookServiceImpl.java <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.xfire.service.impl; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;cn.hidetoishandsome.xfire.model.Book; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;cn.hidetoishandsome.xfire.service.BookService; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BookServiceImpl&nbsp;</span><span class="keyword">implements</span><span>&nbsp;BookService&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Book&nbsp;book; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;BookServiceImpl()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Book(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setTitle(</span><span class="string">"XFire&nbsp;Quick&nbsp;Start"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setIsbn(</span><span class="string">"123456"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Book&nbsp;findBookByISBN(String&nbsp;isbn)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(isbn.equals(book.getIsbn())) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;book; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(</span><span class="string">"Can't&nbsp;find&nbsp;book"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.xfire.service.impl;
import cn.hidetoishandsome.xfire.model.Book;
import cn.hidetoishandsome.xfire.service.BookService;
public class BookServiceImpl implements BookService {
private Book book;
public BookServiceImpl() {
book = new Book();
book.setTitle("XFire Quick Start");
book.setIsbn("123456");
}
public Book findBookByISBN(String isbn) {
if (isbn.equals(book.getIsbn()))
return book;
throw new RuntimeException("Can't find book");
}
}
</pre>
<br />
<br />
<strong>在services.xml中配置要发布的服务</strong> <br />
在src-conf的META-INF/xfire目录创建services.xml <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;beans&nbsp;xmlns=</span><span class="string">"http://xfire.codehaus.org/config/1.0"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;service&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;BookService&lt;/name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;namespace&gt;http:</span><span class="comment">//localhost:8080/xfire/services/BookService&lt;/namespace&gt; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;serviceClass&gt;cn.hidetoishandsome.xfire.service.BookService&lt;/serviceClass&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;implementationClass&gt;cn.hidetoishandsome.xfire.service.impl.BookServiceImpl&lt;/implementationClass&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/service&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/beans&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;
&lt;service&gt;
&lt;name&gt;BookService&lt;/name&gt;
&lt;namespace&gt;http://localhost:8080/xfire/services/BookService&lt;/namespace&gt;
&lt;serviceClass&gt;cn.hidetoishandsome.xfire.service.BookService&lt;/serviceClass&gt;
&lt;implementationClass&gt;cn.hidetoishandsome.xfire.service.impl.BookServiceImpl&lt;/implementationClass&gt;
&lt;/service&gt;
&lt;/beans&gt;
</pre>
<br />
其中name标签决定了我们创建的该服务的WSDL的URL为http://xx.xx.xx/xx/xx/BookService?wsdl <br />
<br />
<strong>在Tomcat中发布</strong> <br />
可以简单的修改Tomcat的server.xml来发布该Web服务，在&lt;Host&gt;标签中添加以下内容: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>Context&nbsp;path=</span><span class="string">"/webservice"</span><span>&nbsp;docBase=</span><span class="string">"D:\project\webservice\web"</span><span>&nbsp;reloadable=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">Context path="/webservice" docBase="D:\project\webservice\web" reloadable="true"/&gt;
</pre>
<br />
现在打开浏览器访问<a href="http://localhost:8080/webservice/services/BookService?wsdl" target="_blank">http://localhost:8080/webservice/services/BookService?wsdl</a>来看看生成的WSDL文档 <br />
<br />
<strong>客户端调用测试</strong> <br />
我们将使用一个XfireClientFactory.java工具类来帮我们调用该Web服务: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.xfire.util; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.net.MalformedURLException; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.commons.logging.Log; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.commons.logging.LogFactory; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.client.XFireProxyFactory; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.Service; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.binding.ObjectServiceFactory; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.springframework.util.Assert; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;XfireClientFactory&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;XFireProxyFactory&nbsp;serviceFactory&nbsp;=&nbsp;</span><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><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(XfireClientFactory.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;XfireClientFactory()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;&lt;T&gt;&nbsp;T&nbsp;getClient(String&nbsp;serviceURL,&nbsp;Class&lt;T&gt;&nbsp;serviceClass)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(serviceURL); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(serviceClass); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;serviceModel&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectServiceFactory().create(serviceClass); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(T)&nbsp;serviceFactory.create(serviceModel,&nbsp;serviceURL); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(MalformedURLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(e.getMessage(),&nbsp;e); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.xfire.util;
import java.net.MalformedURLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springframework.util.Assert;
public class XfireClientFactory {
private static XFireProxyFactory serviceFactory = new XFireProxyFactory();
private static final Log log = LogFactory.getLog(XfireClientFactory.class);
private XfireClientFactory() {
}
public static &lt;T&gt; T getClient(String serviceURL, Class&lt;T&gt; serviceClass) {
Assert.notNull(serviceURL);
Assert.notNull(serviceClass);
Service serviceModel = new ObjectServiceFactory().create(serviceClass);
try {
return (T) serviceFactory.create(serviceModel, serviceURL);
} catch (MalformedURLException e) {
log.error(e.getMessage(), e);
return null;
}
}
}
</pre>
<br />
然后编写一个BookServiceTest.java来调用我们刚才发布的Web服务: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.xfire.test; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;cn.hidetoishandsome.xfire.service.BookService; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;cn.hidetoishandsome.xfire.util.XfireClientFactory; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BookServieTest&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serviceURL&nbsp;=&nbsp;</span><span class="string">"http://localhost:8080/webservice/services/BookService"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookService&nbsp;service&nbsp;=&nbsp;XfireClientFactory.getClient(serviceURL,&nbsp;BookService.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Book&nbsp;with&nbsp;ISBN&nbsp;'123456':&nbsp;《"</span><span>&nbsp;+&nbsp;service.findBookByISBN(</span><span class="string">"123456"</span><span>).getTitle()&nbsp;+&nbsp;</span><span class="string">"》"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.xfire.test;
import cn.hidetoishandsome.xfire.service.BookService;
import cn.hidetoishandsome.xfire.util.XfireClientFactory;
public class BookServieTest {
public static void main(String[] args) {
String serviceURL = "http://localhost:8080/webservice/services/BookService";
try {
BookService service = XfireClientFactory.getClient(serviceURL, BookService.class);
System.out.println("Book with ISBN '123456': 《" + service.findBookByISBN("123456").getTitle() + "》");
} catch (Exception e) {
e.printStackTrace();
}
}
}
</pre>
<br />
服务调用成功，Console打印内容如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/59750#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>Book&nbsp;with&nbsp;ISBN&nbsp;</span><span class="string">'123456'</span><span>:&nbsp;《XFire&nbsp;Quick&nbsp;Start》</span></span></li>
</ol>
</div>
<img src ="http://www.blogjava.net/103335460/aggbug/227980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 16:21 <a href="http://www.blogjava.net/103335460/articles/227980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源ESB引擎Mule初印象（转）</title><link>http://www.blogjava.net/103335460/articles/227979.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227979.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227979.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227979.html</trackback:ping><description><![CDATA[<a href="http://mule.codehaus.org/" target="_blank">Mule</a> is the leading open source ESB (Enterprise Service Bus) and integration platform. It is a scalable, highly distributable <br />
object broker that can seamlessly handle interactions with services and applications using disparate transport and messaging <br />
technologies。 <br />
<img src="http://mule.codehaus.org/download/attachments/1401/mule_esb.gif" _counted="undefined"  alt="" /> <br />
在这里我们简单看看如何用Mule发布和调用Web服务，体验一下Mule的简洁和高效。 <br />
<br />
<strong>安装Mule</strong> <br />
去<a href="http://mule.codehaus.org/display/MULE/Download" target="_blank">Mule官方下载页</a>下载最新的Full版zip文件，解压到一个目录。 <br />
运行一下MULE_HOME\examples\maven\echo目录下的echo.bat，则mule会自动下载合适版本的activation.jar和mail.jar到MULE_HOME\lib\user目录 <br />
echo.bat示例了一个command prompt下的echo程序，该程序会echo你在命令行输入的字符串。 <br />
<br />
<strong>创建Eclipse项目</strong> <br />
我们在Eclipse下新建命名为mule的Java project，其中包结构如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>mule &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;src-demo &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;cn.hidetoishandsome.mule.demo &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EchoService.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEchoService.java &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;images &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;mule-banner.gif &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;WEB-INF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;lib &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;mule-echo-config.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;web.xml &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;contents.html &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;echo.jsp &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;header.html &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;index.html &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;welcome.html&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">mule
src-demo
cn.hidetoishandsome.mule.demo
EchoService.java
IEchoService.java
images
mule-banner.gif
WEB-INF
lib
mule-echo-config.xml
web.xml
contents.html
echo.jsp
header.html
index.html
welcome.html
</pre>
<br />
将MULE_HOME\lib\mule目录和MULE_HOME\lib\opt目录下所有的jar包以及MULE_HOME\lib\user目录下的activation.jar和mail.jar统统扔到WEB-INF\lib目录下。 <br />
其中mule-banner.gif、contents.html、header.html、index.html、welcome.html等来自将MULE_HOME\examples\ant\webapp目录下的build.xml用ant <br />
build后在build目录下生成的mule-example-webapp.war中的文件。 <br />
在这里我们修改该mule-example-webapp.war工程来demo一下使用Mule发布和调用Web服务。 <br />
<br />
<strong>写我们要发布的服务</strong> <br />
上面列出的IEchoService.java为我们要发布的服务的接口，该接口约束了我们要发布的服务: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.mule.demo; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;IEchoService&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;echo(String&nbsp;s); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;haha(String&nbsp;s); &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.mule.demo;
public interface IEchoService {
String echo(String s);
String haha(String s);
}
</pre>
<br />
如上，我们将使用该接口发布echo和haha这两个服务。现在写我们的服务实现类EchoService.java(系统集成时可能实现已经存在，我们只需抽离要 <br />
发布的服务的窄接口即可): <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;cn.hidetoishandsome.mule.demo; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;EchoService&nbsp;</span><span class="keyword">implements</span><span>&nbsp;IEchoService&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;echo(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Hello,&nbsp;"</span><span>&nbsp;+&nbsp;s&nbsp;+&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;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;haha(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"haha"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;hehe(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"hehe"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package cn.hidetoishandsome.mule.demo;
public class EchoService implements IEchoService {
public String echo(String s) {
return "Hello, " + s + "!";
}
public String haha(String s) {
return "haha";
}
public String hehe(String s) {
return "hehe";
}
}
</pre>
<br />
可以看到，虽然我们的EchoService提供了echo/haha/hehe三个服务，但我们使用IEchoService来约束它，从而只发布其中的echo和haha这两个服务。 <br />
<br />
<strong>配置使我们的服务以Web Service发布</strong> <br />
首先我们修改web.xml来让servlet容器listen和mapping一些东西: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;</span><span class="string">"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN"</span><span>&nbsp;</span><span class="string">"http://java.sun.com/dtd/web-app_2_3.dtd"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;web-app&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;Mule&lt;/display-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;Mule&nbsp;Demo&lt;/description&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;context-param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;org.mule.config&lt;/param-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/mule-echo-config.xml,&lt;/param-value&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/context-param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-</span><span class="keyword">class</span><span>&gt;org.mule.config.builders.MuleXmlBuilderContextListener&lt;/listener-</span><span class="keyword">class</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listener&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;muleServlet&lt;/servlet-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-</span><span class="keyword">class</span><span>&gt;org.mule.providers.http.servlet.MuleReceiverServlet&lt;/servlet-</span><span class="keyword">class</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup/&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;muleServlet&lt;/servlet-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file-list&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/welcome-file-list&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/web-app&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&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;display-name&gt;Mule&lt;/display-name&gt;
&lt;description&gt;Mule Demo&lt;/description&gt;
&lt;context-param&gt;
&lt;param-name&gt;org.mule.config&lt;/param-name&gt;
&lt;param-value&gt;/WEB-INF/mule-echo-config.xml,&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;listener&gt;
&lt;listener-class&gt;org.mule.config.builders.MuleXmlBuilderContextListener&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;muleServlet&lt;/servlet-name&gt;
&lt;servlet-class&gt;org.mule.providers.http.servlet.MuleReceiverServlet&lt;/servlet-class&gt;
&lt;load-on-startup/&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;muleServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app&gt;
</pre>
<br />
然后我们配置mule-echo-config.xml来以Web Service方式发布我们的服务: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;!DOCTYPE&nbsp;mule-configuration&nbsp;PUBLIC&nbsp;</span><span class="string">"-//MuleSource&nbsp;//DTD&nbsp;mule-configuration&nbsp;XML&nbsp;V1.0//EN"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">"http://mule.mulesource.org/dtds/mule-configuration.dtd"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;mule-configuration&nbsp;id=</span><span class="string">"Mule_Demo"</span><span>&nbsp;version=</span><span class="string">"1.0"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mule-descriptor&nbsp;name=</span><span class="string">"echoService"</span><span>&nbsp;implementation=</span><span class="string">"cn.hidetoishandsome.mule.demo.EchoService"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;inbound-router&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;endpoint&nbsp;address=</span><span class="string">"xfire:http://localhost:8181/services"</span><span>/&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/inbound-router&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;properties&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&nbsp;name=</span><span class="string">"serviceInterfaces"</span><span>&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry&nbsp;value=</span><span class="string">"cn.hidetoishandsome.mule.demo.IEchoService"</span><span>/&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/properties&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&lt;/mule-descriptor&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/mule-configuration&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
"http://mule.mulesource.org/dtds/mule-configuration.dtd"&gt;
&lt;mule-configuration id="Mule_Demo" version="1.0"&gt;
&lt;mule-descriptor name="echoService" implementation="cn.hidetoishandsome.mule.demo.EchoService"&gt;
&lt;inbound-router&gt;
&lt;endpoint address="xfire:http://localhost:8181/services"/&gt;
&lt;/inbound-router&gt;
&lt;properties&gt;
&lt;list name="serviceInterfaces"&gt;
&lt;entry value="cn.hidetoishandsome.mule.demo.IEchoService"/&gt;
&lt;/list&gt;
&lt;/properties&gt;
&lt;/mule-descriptor&gt;
&lt;/mule-configuration&gt;
</pre>
<br />
这里我们的echoService实现为cn.hidetoishandsome.mule.demo.EchoService，inbound-router中&lt;endpoint address="xfire:http://localhost:8181/services"/&gt;表示我们以xfire发布我们的服务到本机该端口的services这个context下，而serviceInterfaces的entry表示我们使用IEchoService <br />
来约束我们要发布的服务接口。 <br />
<br />
<strong>运行和调用服务</strong> <br />
让我们将该mule项目在Tomcat中跑起来看看效果吧。 <br />
例如配置Tomcat的server.xml，在&lt;Host&gt;标签中加入&lt;Context path="/mule" docBase="D:\project\mule" reloadable="true" /&gt; <br />
启动Tomcat，打开浏览器访问<a href="http://localhost:8181/services/echoService?wsdl" target="_blank">http://localhost:8181/services/echoService?wsdl</a>可以看到Mule通过xfire自动生成的wsdl文档，其中 <br />
我们可以看到Mule只暴露了EchoService和echo和haha方法，而没有暴露hehe方法。 <br />
现在我们在echo.jsp中利用Mule的UMO(Universal Message Object)API写对我们刚发布的Web服务的客户端调用: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;%@&nbsp;page&nbsp;</span><span class="keyword">import</span><span>=</span><span class="string">"org.mule.extras.client.MuleClient,&nbsp;org.mule.umo.UMOMessage"</span><span>%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;%@&nbsp;page&nbsp;language=</span><span class="string">"java"</span><span>&nbsp;contentType=</span><span class="string">"text/html;&nbsp;charset=UTF-8"</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;html&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;head&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;title&gt;Mule&nbsp;Echo&nbsp;Example&lt;/title&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/head&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;body&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;% &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;request.getParameter(</span><span class="string">"name"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(s!=</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MuleClient&nbsp;client&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MuleClient(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UMOMessage&nbsp;message&nbsp;=&nbsp;client.send(</span><span class="string">"xfire:http://localhost:8181/services/echoService?method=echo"</span><span>,&nbsp;s,&nbsp;</span><span class="keyword">null</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>%&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;h3&gt;&lt;%=message.getPayload()%&gt;&lt;/h3&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%}%&gt; &nbsp;&nbsp;</span></li>
    <li><span>Please&nbsp;enter&nbsp;your&nbsp;name: &nbsp;&nbsp;</span></li>
    <li><span>&lt;form&nbsp;method=</span><span class="string">"POST"</span><span>&nbsp;name=</span><span class="string">"submitEcho"</span><span>&nbsp;action=</span><span class="string">""</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;&lt;td&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type=</span><span class="string">"text"</span><span>&nbsp;name=</span><span class="string">"name"</span><span>/&gt;&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=</span><span class="string">"submit"</span><span>&nbsp;name=</span><span class="string">"Go"</span><span>&nbsp;value=</span><span class="string">"&nbsp;Go&nbsp;"</span><span>&nbsp;/&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&lt;/tr&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/form&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;p/&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/body&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/html&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;%@ page import="org.mule.extras.client.MuleClient, org.mule.umo.UMOMessage"%&gt;
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" %&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Mule Echo Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
String s = request.getParameter("name");
if(s!=null) {
MuleClient client = new MuleClient();
UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=echo", s, null);
%&gt;
&lt;h3&gt;&lt;%=message.getPayload()%&gt;&lt;/h3&gt;
&lt;%}%&gt;
Please enter your name:
&lt;form method="POST" name="submitEcho" action=""&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;
&lt;input type="text" name="name"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" name="Go" value=" Go " /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/form&gt;
&lt;p/&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<br />
好了，用浏览器访问<a href="http://localhost:8080/mule" target="_blank">http://localhost:8080/mule</a>并点击左侧菜单的Echo链接，或者直接访问<a href="http://localhost:8080/mule/echo.jsp" target="_blank">http://localhost:8080/mule/echo.jsp</a>，然后在input框输入一些文本内容如"Hideto"，点击Go，则你会看到页面返回"Hello, Hideto!"。 <br />
现在让我们修改echo.jsp，将UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=echo", s, null); <br />
这段代码中的method改为haha，即: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://hideto.javaeye.com/blog/64742#"><img alt="复制代码" src="http://hideto.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>UMOMessage&nbsp;message&nbsp;=&nbsp;client.send(</span><span class="string">"xfire:http://localhost:8181/services/echoService?method=haha"</span><span>,&nbsp;s,&nbsp;</span><span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=haha", s, null);
</pre>
<br />
然后刷新一下浏览器页面，再输入一些文本内容，看看页面是不是返回"haha"字样了？ 
<img src ="http://www.blogjava.net/103335460/aggbug/227979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 16:20 <a href="http://www.blogjava.net/103335460/articles/227979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService是“良药”还是“毒药” (转)</title><link>http://www.blogjava.net/103335460/articles/227977.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227977.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227977.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227977.html</trackback:ping><description><![CDATA[时下，IT界最流行的话题莫过于SOA，而SOA领域里我们用到的最广泛的技术就是webservice，一方面我们热衷于使用webserivce来解决企业应用中面临异构系统的应用集成问题，它的问世，天生为集成服务，成为解决异构系统应用集成的首选&#8220;良药&#8221;。另一方面，良药并非&#8220;神药&#8221;，当我们把它神化之后，错误的以为构建SOA就必需要使用WebService来构建服务，在过多的使用webservice后，发现&#8220;良药服用过量&#8221;，会出现&#8220;不良反应&#8221;，使企业的应用又面临严重的性能瓶颈。对于它的认识与使用，我们需做何选择呢？<br />
<strong>SOA的理解</strong><br />
&nbsp;&nbsp;&nbsp; SOA架构的本质，并不是说把你的应用或者组件包装成Service就是SOA，而是说，你需要基于一种构架，能够让你的产品能够更适应&#8220;业务敏捷性(Business Agility)&#8221;。而体现SOA的重要特性在于松耦合、可重用、可视化、灵活性，所以只有在这几个环节做到之后才能使企业应用真正置身于SOA的大环境之中。<br />
&nbsp;从SOA的面向角度来说分为：面向企业异构系统和面向企业内部业务系统两个方面，前者的角度称为Inter-SOA，后者称之为Intra-SOA。而企业在构建SOA时，并非单纯是从解决企业异构系统的角度来出发，也要考虑到应用的升级、扩展、企业新系统的建设，仅以一种修修补补的方式来适应因传统技术构建的业务系统，采用intra-SOA来适应企业的快速变化并非长久之策，只能作为当前不得已而选择的一种手段。
<p align="center"><span style="font-size: 12pt; line-height: 150%"><font size="2"><img height="215" alt="（图一）Intra-SOA和Inter-SOA架构" src="http://java.chinaitlab.com/UploadFiles_8734/200807/20080711105801403.gif" width="300" align="center" /></font></span></p>
<p align="center">&nbsp;&nbsp;&nbsp; （图一）Intra-SOA和Inter-SOA架构</p>
<p align="left"><br />
<strong>Webservice的价值观</strong><br />
&nbsp;&nbsp;&nbsp; WebService很好的解决了基于不同平台，基于不同语言开发的应用系统间的集成问题，成为解决Inter-SOA，最通用最好的技术手段。但是，如果良药乱用，只要谈到SOA，就要用WebService，那么&#8220;良药&#8221;服用过量，也会中毒。在构建企业的应用、或新建系统的建设时，都考虑将业务封装成webservice的方式以适应业务的变化，这并非合理的选择。<br />
&nbsp;在儒家文化的一种理念价值观就是&#8220;中庸之道，过犹不及&#8221;。对待Webservice的态度，我们面临的是同样的选择。<br />
&nbsp;&nbsp;&nbsp; 而有没有一种技术既能适应用外环境的变化，也能适应用内部系统的变化呢？那就需要intra-SOA和inter-SOA内外配合，前者从业务的角度来解决因业务的需求变化，后者从系统层面解决跨系统间业务与数据的整合。intra-SOA和inter-SOA &#8220;内外兼修&#8221;才能称之为完整的SOA解决方案。<br />
TmaxSoft的SOA之道<br />
&nbsp;&nbsp;&nbsp; 目前TmaxSoft提供了基于intra-SOA的ProFrame用来构建企来内部的SOA，同时也提供了基于inter-SOA的ESB产品ProBus来解决接口层异构系统EAI、workflow和多渠道接入的功能，从而提供由内到外的一整套SOA企业级完整解决方案。<br />
TmaxSoft把整个SOA框架分为四个层次：用户界面层(UI)、接口层(Interface)、业务层(Business)和数据层(Data)，其中在接口层提供基于Inter-SOA的解决方案、在业务层提供基于Intra-SOA的解决方案。 </p>
<p align="center"><img height="266" alt="（图二）Tmaxsoft企业级完整SOA解决方案" src="http://java.chinaitlab.com/UploadFiles_8734/200807/20080711105802485.gif" width="555" align="center" /><br />
（图二）Tmaxsoft企业级完整SOA解决方案</p>
<p>&nbsp;&nbsp;&nbsp; ProFrame是定义生成实现并重用SOA服务的Business Framework的核心解决方案。ProFrame最大化了基于SOA的下一代系统所要求的灵活性，重复性及<a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank">安全</a>性。 ProFrame的&#8220;Enterprise ModuleBus构架&#8221;是运用Gartner提出的&#8220;Microflows&#8221;概念，实现&#8220;Intra-SOA&#8221;的TmaxSoft的核心技术。通过ESB消除了系统与服务间的相互依赖性，提高了服务的可重用性。类似，通过EMB消除了组件或模块间的相互依赖性，从而提高了各模块的重用性。通过组合服务接口、单位模块，以及通过ESB构建的模块流程，构建了真正的服务组件。EMB的优点不仅在于可重用性，而且实现了服务的业务逻辑的可视性。因此用户不懂编程，也可以参与到设计与开发工作当中。其中ProFrame的核心就是EMB (Enterprise Module Bus)，它不同于ESB(Enterprise Service Bus)，但却有着异曲同工之妙，它通过把企业的业务逻辑按照Business Module和Service Module的方式，在ProFrame平台上进行开发与定义，通过EMB来统一管理Service Module，通过组合已有的模块产生各种新的服务，构建一个内部的SOA环境。构建的这些Business Module和Service Module可以复用和重新组合成新的服务，从而在企业内部形成一个intra-SOA的松耦合、可重用、高性能的SOA环境。</p>
<p align="center"><img height="219" alt="（图三）基于松耦合架的企业模块总线(Enterprise Module Bus)" src="http://java.chinaitlab.com/UploadFiles_8734/200807/20080711105804941.gif" width="551" align="center" /><br />
（图三）基于松耦合架的企业模块总线(Enterprise Module Bus)<br />
用EMB创建的服务由松耦合模块组成，保证了每个模块的独立性和系统结构的灵活性。松耦合组件提高了组件的重用性和系统的可维护性。<br />
&nbsp;ProBus是TmaxSoft的Inter-SOA中ESB解决方案，是TmaxSoft 对服务、应用、资源以及分散的服务组件进行连接或整合，提供可靠通信的ESB解决方案。它解决系统之间的互联、消息传递、转换、<a class="channel_keylink" href="http://cisco.chinaitlab.com/List_6.html" target="_blank">路由</a>、web服务支持、Flow的控制等。ProBus 以高性能的引擎结构保障稳定的服务，可以与BPM、MCI进行连动，灵活支持多种适配器，是真正实现SOA 2.0的ESB解决方案。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我们声称要构建SOA，于是新建的系统要遵循一系列的标准，要支持Webservice，很多原来可以直接以内部模块的方式非常高效的构建系统，现在为了SOA，为了支持异构系统的调用，把它封装成了Webservice，居不知，这正是噩梦的开始。Webservice基于SOAP<a class="channel_keylink" href="http://cisco.chinaitlab.com/List_11.html" target="_blank">协议</a>来进行通信，它传输数据的格式为XML，而每次调用Webservice时都需要传输XML格式的数据，对XML进行解析，这些都是出现性能瓶颈的罪魁祸首。<br />
<strong>总结<br />
</strong>&nbsp;&nbsp;&nbsp; 当我们需要构建复杂而高效的SOA环境时，Webservice的通讯方式和笨拙的数据<a class="channel_keylink" href="http://cisco.chinaitlab.com/List_7.html" target="_blank">交换</a>格式而引起的性能问题，注定无法让它在企业占据核心的地位，而TmaxSoft ProFrame提供了一套高效的基于SOA的Framework，基于Proframe来构建企业的核心应用，而WebService作为企业SOA解决方案中inter-SOA的首选技术。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 不论是基于inter-SOA还是intra-SOA，实施SOA的目的是一样的，那就是实现以业务为核心，提高IT系统扩展的灵活性以及IT资产的复用，达到业务灵活组合的状态。而WebService则是作为inter-SOA中首选的技术，而非解决SOA的唯一途径</p>
<img src ="http://www.blogjava.net/103335460/aggbug/227977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 16:15 <a href="http://www.blogjava.net/103335460/articles/227977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse下使用Xfire创建WebService入门示例（转）</title><link>http://www.blogjava.net/103335460/articles/227922.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227922.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227922.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227922.html</trackback:ping><description><![CDATA[<strong>关键字: Eclipse Xfire Java WebService</strong>
<div class="blog_content">
<h1><font face="Times New Roman">Web Service</font>概述</h1>
<h2>什么是<font face="Arial">Web Service</font></h2>
<p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web Service</font>是能够基于<a href="http://www.newasp.cn/" target="_blank"></a><a href="http://www.ahaoz.com/" target="_blank">网络</a>，尤其是基于万维网（<font face="Times New Roman">World Wide Web</font>）直接调用的能够处理离散任务或连续任务的<a href="http://www.ahaoz.com/" target="_blank">软件</a>模型。目前较为流行的应用是，由一家公司对其专有数据进行封装，提供<font face="Times New Roman">Web Service</font>，然后其它公司就可以通过<font face="Times New Roman">Internet</font>来动态使用这些在线服务。这为未来全球的电子商务发展提供了新的标准和架构。</p>
<h2><font face="Arial">Web Service</font>架构</h2>
<p><font face="Times New Roman">Web Service</font>是独立的、模块化的应用，能够通过因特网来描述、发布、定位以及调用。在<font face="Times New Roman">Web Service</font>的体系架构中包括三个角色：服务提供者<font face="Times New Roman">(Service Provider)</font>、服务请求者<font face="Times New Roman">(Service Requestor)</font>、服务注册器<font face="Times New Roman">(Service Registry)</font>。角色间主要有三个操作：发布<font face="Times New Roman">(Publish)</font>、查找<font face="Times New Roman">(Find)</font>、绑定<font face="Times New Roman">(Bind)</font>。</p>
<p>下图清楚的描述了三种角色，以及角色之间的作用关系。</p>
<p>图示一：</p>
<p align="center"><img alt="" src="http://www.itlove.net/Article/UploadPic/2005-8/200582555613204.jpg" border="0" _counted="undefined" /><br />
</p>
<h2><font size="1">图示二：</font></h2>
<p>这个流程图显示了Web Services中的核心技术是如何工作的。 </p>
<p>　　这里，Provider是提供服务的应用程序组件，Requester是使用服务的客户端程序。很多其他技术也会参与到交互中，但是这个图只显示了在Web Services环境中必需的核心技术组件。</p>
<p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://117.photo.pp.sohu.com/images/blog/2007/8/17/10/5/1150b9654b0.jpg" border="0" _counted="undefined" /></p>
<h2><font face="Arial">Web Service</font>协议标准</h2>
<h3><font size="5">简单对象访问协议（<font face="Times New Roman">SOAP</font>）</font></h3>
<p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP</font>是<font face="Times New Roman">Simple Object Access Protocol</font>的缩写，是一种基于<font face="Times New Roman">XML</font>的不依赖传输协议的表示层协议，用来在分散或分布式的应用<a href="http://www.ahaoz.com/" target="_blank">程序</a>之间方便地以对象的形式交换数据。在<font face="Times New Roman">SOAP</font>的下层，可以是<font face="Times New Roman">HTTP/HTTP</font>，也可以是<font face="Times New Roman">SMTP/POP3</font>，还可以是为一些应用而专门设计的特殊的通信协议。</p>
<p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP</font>包括三个主要部分：</p>
<p>&#178;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Times New Roman">SOAP</font>封装结构：定义了一个整体框架，以表示消息中包含什么<a href="http://www.ahaoz.com/" target="_blank">内容</a>，谁来处理这些<a href="http://www.ahaoz.com/" target="_blank">内容</a>以及这些<a href="http://www.ahaoz.com/" target="_blank">内容</a>是可选的或是必需的。</p>
<p>&#178;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Times New Roman">SOAP</font>编码规则：定义了用以交换应用<a href="http://www.ahaoz.com/" target="_blank">程序</a>定义的数据类型的实例的一系列机制。</p>
<p>&#178;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Times New Roman">SOAP RPC</font>表示：定义了一个用来表示远程过程调用和应答的协定。</p>
<h3><font size="5"><font face="Times New Roman">Web Service</font>描述语言（<font face="Times New Roman">WSDL</font>）</font></h3>
<p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSDL</font>是<font face="Times New Roman">Web Service Des cription Language</font>的缩写，该语言将<a href="http://www.newasp.cn/" target="_blank"></a><a href="http://www.ahaoz.com/" target="_blank">网络</a>服务定义成一个能交换消息的通信端点集，为分布式<a href="http://www.ahaoz.com/" target="_blank">系统</a>提供了帮助文档，同时也可作为自动实现应用间通信的解决方案。</p>
<h3><font size="5">统一描述、发现和集成协议（<font face="Times New Roman">UDDI</font>）</font></h3>
<p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UDDI</font>是一套基于<font face="Times New Roman">Web</font>的、分布式的、为<font face="Times New Roman">Web Service</font>提供的、信息注册中心的实现标准规范，同时也包含一组使企业能将自身提供的<font face="Times New Roman">Web Service</font>注册，以使别的企业能够发现的访问协议的实现标准。</p>
<p>以上概念转自<a href="http://www.itlove.net/Article/203/207/2005/2005082532541.html">http://www.itlove.net/Article/203/207/2005/2005082532541.html</a></p>
<p><font face="Arial" size="5"><strong>XFire</strong></font></p>
<p>XFire是一个免费的开源SOAP框架，它不仅可以极大方便地实现这样一个环境，并且可以提供许多Web Services规范中高级特征，这些特征在多数的商业或者开源工具都没有提供。<a href="http://xfire.codehaus.org/Download">http://xfire.codehaus.org/Download</a>是它的官方网站下载区，同时你也可以了解关于它的更多内容。</p>
<p><font face="Arial" size="5"><strong>创建过程示例</strong></font></p>
<p>下面我们就来使用Java构建一个WebService并且构建一个客户端来测试访问它。</p>
<p>&nbsp;&nbsp;&nbsp;首先请确保你的JDK和Tomcat在Eclipse环境中是可用的，配置方法不做赘述。并且你了解一些java编程技术和tomcat的发布常识。</p>
<p>版本信息：MyEclipse6.0.0M1；Tomcat6.0；JDK1.5；Xfire1.2</p>
<p>1、打开MyEclipse新建一个WebService Project，为你的项目命名，我选择了Java EE5.0，项目在你的WorkSpace目录下。下一步：看到了这个界面</p>
<p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://118.img.pp.sohu.com/images/blog/2007/8/17/10/25/1150ba8b5d8.jpg" border="0" _counted="undefined" /></p>
<p>在这里Eclipse为你创建了webService的配置文件services.xml（主意文件名是有&#8220;s&#8221;的），并进行了Xfire的Servlet基本配置告诉项目你使用了Xfire改信息将体现在项目的web.xml文件中。继续下一步，加载Xfire相关的jar包，你看到了</p>
<p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://117.photo.pp.sohu.com/images/blog/2007/8/17/11/3/1150bb03dee.jpg" border="0" _counted="undefined" /></p>
<p>在这个项目里我勾选了Xfire1.2 Core Libraries；HTTP Client Libraries；XML Beans Libraries。主要是确保引入了这些包包：</p>
<li><a>　　&#8226; activation-1.0.2.jar </a>
<li><a>　　&#8226; commons-codec-1.3.jar </a>
<li><a>　　&#8226; commons-httpclient-3.0.jar </a>
<li><a>　　&#8226; commons-logging-1.0.4.jar </a>
<li><a>　　&#8226; jaxen-1.1-beta-8.jar </a>
<li><a>　　&#8226; jdom-1.0.jar </a>
<li><a>　　&#8226; log4j-1.2.x.jar </a>
<li><a>　　&#8226; mail-1.3.3_01.jar </a>
<li><a>　　&#8226; spring-1.2.x.jar </a>
<li><a>　　&#8226; stax-api-1.0.jar </a>
<li><a>　　&#8226; wsdl4j-1.5.2.jar </a>
<li><a>　　&#8226; wstx-asl-2.9.jar </a>
<li><a>　　&#8226; xbean-2.1.0.jar </a>
<li><a>　　&#8226; xbean-spring-2.2.jar </a>
<li><a>　　&#8226; xfire-all-1.0.jar </a>
<li><a>　　&#8226; XmlSchema-1.0.jar </a>
<p>如果你好奇其他的包包是做什么用的就有待于我们在今后的学习中继续探究了～点击&#8220;Finish&#8221;完成了项目创建。目录结构如下图所示：</p>
<p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://115.img.pp.sohu.com/images/blog/2007/8/17/11/17/1150bb3db4c.jpg" border="0" _counted="undefined" /></p>
<p>打开web.xml我们可以看到如下片断：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>0</span><span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">welcome-file-list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">welcome-file</span><span class="tag">&gt;</span><span>index.jsp</span><span class="tag">&lt;/</span><span class="tag-name">welcome-file</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">welcome-file-list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>接下来的工作是开始编写java类接下来我们要写一个服务端java类。模拟应用是一个银行转账应用，从账户A转账到账户B并需要给出金额和货币种类。我们先来实现一个接口IBanking<span class="hilite3">Service</span>.java代码全文如下： </p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.mybank.<span class="hilite1">xfire</span>.example; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;IBanking<span class="hilite3">Service</span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;transferFunds( &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span class="keyword">double</span><span>&nbsp;amount,&nbsp;String&nbsp;currency); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>然后编写一个普通的Java类Banking<span class="hilite3">Service</span>包含了一个叫做transferFunds()的方法来为我们完成这项工作。它需要四个输入参数: </p>
<ul><a></a>
    <li><a>　　1、 String fromAccount </a>
    <li><a>　　2、 String toAccount </a>
    <li><a>　　3、 double amount </a>
    <li><a>　　4、 String currency </a></li>
</ul>
<p><a>　　代码如下:</a></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.mybank.<span class="hilite1">xfire</span>.example; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.text.NumberFormat; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.text.DecimalFormat; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Banking<span class="hilite3">Service</span>&nbsp;</span><span class="keyword">implements</span><span>&nbsp;IBanking<span class="hilite3">Service</span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="comment">//Default&nbsp;constructor. </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Banking<span class="hilite3">Service</span>(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;Transfers&nbsp;fund&nbsp;from&nbsp;one&nbsp;account&nbsp;to&nbsp;another. </span>&nbsp;
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;transferFunds( &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span class="keyword">double</span><span>&nbsp;amount,&nbsp;String&nbsp;currency){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;statusMessage&nbsp;=&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&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>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用业务逻辑执行操作. </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//建立并返回状态信息. </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberFormat&nbsp;formatter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DecimalFormat(</span><span class="string">"###,###,###,###.00"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusMessage&nbsp;=&nbsp;</span><span class="string">"COMPLETED:&nbsp;"</span><span>&nbsp;+&nbsp;currency&nbsp;+&nbsp;</span><span class="string">"&nbsp;"</span><span>&nbsp;+&nbsp;formatter.format(amount)+&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">"&nbsp;was&nbsp;successfully&nbsp;transferred&nbsp;from&nbsp;A/C#&nbsp;"</span><span>&nbsp;+&nbsp;fromAccount&nbsp;+&nbsp;</span><span class="string">"&nbsp;to&nbsp;A/C#&nbsp;"</span><span>&nbsp;+&nbsp;toAccount; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusMessage&nbsp;=&nbsp;</span><span class="string">"Banking<span class="hilite3">Service</span>.transferFunds():&nbsp;EXCEPTION:&nbsp;"</span><span>&nbsp;+&nbsp;e.toString(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;statusMessage; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>｝ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>你可以看到Banking<span class="hilite3">Service</span>是一个普通的Java类，没有任何代码告诉我们它将会在<span class="hilite2">Web</span> <span class="hilite3">Service</span>s中使用。只是要有默认的构造函数，类型是public。这是必须的。否则，<span class="hilite1">XFire</span>不能够初始化这个类。好的，这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。</p>
<p><strong><span class="hilite2">Web</span>应用的部署描述符</strong> </p>
<p>　　在Java中，<span class="hilite2">Web</span>应用程序通常需要至少一个部署描述符(叫做<span class="hilite2">web</span>.xml)对其进行配置。<span class="hilite1">XFire</span>本身是一个基于servlet的应用程序。因此，我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的<span class="hilite2">Web</span> <span class="hilite3">Service</span>s。我们使用一个称为<span class="hilite3">service</span>s.xml的新文件来完成这件事。在使用Eclipse工具构建工程的时候我们已经完成了这项配置（参见（上）文）。</p>
<p><font face="Verdana"><strong><span class="hilite3">service</span>s.xml</strong></font> </p>
<p><a>　　现在我们不得不说一下我们的<span class="hilite2">Web</span> <span class="hilite3">Service</span>s的由什么组成的了。这由一个叫做<span class="hilite3">service</span>s.xml的文件完成，当这个项目在tomcat发布后，它存放在<span class="hilite2">WEB</span>-INF/classes/META-INF/<span class="hilite1">xfire</span>目录下，它在<span class="hilite2">Web</span>应用程序的标准类路径中。而在Eclipse环境中我们可以清除的看到Eclipse已经为我们把它清楚的列在项目路径中。这里是<span class="hilite3">service</span>s.xml中的基本配置条目:</a></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><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://<span class="hilite1">xfire</span>.codehaus.org/config/1.0"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name"><span class="hilite3">service</span></span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>Banking</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">namespace</span><span class="tag">&gt;</span><span>mybank</span><span class="tag">&lt;/</span><span class="tag-name">namespace</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name"><span class="hilite3">service</span>Class</span><span class="tag">&gt;</span><span>com.mybank.<span class="hilite1">xfire</span>.example.IBanking<span class="hilite3">Service</span></span><span class="tag">&lt;/</span><span class="tag-name"><span class="hilite3">service</span>Class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">implementationClass</span><span class="tag">&gt;</span><span>com.mybank.<span class="hilite1">xfire</span>.example.Banking<span class="hilite3">Service</span></span><span class="tag">&lt;/</span><span class="tag-name">implementationClass</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name"><span class="hilite3">service</span></span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><span class="hilite2">Web</span> <span class="hilite3">Service</span>s的定义包含在元素中，它还含有一些子元素。</p>
<p>第一个子元素是<name></name>Banking，它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如，在服务准备好以后，你将在浏览器上使用这个名字来查看WSDL。</p>
<p><font face="Verdana">下一个子元素是<namespace></namespace>。任何合法的XML名字都是可以的。<namespace></namespace>用来唯一标识你的服务的各个参数。（注释@）</font></p>
<p><font face="Verdana"><em>注释@：Namespace派什么用？namespace的作用是要避免命名冲突。如果我建立一项<span class="hilite2">Web</span> <br />
<span class="hilite3">Service</span>，其中的WSDL文件包含一个名为"foo"的元素，而你想要使用我的服务与另一项服务连接作为补充，这样的话另一项服务的WSDL文件就不能包含名为"foo"的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时，才可以取相同的名字。如果有了表示区别的namespace，我的网络服务里的"foo"就可以表示完全不同于另一个网络服务里"foo"的含义。在你的客户端里，你只要加以限制就可以引用我的"foo"。</em></font></p>
<p><font face="Verdana"><br />
<serviceclass></serviceclass>元素包含了Java类的名字，它指定了方法签名。在我们的例子中，它是接口IBanking<span class="hilite3">Service</span>。如果Java类没有实现任何接口，你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为<span class="hilite2">Web</span> <span class="hilite3">Service</span>s。</font> </p>
<p><a><font face="Verdana">　　<implementationclass></implementationclass>保存了实现方法的Java类名。这是一个可选元素。如果上一个元素<serviceclass></serviceclass>包含了一个接口，那么相应的实现类必须在这里指定。</font></a></p>
<p><a><font face="Verdana">　　就是这样。我们的<span class="hilite2">Web</span> <span class="hilite3">Service</span>s配置完成了</font>。</a></p>
<p><strong>我们如何知道<span class="hilite2">Web</span> <span class="hilite3">Service</span>正在工作呢?</strong> </p>
<p>　　为了了解<span class="hilite2">Web</span> <span class="hilite3">Service</span>是否正在工作，我们需要测试。首先，我们测试来看WSDL是否可用。我们在浏览器中输入URL。哪个URL?因为我们的应用程序的war文件是aa.war，并且在<span class="hilite3">service</span>s.xml中给出的服务名是Banking，WSDL的URL应该是:http://localhost:8080/aa/<span class="hilite3">service</span>s/Banking?wsdl。</p>
<p>　　请注意:URL的第一部分，例如，<a href="http://localhost:8080/">http://localhost:8080</a>，可能会根据你的应用服务器不同而不同。无论怎样，当你输入URL后，将会看到一个XML文档，这个文档叫做服务的WSDL。如果你看到了，这就是你的应用作为<span class="hilite2">Web</span> <span class="hilite3">Service</span>已经可用的第一个证明。</p>
<p>正确的执行情况：</p>
<p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://116.img.pp.sohu.com/images/blog/2007/8/17/14/24/1150c70b918.jpg" border="0" _counted="undefined" /></p>
<p>在这个WSDL中我们可以看到<span>&lt;</span><span>xsd:element</span><span> name</span><span>="</span><strong>transferFunds</strong><span>"</span><span>&gt;的服务方法明以及他的四个参数描述等信息。</span>但是这个测试是不够的。可能会发生这种情况，可以看到WSDL，但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了，我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。</p>
<p><strong>开发一个客户端</strong></p>
<p>编写BankClient.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.mybank.<span class="hilite1">xfire</span>.client; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.net.MalformedURLException; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.codehaus.<span class="hilite1">xfire</span>.<span class="hilite1">XFire</span>; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.codehaus.<span class="hilite1">xfire</span>.<span class="hilite1">XFire</span>Factory; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.codehaus.<span class="hilite1">xfire</span>.client.<span class="hilite1">XFire</span>ProxyFactory; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.codehaus.<span class="hilite1">xfire</span>.<span class="hilite3">service</span>.<span class="hilite3">Service</span>; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.codehaus.<span class="hilite1">xfire</span>.<span class="hilite3">service</span>.binding.Object<span class="hilite3">Service</span>Factory; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.mybank.<span class="hilite1">xfire</span>.example.IBanking<span class="hilite3">Service</span>; &nbsp;&nbsp;</span>
    <li class="alt"><span class="comment">/** </span>&nbsp;
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;AdminiDD </span>&nbsp;</span>
    <li class="alt"><span><span class="comment">&nbsp;* </span>&nbsp;</span>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BankClient&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;</span><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>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="comment">/*&nbsp;Call&nbsp;the&nbsp;<span class="hilite2">Web</span>&nbsp;<span class="hilite3">service</span> </span>&nbsp;
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;call<span class="hilite2">Web</span><span class="hilite3">Service</span>( &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span class="keyword">double</span><span>&nbsp;amount,&nbsp;String&nbsp;currency)&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;MalformedURLException,&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;a&nbsp;metadata&nbsp;of&nbsp;the&nbsp;<span class="hilite3">service</span>&nbsp;&nbsp;创建一个<span class="hilite3">service</span>的元数据&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite3">Service</span>&nbsp;<span class="hilite3">service</span>Model&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object<span class="hilite3">Service</span>Factory().create(IBanking<span class="hilite3">Service</span>.</span><span class="keyword">class</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"callSoap<span class="hilite3">Service</span>Local():&nbsp;got&nbsp;<span class="hilite3">service</span>&nbsp;model."</span><span>&nbsp;); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;a&nbsp;proxy&nbsp;for&nbsp;the&nbsp;deployed&nbsp;<span class="hilite3">service</span>&nbsp;为<span class="hilite1">XFire</span>获得一个代理工厂对象 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite1">XFire</span>&nbsp;<span class="hilite1">xfire</span>&nbsp;=&nbsp;<span class="hilite1">XFire</span>Factory.newInstance().get<span class="hilite1">XFire</span>(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite1">XFire</span>ProxyFactory&nbsp;factory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;<span class="hilite1">XFire</span>ProxyFactory(<span class="hilite1">xfire</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//得到一个服务的本地代理 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;<span class="hilite3">service</span>Url&nbsp;=&nbsp;</span><span class="string">"http://127.0.0.1:8080/wstest/<span class="hilite3">service</span>s/Banking"</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBanking<span class="hilite3">Service</span>&nbsp;client&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client&nbsp;=&nbsp;(IBanking<span class="hilite3">Service</span>)&nbsp;factory.create(<span class="hilite3">service</span>Model,&nbsp;<span class="hilite3">service</span>Url); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(MalformedURLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"WsClient.call<span class="hilite2">Web</span><span class="hilite3">Service</span>():&nbsp;EXCEPTION:&nbsp;"</span><span>&nbsp;+&nbsp;e.toString()); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Invoke&nbsp;the&nbsp;<span class="hilite3">service</span>&nbsp;调用服务&nbsp;返回状态结果信息 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;<span class="hilite3">service</span>Response&nbsp;=&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite3">service</span>Response&nbsp;=&nbsp;client.transferFunds(fromAccount,&nbsp;toAccount,&nbsp;amount,&nbsp;currency); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"WsClient.call<span class="hilite2">Web</span><span class="hilite3">Service</span>():&nbsp;EXCEPTION:&nbsp;"</span><span>&nbsp;+&nbsp;e.toString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite3">service</span>Response&nbsp;=&nbsp;e.toString(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"WsClient.call<span class="hilite2">Web</span><span class="hilite3">Service</span>():&nbsp;status="</span><span>&nbsp;+&nbsp;<span class="hilite3">service</span>Response);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Return&nbsp;the&nbsp;response </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;<span class="hilite3">service</span>Response; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>编写两个JSP页来模拟请求和响应</p>
<p>index.jsp；发送请求</p>
<p><!--page language="java" &#160; pageencoding="UTF-8-->
<BASE href="<%=basePath%></base>
">
<BASE href="<%=basePath%></base>
"><!--messag--></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span><!--page&#160;language=</span><span class="string">"java"</span><span>&#160;&#160;pageEncoding=</span><span class="string">"UTF-8"</span><span-->&nbsp;&nbsp;</span></span>
    <li class=""><span><!--&#160;</span></li>
    <li class="alt"><span>String&#160;path&#160;=&#160;request.getContextPath(); &#160;&#160;</span></li>
    <li class=""><span>String&#160;basePath&#160;=&#160;request.getScheme()+</span><span class="string">"://"</span><span>+request.getServerName()+</span><span class="string">":"</span><span>+request.getServerPort()+path+</span><span class="string">"/"</span><span>; &#160;&#160;</span></li>
    <li class="alt"><span-->&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span><!--ctype&#160;html&#160;public&#160;</sp--><span class="string">"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"<!--asepat-->"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;<span class="string">"pragma"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;<span class="string">"cache-control"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;<span class="string">"expires"</span><span>&nbsp;content=</span><span class="string">"0"</span><span>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;<span class="string">"keywords"</span><span>&nbsp;content=</span><span class="string">"keyword1,keyword2,keyword3"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;<span class="string">"description"</span><span>&nbsp;content=</span><span class="string">"This&nbsp;is&nbsp;my&nbsp;page"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;<!-- &#160;&#160;</span></li>
    <li class="alt"><span>&#160;<link&#160;rel=</span /><span class="string">"stylesheet"</span><span>&#160;type=</span><span class="string">"text/css"</span><span>&#160;href=</span><span class="string">"styles.css"</span><span>> &#160;&#160;</span></li>
    <li class=""><span>&#160;--> &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;
    <h1><br />
    </h1>
    <h1>Welcomle&nbsp;to&nbsp;<span class="hilite2"><span class="hilite2">Web</span></span><span class="hilite3"><span class="hilite3">Service</span></span>!&nbsp;</h1>
    <br />
    &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;
    <hr />
    &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Bank&nbsp;test&nbsp;:&nbsp;give&nbsp;my&nbsp;money&nbsp;to&nbsp;you! &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"form1"</span><span>&nbsp;action=</span><span class="string">"say.jsp"</span><span>&nbsp;method=</span><span class="string">"POST"</span><span>&gt; &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;your&nbsp;account&nbsp;ID：<span class="string">"toAcc"</span><span>&nbsp;type=</span><span class="string">"text"</span><span>/&gt;<br />
    &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;How&nbsp;much&nbsp;</span><span class="keyword">do</span><span>&nbsp;you&nbsp;want：<span class="string">"amount"</span><span>&nbsp;type=</span><span class="string">"text"</span><span>&nbsp;/&gt;<br />
    &nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"center"</span><span>&gt;<span class="string">"submit"</span><span>&nbsp;value=</span><span class="string">"提交"</span><span>&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span> </span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <div></div>
    <p>say.jsp，接收请求并返回响应结果<br />
    &nbsp; <br />
    </p>
    <div class="code_title">java 代码</div>
    <div class="dp-highlighter">
    <div class="bar"></div>
    <ol class="dp-j">
        <li class="alt"><span><span><!--page&#160;language=</span><span class="string">"java"</span><span>&#160;&#160;pageEncoding=</span><span class="string">"UTF-8"</span><span-->&nbsp;&nbsp;</span></span>
        <li class="">
        <li class="alt"><span><!--&#160;</span></li>
        <li class=""><span>String&#160;path&#160;=&#160;request.getContextPath(); &#160;&#160;</span></li>
        <li class="alt"><span>String&#160;basePath&#160;=&#160;request.getScheme()+</span><span class="string">"://"</span><span>+request.getServerName()+</span><span class="string">":"</span><span>+request.getServerPort()+path+</span><span class="string">"/"</span><span>; &#160;&#160;</span></li>
        <li class=""><span>&#160;&#160;</span></li>
        <li class="alt"><span>String&#160;toAcc&#160;=&#160;request.getParameter(</span><span class="string">"toAcc"</span><span>); &#160;&#160;</span></li>
        <li class=""><span class="keyword">double</span><span>&#160;amount&#160;=&#160;</span><span class="keyword">new</span><span>&#160;Integer(request.getParameter(</span><span class="string">"amount"</span><span>)).doubleValue(); &#160;&#160;</span></li>
        <li class="alt"><span>String&#160;fromAccount&#160;=&#160;</span><span class="string">"affman"</span><span>; &#160;&#160;</span></li>
        <li class=""><span>String&#160;currency&#160;=&#160;</span><span class="string">"RMB$"</span><span>; &#160;&#160;</span></li>
        <li class="alt"><span>String&#160;Message&#160;=&#160;ClientBean.callWebService(fromAccount,toAcc,amount,currency); &#160;&#160;</span></li>
        <li class=""><span-->&nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;</span>
        <li class=""><span><!--ctype&#160;html&#160;public&#160;</sp--><span class="string">"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class="alt"><span>&nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"<!--asepat-->"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;<span class="string">"pragma"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class=""><span>&nbsp;<span class="string">"cache-control"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class="alt"><span>&nbsp;<span class="string">"expires"</span><span>&nbsp;content=</span><span class="string">"0"</span><span>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </span>
        <li class=""><span>&nbsp;<span class="string">"keywords"</span><span>&nbsp;content=</span><span class="string">"keyword1,keyword2,keyword3"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class="alt"><span>&nbsp;<span class="string">"description"</span><span>&nbsp;content=</span><span class="string">"This&nbsp;is&nbsp;my&nbsp;page"</span><span>&gt; &nbsp;&nbsp;</span> </span>
        <li class=""><span>&nbsp;<!-- &#160;&#160;</span></li>
    <li class="alt"><span>&#160;<link&#160;rel=</span /><span class="string">"stylesheet"</span><span>&#160;type=</span><span class="string">"text/css"</span><span>&#160;href=</span><span class="string">"styles.css"</span><span>> &#160;&#160;</span></li>
    <li class=""><span>&#160;--> &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <h1>Welcomle&nbsp;to&nbsp;<span class="hilite2"><span class="hilite2">Web</span></span><span class="hilite3"><span class="hilite3">Service</span></span>!&nbsp;</h1>
        <br />
        &nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;
        <hr />
        &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;from&nbsp;<span class="hilite2"><span class="hilite2">Web</span></span><span class="hilite3"><span class="hilite3">Service</span></span>:<!--messag--> &nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
        <li class="alt"><span>&nbsp;&nbsp;</span>
        <li class=""><span>&nbsp;&nbsp;</span> </li>
    </ol>
    </div>
    <p>&nbsp;</p>
    <p>项目aa编译完毕并发布到Tomcat上，启动Tomcat测试开始！访问<a href="http://127.0.0.1:8080/aa/index.jsp">http://127.0.0.1:8080/aa/index.jsp</a></p>
    <p>执行效果：</p>
    <p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://117.photo.pp.sohu.com/images/blog/2007/8/17/14/10/1150c5b560f.jpg" border="0" _counted="undefined" /></p>
    <p>添上你的账户，想要多少钱就写多少钱，嘿嘿 提交！请求转发到say.jsp如果你看到下面的情况：</p>
    <p><img style="display: block; margin: 0px auto 10px; text-align: center" alt="" src="http://116.img.pp.sohu.com/images/blog/2007/8/17/14/16/1150c69daf3.jpg" border="0" _counted="undefined" /></p>
    <p>恭喜你！成功啦～ 可以看到有&nbsp;RMB$ 1,000.00 从affman（a fit foolish man～）的账户转到了liudan的账户上！</p>
    <p><strong>总结：</strong></p>
    <p><strong>基本的<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s开发步骤清单 </strong></p>
    <p><a><strong>　</strong>　这个清单总结了将一个Java方法发布为<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>所必须的步骤:</a></p>
    <ul><a></a>
        <li><a>　　1、 检查Java类的方法和默认构造函数确保为public </a>
        <li><a>　　2、 增加<span class="hilite1"><span class="hilite1">XFire</span></span> servlet相关条目到<span class="hilite2"><span class="hilite2">web</span></span>.xml中 </a>
        <li><a>　　3、 创建<span class="hilite3"><span class="hilite3">service</span></span>s.xml，把它放到<span class="hilite2"><span class="hilite2">WEB</span></span>-INF/classes/META-INF/<span class="hilite1"><span class="hilite1">xfire</span></span>目录下 </a>
        <li><a>　　4、 增加<span class="hilite1"><span class="hilite1">XFire</span></span>和第三方包到你的<span class="hilite2"><span class="hilite2">Web</span></span>应用的<span class="hilite2"><span class="hilite2">WEB</span></span>-INF/lib文件夹中 </a></li>
    </ul>
    <p>嗯～确实不复杂！</p>
    <p><font color="#0000ff">以上步骤均经过亲自测试执行，如有勘误请至mail to： </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#119;&#101;&#101;&#116;&#109;&#111;&#111;&#110;&#100;&#100;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#0000ff">sweetmoondd@hotmail.com</font></a><font color="#0000ff">&nbsp;欢迎指教和共同探讨</font></p>
    <p><font size="+0"><strong>以下相关讨论（转自原文<a href="http://www.360doc.com/showweb/0/0/516946.aspx">http://www.360doc.com/show<span class="hilite2"><span class="hilite2">web</span></span>/0/0/516946.aspx</a>）</strong></font></p>
    <p><strong><span class="hilite1"><span class="hilite1">XFire</span></span>的其他高级特性</strong> </p>
    <p><a>　　<span class="hilite1"><span class="hilite1">XFire</span></span>的使用可能比较简单，但是在特性和功能性上，它却占据着领导者的位置。下面是它的高级特性:</a></p>
    <ul><a></a>
        <li><a>　　---本地数据绑定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。数据绑定说明了<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s的XML请求和映射到Java对象的XML响应。 </a>
        <li><a>　　---使用StAX(Streaming API for XML)处理XML文档。同DOM的基于树和SAX的事件驱动的处理方式相比，StAX使用了拉(pull)机制，它使处理更快速，内存效率更高。 </a>
        <li><a>　　---支持多种传输协议，如HTTP、JMS(Java Message <span class="hilite3"><span class="hilite3">Service</span></span>)和JVM内部传输。 </a>
        <li><a>　　---嵌入式，这是<span class="hilite1"><span class="hilite1">XFire</span></span>的核心功能之一。你可以把这个SOAP引擎嵌入到你的应用中，完全隐藏所有<span class="hilite1"><span class="hilite1">XFire</span></span>特定引用，同样所有配置都是程序驱动。 </a>
        <li><a>　　---丰富的API，它使<span class="hilite1"><span class="hilite1">XFire</span></span>可高度自定义，允许开发者在不同的阶段截获请求，并且对他们进行处理。 </a>
        <li><a>　　---兼容最新的标准例如SOAP1.1(没有加密远程工程调用，或者RPC)和1.2、WSDL1.1、the <span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s Interoperability Organization&#8217;s Basic Profile 1.0、<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s Addressing和WS-Security。 </a></li>
    </ul>
    <p><a>　　最重要的是，<span class="hilite1"><span class="hilite1">XFire</span></span>属于新一代<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s引擎。不仅仅是营销用语，&#8220;新一代&#8221;有一些重要的意义。Apache Axis是第一代Java语言的<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s引擎，已经成为了所有后来工具的参考标准。在过去的几年里，Axis以及这些其它的工具已经在很多生产环境中进行了实地测试。从中得出的一个关键的问题就是<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s并不最适合RPC类型的通信。对于性能和效率，面向文档的消息形式是最好的方式。但是Apache Axis和很多其他的<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s引擎都被设计成了面向RPC的(尽管它们支持文档形式)。现在，整个行业正在开发新一代的SOAP引擎，设计为面向文档的。Apache已经宣布结束旧版本的Axis引擎开发，现在专注于Axis2，现在它的预发布版本是0.95。<span class="hilite1"><span class="hilite1">XFire</span></span>在今年的2月份发布了它的第一个产品版本(1.0)。它的下一个版本(1.1)仅仅在几个星期之后就进行了发布。</a></p>
    <p><a>　　</a><strong>局限性</strong> </p>
    <p><a>　　<span class="hilite1"><span class="hilite1">XFire</span></span>有些重要的局限性你应该清楚:</a></p>
    <ul><a></a>
        <li><a>　　---开发<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s的好的实践是从WSDL开始。大部分的SOAP引擎提供了从WSDL生成服务stub的工具。<span class="hilite1"><span class="hilite1">XFire</span></span>也提供了这样一个工具。但是它是基于注释(annotations-based)的，因此需要J2SE5.0。对于仍坚持使用J2SE1.4.x的人来说，它不是一个令人拍手叫好的工具，因为我们有很多其他方式来编写客户端，一个就是文章中演示的方式。 </a>
        <li><a>　　---附件支持，它将会包含在未来发行的版本中。 </a>
        <li><a>　　---易于学习的用户向导。<span class="hilite1"><span class="hilite1">XFire</span></span>团队在这个方面还有很多工作需要做。 </a></li>
    </ul>
    <p><a>　　<strong>结论</strong></a></p>
    <p><a>　　Java当前的趋势是简化技术的使用。因此，我们正看到一波基于POJO的开发成就。同时，面向服务架构(SOA，<span class="hilite3"><span class="hilite3">Service</span></span>s-oriented architecture)和<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s已经变成了当前行业的热点话题。<span class="hilite1"><span class="hilite1">XFire</span></span>正是在这种情况下产生的。它能够使POJO发布为最少的<span class="hilite2"><span class="hilite2">Web</span></span> <span class="hilite3"><span class="hilite3">Service</span></span>s，而只需要付出最小化的努力。从而，它使希望使用这项技术的初级开发者的学习曲线变得平缓。同时，由于它兼容最新标准和提供了丰富的API，<span class="hilite1"><span class="hilite1">XFire</span></span>为高级用户提供了更多的大好机会。</a></p>
    </li>
</ol>
</div>
</li>
</div>
<img src ="http://www.blogjava.net/103335460/aggbug/227922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 13:24 <a href="http://www.blogjava.net/103335460/articles/227922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache cxf入门（转）</title><link>http://www.blogjava.net/103335460/articles/227892.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227892.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227892.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227892.html</trackback:ping><description><![CDATA[<p><strong>一、入门</strong><br />
1.下载apache cxf框架</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 是人都知道去官方网站去下载就行了。</p>
<p>2.配置过程</p>
<p>2.1 web.xml文件</p>
<p>配置为以下内容即可：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt; &lt;web-app&gt;</p>
<p>&nbsp;&lt;display-name&gt;WebServicesClient&lt;/display-name&gt; &nbsp;&lt;description&gt;Hebbn WebServices Client&lt;/description&gt;</p>
<p>&nbsp;&lt;context-param&gt; &nbsp;&nbsp;&lt;param-name&gt;webAppRootKey&lt;/param-name&gt; &nbsp;&nbsp;&lt;param-value&gt;HebbnClient.root&lt;/param-value&gt; &nbsp;&lt;/context-param&gt; &nbsp;&lt;context-param&gt; &nbsp;&nbsp;&lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt; &nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt; &nbsp;&lt;/context-param&gt; &nbsp;&lt;context-param&gt; &nbsp;&nbsp;&lt;param-name&gt;log4jRefreshInterval&lt;/param-name&gt; &nbsp;&nbsp;&lt;param-value&gt;60000&lt;/param-value&gt; &nbsp;&lt;/context-param&gt; &nbsp;&lt;context-param&gt; &nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &nbsp;&nbsp;&lt;param-value&gt; &nbsp;&nbsp;&nbsp;/WEB-INF/applicationContext.xml &nbsp;&nbsp;&lt;/param-value&gt; &nbsp;&lt;/context-param&gt;</p>
<p>&nbsp;&lt;listener&gt; &nbsp;&nbsp;&lt;listener-class&gt; &nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener &nbsp;&nbsp;&lt;/listener-class&gt; &nbsp;&lt;/listener&gt; &nbsp;&lt;listener&gt; &nbsp;&nbsp;&lt;listener-class&gt; &nbsp;&nbsp;&nbsp;org.springframework.web.util.IntrospectorCleanupListener &nbsp;&nbsp;&lt;/listener-class&gt; &nbsp;&lt;/listener&gt; &nbsp;&lt;listener&gt; &nbsp;&nbsp;&lt;listener-class&gt; &nbsp;&nbsp;&nbsp;org.springframework.web.context.request.RequestContextListener &nbsp;&nbsp;&lt;/listener-class&gt; &nbsp;&lt;/listener&gt; &nbsp;&lt;listener&gt; &nbsp;&nbsp;&lt;listener-class&gt; &nbsp;&nbsp;&nbsp;org.springframework.web.util.Log4jConfigListener &nbsp;&nbsp;&lt;/listener-class&gt; &nbsp;&lt;/listener&gt;</p>
<p>&nbsp;&lt;servlet&gt; &nbsp;&nbsp;&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt; &nbsp;&nbsp;&lt;display-name&gt;CXF Servlet&lt;/display-name&gt; &nbsp;&nbsp;&lt;servlet-class&gt; &nbsp;&nbsp;&nbsp;org.apache.cxf.transport.servlet.CXFServlet &nbsp;&nbsp;&lt;/servlet-class&gt; &nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &nbsp;&lt;/servlet&gt;</p>
<p>&nbsp;&lt;servlet-mapping&gt; &nbsp;&nbsp;&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt; &nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt; &nbsp;&lt;/servlet-mapping&gt; &nbsp;&lt;session-config&gt; &nbsp;&nbsp;&lt;session-timeout&gt;30&lt;/session-timeout&gt; &nbsp;&lt;/session-config&gt;</p>
<p>&nbsp;&lt;!-- MIME mapping --&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;inc&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/plain&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt;</p>
<p>&nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;doc&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;gif&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;image/gif&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;htm&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/html&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;html&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/html&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;jad&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/vnd.sun.j2me.app-descriptor&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;jnlp&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/x-java-jnlp-file&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;jpeg&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;image/jpeg&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;jpg&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;image/jpeg&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;js&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/x-javascript&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;pdf&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/pdf&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;png&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;image/png&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;rar&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/x-rar-compressed&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;txt&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/plain&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;xls&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/vnd.ms-excel&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;xml&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/xml&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;xul&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/vnd.mozilla.xul-xml&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;zhtml&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/html&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;zip&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;application/x-zip&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;zul&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/html&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;wsdl&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/xml&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt;</p>
<p>&nbsp;&lt;mime-mapping&gt; &nbsp;&nbsp;&lt;extension&gt;xsd&lt;/extension&gt; &nbsp;&nbsp;&lt;mime-type&gt;text/xml&lt;/mime-type&gt; &nbsp;&lt;/mime-mapping&gt; &nbsp;&lt;welcome-file-list&gt; &nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &nbsp;&lt;/welcome-file-list&gt; &lt;/web-app&gt; </p>
<p>主要的就是apace cxf那个servlet的配置参数以及spring的一些配置参数要搞对就行了。</p>
<p>2.2 spring的配置文件</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>" &nbsp;xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" &nbsp;xmlns:jaxws="<a href="http://cxf.apache.org/jaxws">http://cxf.apache.org/jaxws</a>" &nbsp;xsi:schemaLocation=" <a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a> <a href="http://www.springframework.org/schema/beans/spring-beans.xsd">http://www.springframework.org/schema/beans/spring-beans.xsd</a> <a href="http://cxf.apache.org/jaxws">http://cxf.apache.org/jaxws</a> <a href="http://cxf.apache.org/schemas/jaxws.xsd">http://cxf.apache.org/schemas/jaxws.xsd</a>"&gt; &nbsp;&lt;import resource="classpath:META-INF/cxf/cxf.xml" /&gt; &nbsp;&lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&gt; &nbsp;&lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&gt;</p>
<p>&nbsp;&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &nbsp;&nbsp;&lt;property name="locations"&gt; &nbsp;&nbsp;&nbsp;&lt;list&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;WEB-INF/jdbc.properties&lt;/value&gt; &nbsp;&nbsp;&nbsp;&lt;/list&gt; &nbsp;&nbsp;&lt;/property&gt; &nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &nbsp;&nbsp;&lt;property name="driverClassName" value="${jdbc.driverClassName}"/&gt; &nbsp;&nbsp;&lt;property name="url" value="${jdbc.url}"/&gt; &nbsp;&nbsp;&lt;property name="username" value="${jdbc.username}"/&gt; &nbsp;&nbsp;&lt;property name="password" value="${jdbc.password}"/&gt; &nbsp;&nbsp;&lt;property name="maxActive" value="${jdbc.maxActive}"/&gt; &nbsp;&nbsp;&lt;property name="initialSize" value="${jdbc.initialSize}"/&gt; &nbsp;&nbsp;&lt;property name="maxWait" value="${jdbc.maxWait}"/&gt; &nbsp;&nbsp;&lt;property name="minIdle" value="${jdbc.minIdle}"/&gt; &nbsp;&nbsp;&lt;property name="testOnBorrow" value="true"/&gt; &nbsp;&nbsp;&lt;property name="testOnReturn" value="true"/&gt; &nbsp;&nbsp;&lt;property name="testWhileIdle" value="true"/&gt; &nbsp;&nbsp;&lt;property name="validationQuery" value="select 1 from dual"/&gt; &nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- Transaction manager for a single JDBC DataSource --&gt; &nbsp;&lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt; &nbsp;&nbsp;&lt;property name="dataSource" ref="dataSource"/&gt; &nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;jaxws:endpoint id="testServices" implementor="com.tsxd.hebbn.services.TestServices" address="/testServices" /&gt; &nbsp; &lt;/beans&gt;</p>
<p>如果要操作数据库的话就带着配置参数中数据库相关的部分，但是在apace cxf的下载包中不包含数据库相关的spring库文件，需要自己下载。单纯的想测试Apache CXF的话就留着最后一行就得了。</p>
<p>2.3 Java测试代码</p>
<p>2.3.1 接口类源代码</p>
<p>注意那个@WebService</p>
<p>package com.tsxd.hebbn.services;</p>
<p>import javax.jws.WebService; @WebService public interface ITestServices {</p>
<p>&nbsp; &nbsp;public java.util.Date getServerDate(); &nbsp; &nbsp;public String sayHello(String name); } </p>
<p>2.3.2 实现类代码</p>
<p>package com.tsxd.hebbn.services;</p>
<p>import java.util.Date;</p>
<p>import javax.jws.WebService;</p>
<p>@WebService(endpointInterface="com.tsxd.hebbn.services.ITestServices") public class TestServices implements ITestServices {</p>
<p>&nbsp;public Date getServerDate() { &nbsp;&nbsp;return new Date(); &nbsp;}</p>
<p>&nbsp;public String sayHello(String name) { &nbsp;&nbsp;if (null==name){ &nbsp;&nbsp;&nbsp;return "fuck u"; &nbsp;&nbsp;} &nbsp;&nbsp;return "hello :"+name; &nbsp;}</p>
<p>} </p>
<p>也是注意那个@WebService声明。</p>
<p>2.4 测试</p>
<p>部署到tomcat中去，因为在web.xml文件中配置了cxf servlet 类mapping到/services路径，所以访问时</p>
<p><a href="http://ip/">http://IP</a>地址:端口号/应用程序上下文/services/就行了</p>
<p>应该会有已经配置好的services的列表,像下边这样：</p>
<p><a href="http://localhost:8080/HebbnWebServices/services/testServices?wsdl">{http://services.hebbn.tsxd.com/}TestServicesPort</a> </p>
<p>点击联接可以查看WSDL描述</p>
<p>2.5 最后</p>
<p>&nbsp;&nbsp;&nbsp; 这个破Apache CXF和spring绑的也太紧密了，用spring的话就会造成生成的wsdl描述中参数名称都变成args0这样无意义的名称，不好，不喜欢，结论，还是直接用xfire就行了，没必要用这个巨大的CXF.<br />
<br />
<br />
<br />
<br />
<br />
<strong>二、入门</strong></p>
<p>1. 为CXF设置编译和开发环境</p>
<p>打开eclipse（其他的IDE也可以），引入如下的类库（也可以省事一点，把CXF\lib路径下的所有类库都引入）</p>
<p>commons-logging-1.1.jar</p>
<p>geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)</p>
<p>geronimo-annotation_1.0_spec-1.1.jar (JSR 250)</p>
<p>geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)</p>
<p>geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)</p>
<p>geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)</p>
<p>jaxb-api-2.0.jar</p>
<p>jaxb-impl-2.0.5.jar</p>
<p>jaxws-api-2.0.jar</p>
<p>neethi-2.0.jar</p>
<p>saaj-api-1.3.jar</p>
<p>saaj-impl-1.3.jar</p>
<p>stax-api-1.0.1.jar</p>
<p>wsdl4j-1.6.1.jar</p>
<p>wstx-asl-3.2.1.jar</p>
<p>XmlSchema-1.2.jar</p>
<p>xml-resolver-1.2.jar</p>
<p>引入Spring相关的jars (只对):</p>
<p>&nbsp;</p>
<p>aopalliance-1.0.jar</p>
<p>spring-core-2.0.4.jar</p>
<p>spring-beans-2.0.4.jar</p>
<p>spring-context-2.0.4.jar</p>
<p>spring-web-2.0.4.jar</p>
<p>&nbsp;</p>
<p>引入CXF相关的jar:</p>
<p>&nbsp;</p>
<p>cxf-2.0-incubator.jar</p>
<p>2. 编写自己的服务</p>
<p>在eclipse里创建一个J2EE的动态Web项目</p>
<p><br />
这里所有的例子代码都在 &#8220;D:\cxf\samples\java_first_spring_support&#8221;路径下。&#8220;d:\cxf&#8221;是CXF的安装路径。但是在这个路径下不包含</p>
<p>Web Service的例子源代码（怀疑是开发人员忘记了），需要手工在项目中生成。</p>
<p>&nbsp;</p>
<p>首先写一个服务接口，例子中的HelloWorld.java。我们要注意的是这个例子使用了JSR181规范中的声明&#8220;@WebService&#8221;。</p>
<p>package demo.spring;<br />
&nbsp;<br />
import javax.jws.WebService;<br />
&nbsp;<br />
@WebService<br />
public interface HelloWorld {<br />
&nbsp;&nbsp;&nbsp; String sayHi(String text);<br />
}<br />
下一步实现这个服务接口，例子中的HelloWorldImpl.java。这个例子代码中的&#8220;@WebService&#8221;标签只包含一个endpointInterface的属性，这</p>
<p>个属性让CXF知道根据哪个接口生成WSDL文件。这里有点和我们第一个例子不同，没有包含ServiceName属性。这是因为这个属性会在Spring的</p>
<p>配置文件中声明，请参考下面的beans.xml这个配置文件。</p>
<p>package demo.spring;<br />
&nbsp;<br />
import javax.jws.WebService;<br />
&nbsp;<br />
@WebService(endpointInterface = "demo.hw.server.HelloWorld")<br />
public class HelloWorldImpl implements HelloWorld {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public String sayHi(String text) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello " + text;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p>3. 在Spring中声明你的服务Beans</p>
<p>CXF中包含对Spring2.0很好的支持。对于JAX-WS这一类配置，我们有&lt;jaxws:endpoint&gt;bean作为服务端节点的配置说明。</p>
<p>让我们创建一个&#8221;beans.xml&#8221;文件在我们项目的WEB-INF路径下，注意这个文件的例子可以在&#8220;D:\cxf\samples\java_first_spring_support\</p>
<p>&#8221;中找到。</p>
<p>&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:jaxws="http://cxf.apache.org/jaxws"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="<br />
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd<br />
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="classpath:META-INF/cxf/cxf.xml" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;jaxws:endpoint <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id="helloWorld" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; implementor="demo.spring.HelloWorldImpl" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address="/HelloWorld" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;/beans&gt;<br />
这里我们可以看到&lt;jaxws:endpoint&gt;的三个属性id, implementor和address。</p>
<p>&#8220;id&#8221;指定这个Bean在Spring上下文中唯一的标识。</p>
<p>&#8220;implementor&#8221;指定了这个Web Service的实现类。</p>
<p>&#8220;address&#8221;指定了服务在Web服务器上发布的地址。这个地址可以包含ip和端口的完整地址，也可以是只包含相对路径的地址。</p>
<p>&nbsp;</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置你的Servlet</p>
<p>配置的过程中我们需要在web.xml中添加如下两项：</p>
<p>第一个是Spring的ContextLoaderListerp类会在启动时加载上面配置beans.xml文件。我们需要设定context-param节点；第二个是增加一个CXF </p>
<p>Servlet。配置文件如下，注意这个文件可以在&#8220;D:\cxf\samples\java_first_spring_support\&#8221;中找到。</p>
<p>&lt;web-app&gt;<br />
&nbsp;&nbsp; &lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;WEB-INF/beans.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp; &lt;/context-param&gt;<br />
&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.context.ContextLoaderListener<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listener-class&gt;<br />
&nbsp;&nbsp; &lt;/listener&gt;<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;CXF Servlet&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.cxf.transport.servlet.CXFServlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;<br />
这里需要注意的是你配置的endpoint的地址（address）属性必须和你在Beans.xml中定义的一致。尽管在我们的例子中没有在</p>
<p>HelloWorldImpl.java中声明&#8220;address&#8220;属性，我们也需要在实际的配置中有所注意。</p>
<p>&nbsp;</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CXF引入了一个JaxWsProxyFactory bean，他可以根据服务接口创建一个客户端程序。你只需要告诉服务类是什么（这个例子中是</p>
<p>HelloWorld interface这个类）和服务的URL就可以了。你可以通过JaxWsProxyFactory的create方法来生成一个客户端的bean。</p>
<p>下面是配置bean的例子</p>
<p>&lt;beans xmlns="http://www.springframework.org/schema/beans"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:jaxws="http://cxf.apache.org/jaxws"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="</p>
<p>http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd</p>
<p>http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd"&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;bean id="client" class="demo.spring.HelloWorld" </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory-bean="clientFactory" factory-method="create"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serviceClass" value="demo.spring.HelloWorld"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="address" value="http://localhost:9002/HelloWorld"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&lt;/beans&gt;</p>
<p>&nbsp;</p>
<p>如果你在客户端代码要使用这个bean，代码会非常简单，例子如下</p>
<p>ApplicationContext context = ...; // your Spring ApplicationContext</p>
<p>HellWorld client = (HelloWorld) context.getBean("client");</p>
<p>&nbsp;</p>
<p>客户端的例子代码Client.java和配置文件例子client-beans.xml都可以在</p>
<p>&#8220;D:\cxf\samples\java_first_spring_support\src\demo\spring\client&#8220;中找到。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>例子的运行，我们可以通过两种方式来运行我们完成的例子。</p>
<p>一．&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用ant来直接运行CXF安装路径下的samples。方法可以参考D:\cxf\samples\ReadMe.txt文件。</p>
<p>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先在&#8220;D:\cxf\samples&#8221;创建了一个&#8221;setenv.cmd&#8221;文件，文件内容如下：</p>
<p>set CXF_HOME=d:\cxf</p>
<p>set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_13</p>
<p>set ANT_HOME=d:\apache\ant</p>
<p>set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%CXF_HOME%\bin;%PATH%</p>
<p>set CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest-incubator.jar;.\build\classes</p>
<p>这个执行文件配置了运行CXF例子所需的环境变量。</p>
<p>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始-&gt;运行，敲入&#8220;cmd&#8221;，进入dos命令输入界面，进入CXF的spring例子的路径&#8220;D:\cxf\samples&#8221; 运行我们在上一步创建的</p>
<p>&#8220;setenv.cmd&#8221;, </p>
<p>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入&#8220;D:\cxf\samples\java_first_spring_support&#8221;,编译服务的代码。运行&#8220;ant&#8221;</p>
<p>d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动服务器&#8220;ant server&#8221;</p>
<p>e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始-&gt;运行，敲入&#8220;cmd&#8221;，进入dos命令输入界面，进入CXF的spring例子的路径&#8220;D:\cxf\samples&#8221; 运行我们在上一步创建的</p>
<p>&#8220;setenv.cmd&#8221;, </p>
<p>f)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动客户端&#8220;ant client&#8221;</p>
<p>&nbsp;</p>
<p>把我们上面eclipse中开发的Web项目打包为 war包的形式。部署到tomcat或者jetty服务器上。注意部署时访问的路径。比如我部署在Tomcat上</p>
<p>，访问的路径就是：http://localhost:8080/CXFSpring/HelloWorld<br />
</p>
<img src ="http://www.blogjava.net/103335460/aggbug/227892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 11:18 <a href="http://www.blogjava.net/103335460/articles/227892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache CXF 简介(转)</title><link>http://www.blogjava.net/103335460/articles/227887.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227887.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227887.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227887.html</trackback:ping><description><![CDATA[<p>CXF是 IONA的OpenSource ESB Celtix与 号称最快的Soap协议栈 XFire合并的 apache Incubate 项目。<br />
CXF是一个JAX-WS API的实现。<br />
CXF支持多种binding， transport。<br />
CXF支持也支持除JAX-WS之外的服务模型，例如JBI，CORBA，SCA等。</p>
<p>好在我把CXF项目的网站的链接给同学发了过程，与此同时我也注意到了 Apache CXF： An Open Source Service FrameWork 这个标题。 我想这很概括的回答了前面那个问题CXF是做什么的。</p>
<p>这个 Service Framework所做的工作就在将各种应用发布为Web Services。<br />
在发布你的应用之前你需要告诉CXF两个信息， 一个是 WSDL Contracts，一个是你服务应用的具体实现。</p>
<p>熟悉WSDL的朋友应该知道，WSDL提供了Web Servcies的服务描述，定义服务所提供的操作信息，以及操作支持消息数据信心。我们可以把这些信息称为是WSDL contracts。在CXF内部是通过</p>
<p>Service Model来描述这些WSDL Contracts的，这样做的目的有两个一个是屏蔽了WSDL1.1 与WSDL2.0之间的区别，另一个是为CXF内部运行环境提供了一个统一的服务信息描述接口。</p>
<p>这样以来我们可以很轻松的实行 WSDL &lt;--&gt; ServiceModel &lt;--&gt; Java Class Service Endpoint Interface(SEI)的转换。<br />
同时CXF可以同时支持WSDL First以及 Code First两种编程模型。</p>
<p>服务的实现可以是POJO ，也可以是使用JSR181标记过（Annoatated）的Java类实现，同时也可以是一个js文件。在CXF中通过不同的Front-End来支持这些不同的服务实现。 JAX-WS Front-End支持采用JAX-WS API创建服务。Simple Front-End 支持POJO服务实现。 JS Front-End则提供了java script服务实现的支持。<br />
<br />
<br />
<strong>Apache CXF 2.0的发布</strong><br />
</p>
<p>Apache最近宣布了Apache CXF 2.0的发布。Apache CXF提供了一套创建SOA服务的基础设施框架，用户由此可以按照自己喜欢的编程模式，利用</p>
<p>Apache CXF提供的简单易用工具（包括Maven插件），创建适合SOA环境的任何WEB服务，包括SOAP/HTTP服务及REST/HTTP服务。Apache CXF可扩</p>
<p>展的插拔式架构不但支持XML消息格式和HTTP通信协议，而且还支持基于其他通信协议如IIOP和非XML消息格式如CORBA CDL或JSON。</p>
<p>Apache CXF项目是由Objectweb Celtix和Codehaus XFire在一年前合并成立的。Objectweb Celtix是由IONA公司赞助、于2005年成立的开源</p>
<p>Java ESB产品，XFire则是业界知名的SOAP堆栈。合并后的Apache CXF融合该两个开源项目的功能精华，提供了实现SOA所需要的核心ESB功能框</p>
<p>架，包括SOA服务创建，服务路由，及一系列企业级QoS功能。此次发布代表了Apache CXF开发人员及社区用户一年的努力结果，并标志 Apache </p>
<p>CXF软件的进一步成熟，成为实现SOA的优秀技术解决方案之一。</p>
<p><br />
这次发布的新版本的特性包括：</p>
<p><br />
JAX-WS Compliant frontend - Apache CXF has now passed the standalone JAX-WS TCK.<br />
Java2WSDL and WSDL2Java tools and Maven plugin<br />
SOAP 1.1 &amp; 1.2, XML and RESTful HTTP bindings<br />
JAXB 2.0 Databinding support<br />
WSDL 1.1 support<br />
WS-Addressing, WS-ReliableMessaging, WS-Security, and WS-Policy support<br />
MTOM attachment and SOAP w/ Attachments support<br />
HTTP, Servlet, JMS and Local Transports<br />
Simple POJO service frontend<br />
Javascript frontend<br />
JBI Service Engine. CXF services can be deployed into any JBI compliant container (ServiceMix or OpenESB)<br />
JCA 1.0 support, J2EE application can integrate with legacy application through JCA 1.0 support in CXF<br />
Spring Support<br />
JSON support with Jettison<br />
Many other bug fixes and feature enhancements</p>
 <img src ="http://www.blogjava.net/103335460/aggbug/227887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:55 <a href="http://www.blogjava.net/103335460/articles/227887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis、Axis2和CXF：俯瞰WS风景(转)</title><link>http://www.blogjava.net/103335460/articles/227886.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227886.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227886.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227886.html</trackback:ping><description><![CDATA[<div>从事open source 的 web services开发是令人兴奋的。去年下半年发布了两个下一代的web services框架，他们都在Apache软件基金会下面。这两个框架分别是，在2006年四月末发布1.0的Apache Axis2，目前处在1.3的候选发布版本阶段（译注：1.3已经发布）；Apache CXF，它在2007年7月初发布了2.0版本（以CXF命名的第一个发布版本）。</div>
<div>这两个框架都是从已有项目中进化过来的。Axis2来自众所周知的Axis 1.x 系列。CXF按照字面来说是XFire和Celtix两个项目的后续，这两个项目融会了他们的代码库和开发团队就有了CXF。不论从哪个角度来看新旧项目之间都有显著区别。Axis2完全从头重写了Axis，使用了能够让功能更容易扩展的新模块架构。CXF从XFire和Celtix这两个起源上也做了广泛重构。</div>
<div>这引发了一些问题。已有使用Axis 1.x，XFire或者是Celtix的应用程序是否要移植到这些项目的新版本上呢？如果一个开发者决定要移植他（她）的应用到其中的一个新版本上，那他应该用哪个呢？相反的，如果某人正在从头开始开发新的web service又无需考虑移植，那他（她）又应该用哪个呢？是否一个框架生来就优于其他的呢？</div>
<div>让我们逐个处理这些问题。首先，已有应用是否需要移植？回答这个问题很大程度上依赖于你的应用到达了生命周期的哪个阶段。对于一个非常稳定成熟的项目，如果在可预计的未来很少或者根本不需要变化，那它可能就不需要移植，因为当前的框架很好的满足了需求。如果应用的性能或者功能受bug影响，那移植就值得做，特别是对使用Axis 1.x 的用户来说，因为围绕Axis的大部分开发者社区都把资源转向了Axis2。Axis 1.5 版本虽然正在进行中，但可能要数月才能完成。</div>
<div>对于需要移植的项目来说，最简单的就是移植到当前框架的下一个版本上。Axis2和CXF都为开发者提供了从之前版本到新版本的移植技巧指南，但他们都没有为web service从一个框架移植到另一个框架提供工具或者指南。尽管如此，对这类移植来说，查看所有可用的选择都是有价值的。在web service开发上Axis2和CXF走了不同的路子，对某些开发者来说，其中一条总比另一条需要付出更多。</div>
<div>这给我们带来了比较Axis2和CXF二者功过的好的角度。当然有二者很多可比较的地方，web services框架都必然地要满足所有相同需求，但因为这二者都非常年轻，都有某些领域比其他的做得更好。主要不同列在下面：</div>
<div>&nbsp;&nbsp;&nbsp; * CXF支持WS-Addressing，WS-Policy，WS-RM，WS-Security 和 WS-I 基本规范。Axis2支持除WS-Policy之外的所有协议，WS-Policy也会在即将到来的版本支持。</div>
<div>&nbsp;&nbsp;&nbsp; * CXF很容易和Spring集成，而Axis2不。</div>
<div>&nbsp;&nbsp;&nbsp; * Axis2支持范围更大的数据绑定，包括XMLBeans、JiBX、JaxMe和JaxBRI同时还有它自带的数据绑定方式－－ADB。注意对JaxME和JaxBRI的支持在Axis2 1.2中仍然处在实验阶段。CXF目前仅支持JAXB和Aegis，对XMLBeans、JiBX和Castor的支持将会在CXF 1.2中实现。</div>
<div>&nbsp;&nbsp;&nbsp; * Axsi2支持多种语言－－在java版本之外还有C/C++的版本可用。</div>
<div>然而在比较这些框架时，比较他们开发web services的方法与比较它们的特性同样重要。从开发者的角度看，这些框架彼此之间完全不同。Axis2走的路子在很多方面都像是一个微型的应用服务器。Axis2打包成WAR，这样它就能发布到像Tomcat之类的servlet容器中，它被设计的使web services更容易管理和发布。Axis2的Web管理模块允许Axis2在应用运行过程中动态配置－－新的服务可以上传、激活或者使其无效、他们的参数也可以改变。管理UI也允许模块在一个或者更多的正在运行的服务中生效。唯一不利的一面是，为达到这些目的使用UI所作的改变不能被持久化－－servlet容器重启之后就失效了。</div>
<div>Axis2有利于web services的独立，不依赖其他应用；提供了广泛多样的功能；通过模块化架构为添加新功能（随时间流逝，这总是可能的）提供了一个不错的模型。某些开发者或许会发现为实现他们的需求用Axis2有些太麻烦太笨重。这些开发者可能更喜欢Apache CXF。</div>
<div>CXF专注于开发者的高效和可嵌入性。大部分的配置通过API而不是繁琐的XML文件来实现，Spring的集成是个重点，包括支持Spring 2.0，CXF的API和Spring的配置映衬的相当紧密。CXF着重代码优先的设计，简单的API使从已有应用中开发服务更容易（嵌入性也有利于这点）。</div>
<div>不论你选择了哪个框架，你都将从活跃稳定的开源社区中受益。每个框架都有公司背景：Axis2源自WSO2，CXF源自Iona。两者都有活跃的开发者社区。Axis2已经存在很久了，但是CXF进步也很快。我的建议是：如果多语言支持是重要的，Axis2是很明显的选择。如果你在意与像Spring之类的项目紧密集成的Java实现，CXF是更好的选择，特别是对把web services嵌入其他程序的应用来说。如果这些项目中的新特性对你不太重要，而你又相对来说比较满意Axis1，那么可以考虑继续使用Axis1并紧跟最新的可用版本，直到有业务上的原因需要移植。</div>
<div><br />
原文地址： http://www.theserverside.com/tt/articles/article.tss?l=AxisAxis2andCXF</div>
<div>btw：<br />
&nbsp;&nbsp;&nbsp; 翻完之后发现这篇问题题目虽然比较吸引眼球，可好像也没说出些实质性内容来，有些地方甚至有些八卦。不过既然翻译了就贴出来，说不定还能给大家带来些茶余饭后的谈资：）<br />
</div>
<br />
<br />
新一代的 Web Services 框架如 Axis2、CXF 都是由现有的项目中逐渐演化而来的，Axis2 是由大家熟悉的 Axis 1.x 系列演化过来，而 Apache CXF 则是由 Celtix 和 XFire 项目整合而生，并且刚刚发布了 2.0.2 的最新版本，不过仍是 Apache 的一个孵化项目。 <br />
<br />
Axis2 是对 Axis 进行了彻底的重写的一个新项目了，它使用了新的模块化架构，更方便于功能性的扩展等等。 <br />
Apache CXF 则是由 XFire 和 Celtix 两个现有的项目进行了重组。 <br />
<br />
问题：如果现有的应用程序是基于 Axis 1.x、XFire 或者 Celtix 的话，那应该怎么办？都迁移到这些新的框架上去吗？但是即使是要迁移，那应该迁移到哪个框架上去呢？ <br />
如果是编写一个新的 Web Services 应用程序的话，就不存在迁移的问题了，但是哪个框架是你应当选择进行使用的呢？哪个比哪个更好呢？ <br />
<br />
对于现在的应用程序的迁移，如果你的应用程序是稳定而成熟的，并且在可预知的未来的情况下，只要很少的一些需求变更要做的话，那么保存你的体力，不要去做&#8220;劳民伤财&#8220;的迁移工作了。 <br />
如果你的现有应用程序BUG缠身，性能，功能等等都一片糟糕的话，那就要考虑迁移了，那选哪个框架呢？先比较一下它们的不同之处： <br />
<br />
　　1、Apache CXF 支持 WS-Addressing、WS-Policy、WS-RM、WS-Security和WS-I BasicProfile <br />
　　2、Axis2 支持 WS-Addressing、WS-RM、WS-Security和WS-I BasicProfile，WS-Policy将在新版本里得到支持 <br />
　　3、Apache CXF 是根据Spring哲学来进行编写的，即可以无缝地与Spring进行整合 <br />
　　4、Axis2 不是 <br />
　　5、Axis2 支持更多的 data bindings，包括 XMLBeans、JiBX、JaxMe 和 JaxBRI，以及它原生的 data binding（ADB）。 <br />
　　6、Apache CXF 目前仅支持 JAXB 和 Aegis，并且默认是 JAXB 2.0，与 XFire 默认是支持 Aegis 不同，XMLBeans、JiBX 和 Castor 将在 CXF 2.1 版本中得到支持，目前版本是 2.0.2 <br />
　　7、Axis2 支持多种语言，它有 C/C++ 版本。 <br />
　　8、Apache CXF 提供方便的Spring整合方法，可以通过注解、Spring标签式配置来暴露Web Services和消费Web Services <br />
<br />
如何抉择： <br />
1、如果应用程序需要多语言的支持，Axis2 应当是首选了； <br />
2、如果应用程序是遵循 Spring 哲学路线的话，Apache CXF 是一种更好的选择，特别对嵌入式的 Web Services 来说； <br />
3、如果应用程序没有新的特性需要的话，就仍是用原来项目所用的框架，比如 Axis1，XFire，Celtrix 或 BEA 等等厂家自己的 Web Services 实现，就别劳民伤财了。<br />
<br />
<br />
<br />
<br />
<br />
Axis和很多开源包使用的xml解析器都冲突,每次用都遇到问题,特别是再websphere下部署webservice就是恶梦. 有时间看看 CXF!<br />
<br />
CXF通过了JAXWS2.0的TCK，目前正在进行JAXWS2.1的开发工作。<br />
CXF的编程模型比AIXS2简单，而且在Stand alone的方式下执行效率比AXIS2要高很多。<br />
<br />
还有就是如果你还是在使用RPC/Encoding的方式，AXIS 1.x 是你唯一的选择了。 因为XFire , CXF 以及AXIS2 都不支持RPC/Encoding的编码方式，要说原因吗？那主要是在JAXWS 规范中已经把RPC/Encoding的方式抛弃掉了，因为这种编码方式的互操作性太差了。 <br />
<br />
如果你要用JAVA开发Web Services，那用JAXWS API开发可以保证你的代码在大多数Web Services Framework上正常运行。 
<img src ="http://www.blogjava.net/103335460/aggbug/227886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:50 <a href="http://www.blogjava.net/103335460/articles/227886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA介绍（一）（转）</title><link>http://www.blogjava.net/103335460/articles/227885.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227885.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227885.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227885.html</trackback:ping><description><![CDATA[<p>－、国内发展现状和应用需求<br />
&nbsp;&nbsp;&nbsp; SOA几乎已经成为企业应用架构的主流，从2006年6月22日计算机世界&#8220;中间件应用年会&#8221;上可以看出，大部分主题演讲都涉及到SOA的应用</p>
<p>和部署问题，IBM当前不仅以服务商的角色介入SOA，而且在此次大会上还带来了众多的SOA的成功实施案例；BEA公司也定位于SOA平台提供商，</p>
<p>并且推出了一系列产品和方案；国内软件企业，像中创、东方通科技以及金蝶、用友、科诺等公司也在不同程度地切入SOA工具或解决方案的开</p>
<p>发。种种迹象表明，SOA已经超越概念走向应用，并逐渐形成一股不可阻挡的潮流。</p>
<p><br />
二、Web Services开源热火朝天<br />
1.Web Services开源项目<br />
&nbsp;&nbsp;&nbsp; 作为SOA一种主要实行方式的Web Services，其开源项目正如火如荼。</p>
<p>&nbsp;&nbsp;&nbsp; Java6 发布，支持XML&amp;WebService, JDK就直接支持Web Services了。这样Sun强势参与Web Services的竞争。这种现象很有趣，各大厂商</p>
<p>在各自强项之间互相渗透，Sun被Apache Harmony项目所逼，被一些厂商要求两年后，将JDK开源，但同时也给IBM、BEA、Oracle等厂商反戈一</p>
<p>击，在刚发布的JDK 6中捆绑Web Services。</p>
<p>&nbsp;&nbsp;&nbsp; Axis2和XFire是最火的两个Web Services开源项目，但其他的项目也做得不错。</p>
<p>XFire<br />
Celtix<br />
Mule<br />
Apache Axis2<br />
Apache CXF<br />
&nbsp;&nbsp;&nbsp; XFire和Celtix合并，在Apache下形成的一个新的孵化项目。<br />
Apache Ode<br />
&nbsp;&nbsp;&nbsp; 是一个WS-BPEL实现<br />
Apache Rampart<br />
&nbsp;&nbsp;&nbsp; 是一个WS-Security实现<br />
Apache Sandesha2<br />
&nbsp;&nbsp;&nbsp; 是一个WS-ReliableMessaging实现<br />
Apache Tuscany<br />
&nbsp;&nbsp;&nbsp; 是一个SCA实现。<br />
Apache ServiceMix<br />
&nbsp;&nbsp;&nbsp; 是一个JBI实现。</p>
<p>Eclipse的STP（SOA Tooling Project）子项目<br />
此Eclipse项目旨在提供一个其他开发人员可以使用的SOA开发工具框架，以便使他们不必自己开发这些工具。</p>
<p>2.Web Services开源项目特点：<br />
&nbsp;&nbsp;&nbsp; 1)各项目侧重点有些不一样，还互相引用，交流甚多，人员合作也较多。不像Sun JDK开源和Apache Harmony，Apahce Geronomy和JBOSS等</p>
<p>几乎重叠，正面冲突。</p>
<p>&nbsp;&nbsp;&nbsp; 2)这些项目都支持Spring的Bean配置或扩展Spring的接口，和Spring集成。可见Spring火爆程度。不同开源社区不断融合，互相吸引人气</p>
<p>。<br />
&nbsp;&nbsp;&nbsp; 3)使用工具的变化<br />
&nbsp;&nbsp;&nbsp; 版本管理工具由cvs变为subversion<br />
&nbsp;&nbsp;&nbsp; build工具由ant变为maven<br />
&nbsp;&nbsp;&nbsp; 4)众多开源社区中Apache的人气最旺<br />
&nbsp;&nbsp;&nbsp; 有意思的是，很多开源项目在别的小社区发展到2.0, 3.0版本后还不遗余力地迁移到Apache, 如ServiceMix从Codehaus搬到Apache，</p>
<p>Codehaus的XFire和objectweb的Celtix合并后，乔迁到Apache。它们甚至甘愿接受Apache社区的规定：需要一段时间的修炼才能从孵化器中毕</p>
<p>业。</p>
<p>3.微软Indigo<br />
&nbsp;&nbsp;&nbsp; 说了这么多JAVA阵营的Web Services项目，还得提一下巨人微软的策略。<br />
&nbsp;&nbsp;&nbsp; Indigo是微软用于构建面向服务应用程序的代号，后被正式命名为Windows Communication Foundation。Indigo允许目前创建面向对象应</p>
<p>用程序的开发人员采用 .NET Framework以相似的方式来创建面向服务的应用程序。同时为了让这些应用程序能够与运行在 Windows 和其他平</p>
<p>台上的软件有效地进行交互，Indigo 还实现了SOAP和其他Web服务技术，这样开发人员就可以创建可靠、安全且能够与运行在任何系统上的软</p>
<p>件实现互操作的事务型服务。</p>
<p>为了实现基本通信以外的功能，Indigo 采用了一些更新的WS-* 规范。这些文档定义了用于添加可靠消息传输、安全性、事务以及更多基于 </p>
<p>SOAP 的 Web 服务的多供应商方式。所有这些规范最初均是由 Microsoft、IBM 及其他供应商共同制定的。随着它们日渐稳定，所有权通常会</p>
<p>转移到一些标准机构，如结构化信息标准促进组织 (OASIS)。Indigo 第一版中支持的 Web 服务规范包括 WS-Addressing、WS-Policy、WS-</p>
<p>MetadataExchange、WS-ReliableMessaging、WS-Security、WS-Trust、WS-SecureConversation、WS-Coordination、WS- AtomicTransaction </p>
<p>和 SOAP 消息传输优化机制 (MTOM)。</p>
<p>&nbsp;&nbsp;&nbsp; Indigo已经包含在Vista之中。</p>
<p>&nbsp;&nbsp;&nbsp; 目前Web Services的实现分为两大阵营，一是微软，一是Java厂商。这两大阵营实现Web Services规范的产品都在互相进行互操作性测试</p>
<p>。</p>
<p><br />
三、这一年各开源项目广泛实现的web services规范<br />
&nbsp;&nbsp;&nbsp; 括弧里的开源项目支持前面的规范及其新版本。</p>
<p>SOAP 1.2（Axis2 1.1）<br />
WSDL 2.0（XFire 1.2.2）<br />
JAX-WS 2.0（Celtix 1.0）<br />
WS-Policy（Axis2 1.1）<br />
MTOM（Axis2 1.1）<br />
XOP（Axis2 1.1）<br />
WS-RM（Celtix 1.0、Apache Sandesha2、Axis2 1.1）<br />
WS-Addressing（Axis2 1.1、Celtix 1.0）<br />
WS-Security（Apache Rampart、Axis2 1.1）<br />
SAAJ 1.1（Axis2 1.1、Celtix 1.0）<br />
JBI（ServiceMix 3.0.1，Celtix 1.0仅集成，XFire 1.2.2仅集成，Mule）<br />
SCA（Tuscany）<br />
WS-BPEL（Apache Ode、ServiceMix 3.0.1）</p>
<p><br />
四、争论与融合<br />
1. SOAP和REST正走向融合<br />
&nbsp;&nbsp;&nbsp; 基于SOAP和WSDL的Web Services规范多而复杂，虽然它是标准的，但是用户头疼，学习曲线陡而长，应用构建时间长。简单就是美，易用</p>
<p>性是金。在java企业应用开发领域， EJB的没落，Spring框架的兴起和流行印证了这一规律。同样，在SOA领域这一规律也已起作用，兴起了另</p>
<p>一种简单的实现——REST，虽然它不是标准的。</p>
<p>&nbsp;&nbsp;&nbsp; 其实REST和SOAP各有所长。REST简单、易用，与互联网思想一脉相承，核心思想是资源共享、面向资源的Web Services。而SOAP是广为接</p>
<p>受的标准，在互操作性方面，解决复杂的系统集成方面优势明显，其核心思想是面向活动的Web Services。</p>
<p>&nbsp;&nbsp;&nbsp; 以前，REST和SOAP的争论异常激烈。如google选择SOAP；而Amazon 85％的web services应用采用REST，15％采用SOAP。</p>
<p>&nbsp;&nbsp;&nbsp; 但慢慢地厂商变得越来越聪明，逐步摆脱理论上的争论，看重实际的接受度。如微软的Web Services项目Indigo去年底宣布支持REST；</p>
<p>Apache Axis2同时支持SOAP协议栈和REST，而且二者可互相通讯。<br />
&nbsp;&nbsp;&nbsp; 同时，SOAP族的Web Services规范新版本开始支持REST的特性（http get/post）,如WSDL 2.0和SOAP 1.2</p>
<p>&nbsp;&nbsp;&nbsp; 真所谓分久必合，合久必分。SOAP和REST正走向融合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2. JBI和SCA之争<br />
&nbsp;&nbsp;&nbsp; SUN阵营支持JBI，而BEA、IBM、SAP、SIEBEL支持SCA。随着7月初SUN公司的加入SCA/SDO国际构件标准组织，标志着Sun将逐步放弃自己的</p>
<p>JBI，预示着Java和JavaEE将在未来五年内逐渐退出&#8216;解决客户关键问题的主流技术&#8217;的地位。<br />
&nbsp;&nbsp;&nbsp; 其实不少JBI和JCA专家组的成员更倾向于JBI，但是IBM等不喜欢SUN控制JAVA，不愿看到将来SUN控制SOA的商业应用。其实JBI是好东西，</p>
<p>被牺牲了。不过，SUN如果早点将JDK开源，避垄断JAVA之嫌，就不会这么孤立。</p>
<p><br />
3. JAX-WS2.0 替换JAX-RPC 1.1<br />
&nbsp;&nbsp;&nbsp; JAX-WS2.0即Java API for XML Web Services (JAX-WS) 2.0，JAX-RPC 1.1即Java API for XML-Based RPC (JAX-RPC) 1.1。它们都是sun</p>
<p>公司的使用 Java 技术开发 Web 服务的规范，前者是后者的升级版本。<br />
&nbsp;&nbsp;&nbsp; JAX-WS2.0的binding层用JAXB（JSR 222），xml解析层用StAX（JSR 173），完全基于标准，性能得到大幅提升；支持Java 5的注释</p>
<p>（annotation），容易开发。<br />
&nbsp;&nbsp;&nbsp; </p>
<p><br />
五、总结<br />
1. SOA是未来企业的IT应用模式<br />
&nbsp;&nbsp;&nbsp; 而在SOA创造的商业世界里，企业将有机会像玩积木（网络服务构件就是积木）游戏一样创造崭新的商业模式，从不同厂商购买网络服务，</p>
<p>编排和组装自己的应用。IT的收费方式不是整个产品，也不是按CPU、license收费，而是按网络服务调用次数收费。灵活、总体拥有成本将大</p>
<p>大降低，将注意力集中于自身的商业逻辑。<br />
&nbsp;&nbsp;&nbsp; 同时，经历十几年、二十几年的IT建设，企业拥有了各种各样的系统，c++、java、c、cobra写的各种各样的遗留系统，保护企业以前的投</p>
<p>资，构建出新的应用，这样的需求越来越多、越来越强烈。而这正是SOA发挥作用的舞台，SOA可提供跨平台、跨语言的、可扩展的、可靠和安</p>
<p>全的网络服务。<br />
&nbsp;&nbsp;&nbsp; Gartner预测，到2008年，75%的新企业应用将采纳SOA。</p>
<p>2. ESB（企业服务总线）的淡出<br />
&nbsp;&nbsp;&nbsp;&nbsp; ESB这一概念将会淡出，SOA治理、策略（policy）和SOA Network、SOA Repository正在兴起。</p>
<p>3. SOA应用趋势<br />
总结一句，SOA的应用大潮将至，SOA中间件产品的竞争越来越激烈。IBM 11月1日宣布在北京和印度成立SOA全球解决方案中心。这标志着SOA应</p>
<p>用竞争的升级。</p>
 <img src ="http://www.blogjava.net/103335460/aggbug/227885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:45 <a href="http://www.blogjava.net/103335460/articles/227885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Service实践之——开始XFire(转)</title><link>http://www.blogjava.net/103335460/articles/227880.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227880.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227880.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227880.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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-xml">
    <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><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><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><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><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><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><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><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><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><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><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><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><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><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><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><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 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 class="xml" style="display: none" name="code">&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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <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 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><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 class="java" style="display: none" name="code">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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <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 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><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><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><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><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><span class="keyword">public</span><span>&nbsp;String&nbsp;不告诉你(){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><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 class="java" style="display: none" name="code">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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-xml">
    <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><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><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><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><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><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><span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 class="xml" style="display: none" name="code">&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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-xml">
    <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 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><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 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 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 class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 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 class="tag">&lt;/</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 class="tag">&lt;/</span><span class="tag-name">xsd:element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 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 class="tag">&lt;/</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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 class="tag">&lt;/</span><span class="tag-name">xsd:element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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><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 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 class="xml" style="display: none" name="code">&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 title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/195927#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <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 class="keyword">import</span><span>&nbsp;java.net.MalformedURLException; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Map; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.client.Client; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.client.XFireProxyFactory; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.Service; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.codehaus.xfire.service.binding.ObjectServiceFactory; &nbsp;&nbsp;</span></span></li>
    <li><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 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><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><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><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><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><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><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><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><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><span class="string">"张山疯"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><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><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><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><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 class="java" style="display: none" name="code">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>
<img src ="http://www.blogjava.net/103335460/aggbug/227880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:29 <a href="http://www.blogjava.net/103335460/articles/227880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire 生火指南（转）</title><link>http://www.blogjava.net/103335460/articles/227875.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227875.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227875.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227875.html</trackback:ping><description><![CDATA[<p>1. 概述<br />
&nbsp;&nbsp; XFire 是全球众多牛人在与axis系列对比后一致投票的选择。我比较欣赏的特性有：</p>
<p>与Spring整合，无须生成一堆文件，无须打包独立war，直接将应用中的Pojo导出为Web服务。 <br />
Aegis--超简约的默认Java XML 绑定机制，且可以Plugin其他绑定机制。 <br />
JSR181--annotatiton驱动的POJO WebService配置。 <br />
基于Stax的高性能框架。 <br />
脱离Web服务器的单元测试能力。 <br />
&nbsp;&nbsp; 网上的文档与例子总是不新，请大家抛开所有的文档，所有的Axis习惯，单看这份代表XFire1.2.2最简约做法的指南。</p>
<p>2. 生火指南<br />
2.1 修改web.xml，在Web应用中增加XFire的入口<br />
&nbsp;&nbsp; 注意XFire有了自己的Servlet，不再依赖Spring MVC的DispatchServlet，也就远离了大家不熟悉的Spring MVC URL Mapping，与Spring达致完美的整合。</p>
<p>&nbsp;&nbsp; 这里指定了路径为/service/* ，即WebService的URL会被默认生成为http://www.xxx.com/yyy/service/BookServiceservice/ServiceName，其中ServiceName默认为下文中的接口名。</p>
<p>xml 代码&lt;servlet&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;xfireservlet-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.codehaus.xfire.spring.XFireSpringServletservlet-class&gt;&nbsp;&nbsp; servlet&gt;&nbsp;&nbsp; &lt;servlet-mapping&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;xfireservlet-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/service/*url-pattern&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet-mapping&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果应用使用了Hibernate，使用了OpenSessionInView Filter，注意配置OSIV Filter Filter覆盖xfire servlet的路径，即本例中的/service/*.2.2 编写窄接口，抽取POJO中要导出的服务<br />
&nbsp;&nbsp; 从已有的BookManager.java中，抽取出一个窄接口，仅暴露需要导出为Web Service的方法。而BookManger.java是POJO，不需要任何WebService相关代码。</p>
<p>&nbsp; 窄接口一方面满足了安全要求，不用整个BookManager所有方法导出为Web Service；另一方面，XFire暂时也只支持基于接口的Proxy。</p>
<p>public interface BookService {<br />
&nbsp;&nbsp; List findBooksByCategory(String cateoryId);<br />
} 2.3 配置Java-XML Binding<br />
&nbsp;&nbsp; XFire默认的Aegis Binding语法非常简单，在SpringSide的例子里几乎一行配置都不用写，是我见过最简单的binding定义，大大优于其他以设计复杂为终极目标的方案。</p>
<p>&nbsp;&nbsp; 对象的属性、函数的参数和返回值如果为int、String、Date等普通类型以及由普通类型组成的复杂对象都无需定义。我见到只有两种情况需要定义：</p>
<p>无法使用泛型定义Collection中元素的类型时--如List findBooks()。如果能写成List&lt;org.springside.bookstore.domain.Book&gt; findBooks()就也不需要了。 <br />
需要为属性定义不同的名字，或者定义复杂对象里的某些属性不要输出。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果实在需要aegis配置， XFire以约定俗成代替配置(CoC)，所有Service和Entity Bean的binding文件要求命名为xxx.aegis.xml，而且要和原来的类sit together在同一目录里。</p>
<p>&lt;mapping&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;method name="findBooksByName"&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;return-type componentType="org.springside.bookstore.domain.Book"/&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="products" ignore="true"/&gt;&nbsp;&nbsp; <br />
mapping&gt;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; 其他语法详见Aegis 参考。</p>
<p>2.4 配置Spring导出<br />
&nbsp;&nbsp;&nbsp; 为了节约配置代码，先配置一个基类。注意导出Web服务的Bean不能lazy-init：</p>
<p>xml 代码&nbsp; &lt;import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/&gt;&nbsp;&nbsp;&nbsp; &lt;bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true"&gt;&nbsp;&nbsp;&nbsp; &lt;property name="serviceFactory" ref="xfire.serviceFactory"/&gt;&nbsp;&nbsp;&nbsp; &lt;property name="xfire" ref="xfire"/&gt;&nbsp;&nbsp; bean&gt;&nbsp;&nbsp;&nbsp; 每个Web服务的定义：parent为前面定义的基类，serviceClass 为Web Service的接口，serviceBean为Web Service的接口实现类。</p>
<p>xml 代码<br />
&lt;bean id="bookService" parent="baseWebService"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property name="serviceBean" ref="bookManager"/&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property name="serviceClass" value="org.springside.bookstore.components.xfire.server.simple.BookService"/&gt;&nbsp;&nbsp; <br />
&nbsp;bean&gt;&nbsp;&nbsp; </p>
<p><br />
&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>Web服务导出完毕，用户可在http://localhost/service/BookService?WSDL查看自动生成的WSDL<br />
<br />
<br />
<br />
</p>
<h2>1. JSR181</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp; JSR181式通过annotated POJO ，零配置文件的导出Web服务，是BEA倡导的，JavaEE5里的正规方式， XFire作了良好的支持。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 但是，XFire关于JSR181方式的文档还不够清晰，请完整阅读本节以避免其中的陷阱。</p>
<h3><a class="" name="XFireGuide2-1.1%E5%8F%82%E8%80%83%E6%96%87%E7%AB%A0"></a>1.1 参考文章</h3>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire" rel="nofollow" linktext="Spring, Hibernate and XFire|http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire" linktype="raw" mce_href="http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire">Spring, Hibernate and XFire<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://www.logemann.org/blojsom/blog/default/2006/05/26/Webservices-with-Spring-XFire-and-jsr181.html" rel="nofollow" linktext="Webservices with Spring, XFire and jsr181|http://www.logemann.org/blojsom/blog/default/2006/05/26/Webservices-with-Spring-XFire-and-jsr181.html" linktype="raw" mce_href="http://www.logemann.org/blojsom/blog/default/2006/05/26/Webservices-with-Spring-XFire-and-jsr181.html">Webservices with Spring, XFire and jsr181<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://www.memestorm.com/blog/basic-spring-web-services-with-xfire-and-jsr-181" rel="nofollow" linktext="Basic Spring Web services with XFire and JSR 181|http://www.memestorm.com/blog/basic-spring-web-services-with-xfire-and-jsr-181" linktype="raw" mce_href="http://www.memestorm.com/blog/basic-spring-web-services-with-xfire-and-jsr-181">Basic Spring Web services with XFire and JSR 181<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://xfire.codehaus.org/JSR+181+Annotations" rel="nofollow" linktext="XFire JSR181参考文档|http://xfire.codehaus.org/JSR+181+Annotations" linktype="raw" mce_href="http://xfire.codehaus.org/JSR+181+Annotations">XFire JSR181参考文档<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201; </li>
</ul>
<h3><a class="" name="XFireGuide2-1.2ApplicationContext.xml"></a>1.2 ApplicationContext.xml</h3>
<p>&nbsp;&nbsp;&nbsp; 因为Web服务配置都写在了annotation，applicationContext.xml文件的内容变得比较固定。需要注意JSR181WebAnnotations与HandlerMapping不能lazy init。</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span><span class="keyword">default</span><span>-autowire=</span><span class="string">"byName"</span><span>&gt; &nbsp;&nbsp;</span></span></span>
    <li class=""><span>&nbsp;&nbsp;<!--引入xfire的预配置文件--> &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&lt;</span><span class="keyword">import</span><span>&nbsp;resource=</span><span class="string">"classpath:org/codehaus/xfire/spring/xfire.xml"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;<!--&#160;获得applicationcontext中所有bean的jsr181&#160;annotation&#160;--> &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;<span class="string">"webAnnotations"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"</span><span>&nbsp;&nbsp;lazy-init=</span><span class="string">"false"</span><span>/&gt; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;<!--&#160;定义handler&#160;mapping,将所有jsr181定义的bean导出为web&#160;service&#160;--> &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;<span class="string">"jsr181HandlerMapping"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping"</span><span>&nbsp;&nbsp;lazy-init=</span><span class="string">"false"</span><span>&gt; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;<span class="string">"xfire"</span><span>&nbsp;ref=</span><span class="string">"xfire"</span><span>/&gt; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;<span class="string">"webAnnotations"</span><span>&nbsp;ref=</span><span class="string">"webAnnotations"</span><span>/&gt; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    </li>
</ol>
</div>
</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<h3><a class="" name="XFireGuide2-1.3InterfaceImpl%E6%A8%A1%E5%BC%8F"></a>1.3 Interface+Impl模式</h3>
<p>&nbsp;&nbsp; 不同于XFire传统模式，窄接口不是必须的，只是考虑到有个接口，配置都在接口上做，对原来的Manager类侵入较少。</p>
<p>&nbsp;&nbsp;&nbsp;如果采用Interface，Interface将担任主要的配置工作。</p>
<p>&nbsp;&nbsp; 首先定义@WebService，可定义自己的NameSpace，如果不定义将采用默认的生成算法。</p>
<p>&nbsp;&nbsp; 接口中的函数将默认全部导出，不需要再用@WebMethod注释，也可以如下例般进行关于Param，Result的更进一步配置：</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@WebService</span><span>(targetNamespace&nbsp;=&nbsp;</span><span class="string">"http://www.springside.org.cn"</span><span>) &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;BookService&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="annotation">@WebResult</span><span>(name&nbsp;=&nbsp;</span><span class="string">"SearchResult"</span><span>) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;List<book></book>&nbsp;findBooksByCategory(</span><span class="annotation">@WebParam</span><span>(name&nbsp;=&nbsp;</span><span class="string">"category"</span><span>,&nbsp;header&nbsp;=&nbsp;</span><span class="keyword">true</span><span>)String&nbsp;cateoryId); &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span>
    </li>
</ol>
</div>
</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager不是纯粹的POJO，需要带上@WebService注释，指明接口。</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@WebService</span><span>(serviceName&nbsp;=&nbsp;</span><span class="string">"BookService"</span><span>,&nbsp;endpointInterface&nbsp;=&nbsp;</span><span class="string">"org.springside.bookstore.components.xfire.server.jsr181.BookService"</span><span>) &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BookManager&nbsp;</span><span class="keyword">implements</span><span>&nbsp;BookService&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>... &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span>
    </li>
</ol>
</div>
</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 陷阱一：<span class="nobr"><a title="Visit page outside Confluence" href="http://xfire.codehaus.org/JSR+181+Annotations" rel="nofollow" linktext="XFire JSR181参考文档|http://xfire.codehaus.org/JSR+181+Annotations" linktype="raw" mce_href="http://xfire.codehaus.org/JSR+181+Annotations">XFire JSR181参考文档<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;&nbsp;中在Interface中以@WebService(name="<font color="#009100">BookService</font>")来定义ServiceName，这个做法看起来也比较合理，但实际上需要在Manager中以@WebService(serviceName ="BookService") 来定义，比较古怪。</p>
<h3><a class="" name="XFireGuide2-1.4%E7%BA%AFPOJO%E6%A8%A1%E5%BC%8F"></a>1.4 纯POJO模式</h3>
<p>&nbsp;&nbsp;&nbsp; 参考文档中的例子，需要配置@WebMethod 指定需要导出的函数。</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@WebService</span><span>(name&nbsp;=&nbsp;</span><span class="string">"EchoService"</span><span>,&nbsp;targetNamespace&nbsp;=&nbsp;</span><span class="string">"http://www.openuri.org/2004/04/HelloWorld"</span><span>) &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Jsr181EchoService &nbsp;&nbsp;</span>
    <li class="alt"><span>{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@WebMethod</span><span>(operationName&nbsp;=&nbsp;</span><span class="string">"echoString"</span><span>,&nbsp;action&nbsp;=&nbsp;</span><span class="string">"urn:EchoString"</span><span>) &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@WebResult</span><span>(name&nbsp;=&nbsp;</span><span class="string">"echoResult"</span><span>) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;echo(</span><span class="annotation">@WebParam</span><span>(name&nbsp;=&nbsp;</span><span class="string">"echoParam"</span><span>,&nbsp;header&nbsp;=&nbsp;</span><span class="keyword">true</span><span>)&nbsp;String&nbsp;input) &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;input; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span>
    </li>
</ol>
</div>
</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<h3><a class="" name="XFireGuide2-1.5Client%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9"></a>1.5 Client注意事项</h3>
<p>&nbsp;&nbsp;&nbsp; 陷阱二：和传统模式的client有一点最大的区别，serviceModel需要实际的Manager类而不是接口类来做参数：</p>
<p>&#8201;</p>
<div class="code_title">java 代码</div>
<p><a class="" name="XFireGuide2-2.Client"></a></p>
<h2>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Service&nbsp;serviceModel&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;AnnotationServiceFactory().create(BookManager.</span><span class="keyword">class</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</h2>
<p>&nbsp;</p>
<h2>2. Client</h2>
<p>XFire的Client并不算强项，一共有三种模式：</p>
<h3><a class="" name="XFireGuide2-2.1Client%E5%BC%80%E5%8F%91%E8%80%85%E6%8B%A5%E6%9C%89Web%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84class"></a>2.1 Client开发者拥有Web服务端的class</h3>
<p>&nbsp; Client与Server是同一个开发团队也好，Server端团队以jar形式提供开发包也好，反正如果能拿到服务端的接口Class和Entity类及aegis 配置文件的话。</p>
<p>&nbsp; 传统POJO模式：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Service&nbsp;serviceModel&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectServiceFactory().create(BookService.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>BookService&nbsp;service&nbsp;=&nbsp;(BookService)&nbsp;</span><span class="keyword">new</span><span>&nbsp;XFireProxyFactory().create(serviceModel,&nbsp;serviceURL); &nbsp;&nbsp;</span>
    <li class="alt"><span>service.findBooksByCategory(cateoryId);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp;JSR181模式，注意这里Server端开发组需要向Client提供BookService的实现类BookManager，而不止于接口，有点危险：&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Service&nbsp;serviceModel&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;AnnotationServiceFactory().create(BookManager.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>BookService&nbsp;=&nbsp;(BookService)&nbsp;</span><span class="keyword">new</span><span>&nbsp;XFireProxyFactory().create(serviceModel,&nbsp;serviceURL); &nbsp;&nbsp;</span>
    <li class="alt"><span>service.findBooksByCategory(cateoryId);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&#8201;</p>
<p>&nbsp; SpringSide&nbsp;用泛型封装了一个XFireClientFactory，调用代码如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>BookService&nbsp;service&nbsp;=&nbsp;XFireClientFactory.getClient(serviceURL,&nbsp;BookService.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>BookService&nbsp;service&nbsp;=&nbsp;XFireClientFactory.getJSR181Client(serviceURL,&nbsp;BookService.</span><span class="keyword">class</span><span>,&nbsp;BookManager.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>&#8201;</p>
<h3><a class="" name="XFireGuide2-2.2%E5%8A%A8%E6%80%81%E6%A8%A1%E5%BC%8F"></a>2.2 动态模式</h3>
<p>&nbsp;&nbsp;&nbsp; 动态模式不需要服务端的class，不过性能和复杂对象映射等估计做得不会太好。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Client&nbsp;client&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Client(</span><span class="keyword">new</span><span>&nbsp;URL(</span><span class="string">"http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"</span><span>)); &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>Object[]&nbsp;results&nbsp;=&nbsp;client.invoke(</span><span class="string">"ConversionRate"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{</span><span class="string">"BRL"</span><span>,&nbsp;</span><span class="string">"UGX"</span><span>});&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&#8201;</p>
<h3><a class="" name="XFireGuide2-2.3%E6%A0%B9%E6%8D%AEWSDL%E7%94%9F%E6%88%90ClientStub"></a>2.3 根据WSDL生成Client Stub</h3>
<p>&nbsp;&nbsp;&nbsp; 这才是Web Service Client的王道，可以访问任意编写下的Web Service，将在下一个版本中演示。</p>
<h2><a class="" name="XFireGuide2-3.%E6%B5%8B%E8%AF%95"></a>3. 测试</h2>
<p>XFiire很重要的一个特性是提供了无须启动Web容器也能进行单元测试的能力。</p>
<p>原理就是利用XFire的JVM模式，以xfire.local://BookService 而不是<span class="nobr"><a title="Visit page outside Confluence" href="http://localhost/service/BookService" rel="nofollow" linktext="http://localhost/service/BookService" linktype="raw" mce_href="http://localhost/service/BookService">http://localhost/service/BookService<sup><img class="rendericon" height="7" alt="" src="http://www.javaeye.com/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" _counted="undefined" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;来访问服务。</p>
<p>测试的方式分两种：</p>
<p>一种是纯服务器角度，不编写客户端代码，以SOAP XML形式发送请求，返回的也是SOAP XML字串，直接对XML进行测试。</p>
<p>一种是编写2.1 中Client代码来进行测试。</p>
<p>前一种的测试的隔离度较高，而后一种比较简便。</p>
<h3><a class="" name="XFireGuide2-3.1%26nbsp%3B%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%B1%BB%26nbsp%3B"></a>3.1&nbsp;测试基类&nbsp;</h3>
<p>无论那种方式，都使用Xfire的<strong>AbstractXFireSpringTest</strong>基类，实现createContext()回调函数。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;ApplicationContext&nbsp;createContext()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ClassPathXmlApplicationContext(</span><span class="keyword">new</span><span>&nbsp;String[]{</span><span class="string">"classpath*:applicationContext*.xml"</span><span>}); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>另外测试基类还要完成一个很重要的工作就是要解决Hibernate的LazyLoad问题，做到OpenSession In Test。因此，SpringSide专门封装了一个XFireTestCase的基类。</p>
<h3><a class="" name="XFireGuide2-3.2%E7%94%A8Client%E4%BB%A3%E7%A0%81%E7%9B%B4%E6%8E%A5%E6%B5%8B%E8%AF%95"></a>3.2 用Client代码直接测试</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下文直接用client代码调用findBooksByCategory方法，得到返回值后进行各种Assert判断。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 注意和普通client code的两处区别：servericeURL换成local，factory须加入getXFire()作参数。</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Service&nbsp;serviceModel&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectServiceFactory().create(BookService.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;XFireProxyFactory&nbsp;factory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;XFireProxyFactory(getXFire()); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;BookService&nbsp;service&nbsp;=&nbsp;(BookService)&nbsp;factory.create(serviceModel,&nbsp;</span><span class="string">"xfire.local://BookService"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;List&nbsp;list&nbsp;=&nbsp;service.findBooksByCategory(</span><span class="string">"0"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;assertNotNull(list); &nbsp;&nbsp;</span> </li>
</ol>
</div>
&#8201;</div>
</div>
</div>
<h3><a class="" name="XFireGuide2-3.3%E7%BA%AF%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B5%8B%E8%AF%95"></a>3.3 纯服务端测试</h3>
<p>&nbsp;&nbsp; 编写一段SOAP XML，以任意命名保存，下文以"Java"作参数，调用findBooksByName方法。</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">env:Envelope</span><span>&nbsp;</span><span class="attribute">xmlns:env</span><span>=</span><span class="attribute-value">"http://schemas.xmlsoap.org/soap/envelope/"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">env:Header</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">env:Body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">findBooksByName</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.springside.org.cn"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">in1</span><span class="tag">&gt;</span><span>Java</span><span class="tag"><span class="tag-name">in1</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">findBooksByName</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">env:Body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span class="tag"><span class="tag-name">env:Envelope</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    </li>
</ol>
</div>
</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp; 测试代码调用前面的XML，返回XML Document对象，再用基类提供的一些Assert方法检查结果</p>
<div class="macro" command="code" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-quote">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Document&nbsp;doc&nbsp;=&nbsp;invokeService(</span><span class="string">"BookService"</span><span>,</span><span class="string">"/org/springside/xfire/BookService.FindBooksByName.xml"</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>assertNoFault(doc); &nbsp;&nbsp;</span>
    <li class="alt"><span>addNamespace(</span><span class="string">"ss"</span><span>,&nbsp;</span><span class="string">"http://domain.commons.bookstore.springside.org"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>assertValid(</span><span class="string">"//ss:Book/ss:category/ss:descn=&nbsp;\"Java&nbsp;Book\""</span><span>,&nbsp;doc);&nbsp;&nbsp;</span>
    </li>
</ol>
</div>
</span></pre>
</div>
</div>
xFire和spring集成成功了...但是遗留了个问题。求解 <br />
<br />
<br />
测试代码用的是xfire自带的demo里的book。按照demo原有方式部署完以后。客户端调用正常。现尝试把xfire集成到spring里。 <br />
web.xml配置如下:
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/128099#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;context-param&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;param-name&nbsp;&gt;contextConfigLocation&nbsp;&lt;/param-name&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;param-value&nbsp;&gt;/WEB-INF/applicationContext.xml&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/param-value&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/context-param&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;servlet&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;servlet-name&nbsp;&gt;SpringContextServlet&nbsp;&lt;/servlet-name&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;servlet-</span><span class="keyword">class</span><span>&nbsp;&gt;org.springframework.web.context.ContextLoaderServlet&nbsp;&lt;/servlet-</span><span class="keyword">class</span><span>&nbsp;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;load-on-startup&nbsp;&gt;</span><span class="number">1</span><span>&nbsp;&lt;/load-on-startup&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/servlet&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;servlet&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&nbsp;&gt;XFireServlet&nbsp;&lt;/servlet-name&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&nbsp;&gt;XFire&nbsp;&nbsp;&nbsp;Servlet&nbsp;&lt;/display-name&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-</span><span class="keyword">class</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.codehaus.xfire.spring.XFireSpringServlet&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-</span><span class="keyword">class</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&nbsp;&gt;XFireServlet&nbsp;&lt;/servlet-name&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&nbsp;&gt;/services/*&nbsp;&lt;/url-pattern&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&nbsp;&gt;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;context-param &gt;
&lt;param-name &gt;contextConfigLocation &lt;/param-name &gt;
&lt;param-value &gt;/WEB-INF/applicationContext.xml
&lt;/param-value &gt;
&lt;/context-param &gt;
&lt;servlet &gt;
&lt;servlet-name &gt;SpringContextServlet &lt;/servlet-name &gt;
&lt;servlet-class &gt;org.springframework.web.context.ContextLoaderServlet &lt;/servlet-class &gt;
&lt;load-on-startup &gt;1 &lt;/load-on-startup &gt;
&lt;/servlet &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.spring.XFireSpringServlet
&lt;/servlet-class &gt;
&lt;/servlet &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;
</pre>
<br />
<br />
spring的配置如下: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/128099#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;beans&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;</span><span class="keyword">import</span><span>&nbsp;&nbsp;&nbsp;resource=</span><span class="string">"classpath:org/codehaus/xfire/spring/xfire.xml"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;bean&nbsp;&nbsp;&nbsp;id=</span><span class="string">"baseWebService"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">class</span><span>=</span><span class="string">"org.codehaus.xfire.spring.remoting.XFireExporter"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>lazy-init=</span><span class="string">"false"</span><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">abstract</span><span>=</span><span class="string">"true"</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;property&nbsp;&nbsp;&nbsp;name=</span><span class="string">"serviceFactory"</span><span>&nbsp;&nbsp;&nbsp;ref=</span><span class="string">"xfire.serviceFactory"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;property&nbsp;&nbsp;&nbsp;name=</span><span class="string">"xfire"</span><span>&nbsp;&nbsp;&nbsp;ref=</span><span class="string">"xfire"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/bean&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;bean&nbsp;&nbsp;&nbsp;id=</span><span class="string">"bookService"</span><span>&nbsp;&nbsp;&nbsp;parent=</span><span class="string">"baseWebService"</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;property&nbsp;&nbsp;&nbsp;name=</span><span class="string">"serviceBean"</span><span>&nbsp;&nbsp;&nbsp;ref=</span><span class="string">"bookServiceImpl"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;property&nbsp;&nbsp;&nbsp;name=</span><span class="string">"serviceClass"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>value=</span><span class="string">"org.codehaus.xfire.demo.BookService"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/bean&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&lt;bean&nbsp;&nbsp;&nbsp;id=</span><span class="string">"bookServiceImpl"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">class</span><span>=</span><span class="string">"org.codehaus.xfire.demo.BookServiceImpl"</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/beans&nbsp;&gt;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;beans &gt;
&lt;import   resource="classpath:org/codehaus/xfire/spring/xfire.xml"   / &gt;
&lt;bean   id="baseWebService"
class="org.codehaus.xfire.spring.remoting.XFireExporter"
lazy-init="false"   abstract="true" &gt;
&lt;property   name="serviceFactory"   ref="xfire.serviceFactory"   / &gt;
&lt;property   name="xfire"   ref="xfire"   / &gt;
&lt;/bean &gt;
&lt;bean   id="bookService"   parent="baseWebService" &gt;
&lt;property   name="serviceBean"   ref="bookServiceImpl"   / &gt;
&lt;property   name="serviceClass"
value="org.codehaus.xfire.demo.BookService"   / &gt;
&lt;/bean &gt;
&lt;bean   id="bookServiceImpl"
class="org.codehaus.xfire.demo.BookServiceImpl"   / &gt;
&lt;/beans &gt;
</pre>
<br />
<br />
所用到的服务接口; <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/128099#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">interface</span><span>&nbsp;&nbsp;&nbsp;BookService&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;&nbsp;&nbsp;Book[]&nbsp;&nbsp;&nbsp;getBooks();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;&nbsp;&nbsp;Book&nbsp;&nbsp;&nbsp;findBook(String&nbsp;&nbsp;&nbsp;isbn)&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;&nbsp;&nbsp;BookException;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;&nbsp;&nbsp;Map&nbsp;&nbsp;&nbsp;getBooksMap();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public   interface   BookService
{
public   Book[]   getBooks();
public   Book   findBook(String   isbn)   throws   BookException;
public   Map   getBooksMap();
}
</pre>
<br />
<br />
部署以后服务正常启动。客户端调用getBooks()能正常返回，但是调用getBooksMap的时候，返回的map始终size为0.两种部署方式用的是相同的源码(都有BookService.aegis.xml文件) <br />
<br />
相同的代码，按照xfire的demo中用org.codehaus.xfire.transport.http.XFireConfigurableServlet部署的话, getBooksMap能正常返回数据. <br />
<br />
<br />
解决：通过查看soap报文。spring集成方式,服务端返回数据的命名空间是用serivce所在的包名。 <br />
<br />
<br />
需要在客户端访问的时候，也指定相应的包名. <br />
<br />
Service serviceModel = new ObjectServiceFactory().create(BookService.class,null,"http://demo.xfire.codehaus.org",null); </div>
<img src ="http://www.blogjava.net/103335460/aggbug/227875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:22 <a href="http://www.blogjava.net/103335460/articles/227875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire与Axis框架的学习比较(转)</title><link>http://www.blogjava.net/103335460/articles/227868.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227868.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227868.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227868.html</trackback:ping><description><![CDATA[<p><span style="font-size: medium; color: #800000"><strong>使用XFire+Spring构建Web Service</strong></span></p>
<p><span style="color: #800000">XFire是与Axis 2并列的新一代Web Service框架，通过提供简单的API支持Web Service各项标准协议，帮助你方便快速地开发Web Service应用。 <br />
<br />
相 对于Axis来说，目前XFire相对受欢迎，加上其提供了和Spring集成的支持，在目前的Web Service开源社区拥有众多的追随者。并且因为XFire为Spring提供的支持，使得我们可以很容易在Spring中使用XFire构建Web Service应用。 <br />
<br />
XFire与Axis2相比具有如下特征： <br />
<br />
l 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等； <br />
<br />
l 使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现； <br />
<br />
l 容易上手，可以方便快速地从pojo发布服务； <br />
<br />
l 支持Spring、Pico、Plexus、Loom等容器； <br />
<br />
l 灵活的Binding机制，包括默认的Aegis,xmlbeans,jaxb2,castor； <br />
<br />
l 高性能的SOAP 栈设计； <br />
<br />
l 支持Spring、Pico、Plexus、Loom等容器。 <br />
<br />
XFire与Axis1性能的比较如下： <br />
<br />
l XFire比Axis1.3快2-6倍； <br />
<br />
l XFire的响应时间是Axis1.3的1/2到1/5。 <br />
<br />
XFire在WebService框架中开始较晚，它从现有的框架中借鉴了许多优秀的理念，力争将Web Service的应用开发难度降到最低。此外，还提供了各种绑定技术、支持多种传输协议，对WebService体系中许多新的规范提供了支持。 <br />
<br />
下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。 <br />
<br />
一．实现的功能和特点 <br />
<br />
本例具有如下功能和特点： <br />
<br />
1） 基于J2EE平台的Web Service服务； <br />
<br />
2） 开发方便，配置简单； <br />
<br />
3） 与spring无缝集成。 <br />
<br />
XFire是完全基于流数据处理进行工作的系统，这意味着XFire不是将整个SOAP文档缓存在内存中，而是以管道的方式接收SOAP流数据。这种工作方式的转变带来了可观的性能回报，同时节省了内存的占用。 <br />
<br />
　　XFire从 管道中接收一个SOAP请求到返回一个SOAP响应，会经历一系列的阶段。在管道调用的任何一个阶段，XFire都可以添加一些额外的Handler，在 对消息进行加工处理后再传入到下一个阶段中。在SOAP请求消息对Web Service发起真正调用之前，分别会经过传输、预转发、转发、策略实施、用户信息处理、预调用、服务调用等阶段。 <br />
<br />
二．开发环境 <br />
<br />
笔者的开发环境描述如下： <br />
<br />
1） jdk: 1.5版本； <br />
<br />
2） Tomcat：5.5.20； <br />
<br />
3） MyEclipse:5.1.1 GA。 <br />
<br />
三．开发步骤 <br />
<br />
1. 工程与环境的建立 <br />
<br />
在MyEclipse 中新建Web工程，名为webservice_helloworld。选择该工程后，点击右键选择MyEclipse-&gt;Add Web Service Capabilities，弹出Add Web Service Capabilities对话框，点击&#8220;Next&#8221;，弹出Project Library Configuration对话框，默认选择Core Libraries，点击&#8220;Finish&#8221;按钮，完成XFire核心包的添加。为了后续的客户端的测试，还需读者加入commons- httpclient.jar包到WEB-INF/lib下。 <br />
<br />
部署后可看到此时WEB-INF/lib的jar包列表如下： <br />
<br />
activation-1.1.jar、commons -beanutils-1.7.0.jar、commons-codec-1.3.jar、commons-httpclient.jar、 commons-logging-1.0.4.jar、jaxen-1.1-beta-9.jar、jaxws-api-2.0.jar、jdom- 1.0.jar、jsr173_api-1.0.jar、mail-1.4.jar、saaj-api-1.3.jar、saaj-impl- 1.3.jar、spring-1.2.6.jar、stax-api-1.0.1.jar、wsdl4j-1.5.2.jar、wstx-asl- 3.0.1.jar、xbean-2.1.0.jar、xbean-spring-2.5.jar、xfire-aegis-1.2.2.jar、 xfire-annotations-1.2.2.jar、xfire-core-1.2.2.jar、xfire-java5-1.2.2.jar、 xfire-jaxws-1.2.2.jar、xfire-jsr181-api-1.0-M1.jar、xfire-spring- 1.2.2.jar、XmlSchema-1.1.jar <br />
<br />
为了后续的开发和测试，在src目录下分别建立test和webservice目录，分别用于存放测试文件和webservice的相关类。 <br />
<br />
2．Web Service实现的编写 <br />
<br />
在本例中，我们只是做一个helloWorld的简单例子。Web Service服务端提供一个根据输入的名字信息回复相应的helloWorld信息的。例如，当名字为&#8220;阿蜜果&#8221;时，恢复信息为&#8220;hello，阿蜜果&#8221;。下面让我们一步一步来开始进行编码。 <br />
<br />
1）web.xml的配置 <br />
<br />
一 般情况下，我们通过HTTP作为Web Service的传输协议，这样我们只需启动一个Web服务器(如Tomcat，在本例中使用的是Tomcat5.5.20)，这样客户端就可以通过 HTTP访问到Web Service服务。为了集成Spring容器，XFire专门提供一个XFireSpringServlet，我们可以在web.xml中配置该 Servlet，将Spring容器中定义的Web Service在某个URI下发布。 <br />
<br />
为了能正确使用XFire，需在web.xml中进行相应配置，在该文件中配置XFire的servlet和servlet-mapping。同时因为本实例需要将XFire集成到Spring中，因而需要在web.xml文件中加载Spring的相应配置文件。在本实例中，我们首先在WEB-INF下建立两个配置Spring配置文件，一个为applicationContext.xml，该文件用来定义本工程的bean，一个为xfire-servlet.xml，用来配置XFire的相关bean。修改后的web.xml的内容如下所示： <br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt; <br />
&lt;display-name&gt;XFireService&lt;/display-name&gt; <br />
&lt;!-- begin Spring配置 --&gt; <br />
&lt;context-param&gt; <br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br />
&lt;param-value&gt;/WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
&lt;listener&gt; <br />
&lt;listener-class&gt; org.springframework.web.context.ContextLoaderListener <br />
&lt;/listener-class&gt; <br />
&lt;/listener&gt; <br />
&lt;listener&gt; <br />
&lt;listener-class&gt; org.springframework.web.util.IntrospectorCleanupListener <br />
&lt;/listener-class&gt; <br />
&lt;/listener&gt; <br />
&lt;!-- end Spring配置 --&gt; <br />
<br />
&lt;!-- begin XFire 配置 --&gt; <br />
&lt;servlet&gt; <br />
&lt;servlet-name&gt;xfire&lt;/servlet-name&gt; <br />
&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; <br />
&lt;/servlet&gt; <br />
&lt;servlet-mapping&gt; <br />
&lt;servlet-name&gt;xfire&lt;/servlet-name&gt; <br />
&lt;url-pattern&gt;*.ws&lt;/url-pattern&gt; <br />
&lt;/servlet-mapping&gt; <br />
&lt;servlet&gt; <br />
&lt;!-- 配合Spring容器中XFire一起工作的Servlet--&gt; <br />
&lt;servlet-name&gt;xfireServlet&lt;/servlet-name&gt; <br />
&lt;servlet-class&gt;org.codehaus.xfire.spring.XFireSpringServlet&lt;/servlet-class&gt; <br />
&lt;/servlet&gt; <br />
&lt;servlet-mapping&gt; <br />
&lt;servlet-name&gt;xfireServlet&lt;/servlet-name&gt; <br />
&lt;!-- 在这个URI下开放Web Service服务 --&gt; <br />
&lt;url-pattern&gt;/service/*&lt;/url-pattern&gt; <br />
&lt;/servlet-mapping&gt; <br />
&lt;!-- end XFire 配置 --&gt; <br />
&lt;/web-app&gt; <br />
<br />
2）Web Service的接口类HelloWorld.java和对应实现类HelloWorldImpl.java <br />
<br />
为了用Web Service完成HelloWorld功能，我们首先在src/webservice目录下建立接口类HelloWold.java。它仅包含一个sayHelloWorld(String name)的方法，其详细内容如下： <br />
<br />
<br />
package webservice; <br />
<br />
/** *//** <br />
*HelloWorld的接口类. <br />
*/ <br />
publicinterface HelloWorld { <br />
/** *//** <br />
*对名字为name的人打招呼. <br />
*@paramname名字 <br />
*@return返回打招呼的字符串 <br />
*/ <br />
String sayHelloWorld(String name); <br />
} <br />
我们还需要建立一个对应的实现类，来实现sayHelloWorld的功能，该实现类即为HelloWorldImpl.java。该类的详细内容如下： <br />
package webservice; <br />
/** *//** <br />
*HelloWorld的实现类. <br />
*/ <br />
publicclass HelloWorldImpl implements HelloWorld { <br />
public String sayHelloWorld(String name) { <br />
String helloWorld = "hello," + name; <br />
return helloWorld; <br />
} <br />
} <br />
<br />
3）Spring配置文件applicationContext.xml和xfire-servlet.xml的配置 <br />
<br />
首先我们在applicationContext.xml文件中配置对应的bean——HelloWorldBean，该xml文件的内容如下： <br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" <br />
"http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />
&lt;beans&gt; <br />
&lt;bean id="HelloWorldBean" class="webservice.HelloWorldImpl"/&gt; <br />
&lt;/beans&gt; <br />
这个配置文件很简单，在此不详述。 <br />
<br />
XFire为Spring 提供了方便易用的导出器XFireExporter，借助该导出器的支持，我们可以在Spring容器中将一个POJO导出为Web Service。HelloWorld是业务服务类，在此拥有一个sayHelloWorld的方法，我们希望将此方法开放为Web Service。在实际应用中，如果某个类具有众多的方法，而其中的某些方法不需要开放为Web Service的情况下，我们可以定义一个窄接口，该接口中只需定义那些开放为Web Service的业务方法。 <br />
<br />
将一个业务类所有需要开放为Web Service的方法通过一个窄接口来描述是值得推荐的作法，这让Web Service的接口显得很&#8220;干净&#8221;。其次，XFire的导出器也需要服务接口的支持，因为它采用基于接口的动态代理技术。 <br />
<br />
窄接口中的方法在真实的系统中可能需要引用其它的业务类或DAO获取数据库中的真实数据，为了简化实例，我们在此简化了实例。 <br />
<br />
下面让我们看看在xfire-servlet.xml文件中导出器的设置，该文件内容如下： <br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" <br />
"http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />
&lt;beans&gt; <br />
&lt;!-- 引入XFire预配置信息 --&gt; <br />
&lt;import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /&gt; <br />
&lt;!—定义访问的url--&gt; <br />
&lt;bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; <br />
&lt;property name="urlMap"&gt; <br />
&lt;map&gt; <br />
&lt;entry key="/HelloWorldService.ws"&gt; <br />
&lt;ref bean="HelloWorldService" /&gt; <br />
&lt;/entry&gt; <br />
&lt;/map&gt; <br />
&lt;/property&gt; <br />
&lt;/bean&gt; <br />
<br />
&lt;!-- 使用XFire导出器 --&gt; <br />
&lt;bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true"&gt; <br />
&lt;!-- 引用xfire.xml中定义的工厂 --&gt; <br />
&lt;property name="serviceFactory" ref="xfire.serviceFactory" /&gt; <br />
&lt;!-- 引用xfire.xml中的xfire实例 --&gt; <br />
&lt;property name="xfire" ref="xfire" /&gt; <br />
&lt;/bean&gt; <br />
&lt;bean id="HelloWorldService" parent="baseWebService"&gt; <br />
&lt;!-- 业务服务bean --&gt; <br />
&lt;property name="serviceBean" ref="HelloWorldBean" /&gt; <br />
&lt;!-- 业务服务bean的窄接口类 --&gt; <br />
&lt;property name="serviceClass" value="webservice.HelloWorld" /&gt; <br />
&lt;/bean&gt; <br />
&lt;/beans&gt; <br />
<br />
在 上面的配置中，我们可以看到，在该配置文件中引入了xfire.xml这个Spring配置文件。它是在XFire核心JAR包中拥有一个预定义的 Spring配置文件，它定义了XFire在Spring中必须用到的一些Bean和资源，需要引入这个预定义的配置文件。从该配置文件中可以看出，我们 通过XFireExporter将业务类导出为Web Service，对于任何导出器，我们都需要引入XFire环境，即serviceFactory和xfire，这是标准的配置。ServiceFactory是XFire的核心类，它可以将一个POJO生成为一个Web Service。 <br />
<br />
在本实例中，我们通过定义一个baseWebService，其余的webService配置都将该bean作为父bean，这样可以简化Spring的配置，不需要多次引入serviceFactory和xfire。 <br />
<br />
3. Web Service的测试 <br />
<br />
在上一步操作完成之后，我们的这个简单的Web Service已经编写完毕，下面让我们来看看自己的劳动成果吧。 <br />
<br />
在浏览器中输入地址：http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl，我们可以看到HelloWorldService对应的WSDL信息，阅读这个WSDL文档，我们可以知道HelloWorld的sayHelloWorld方法已经被成功地发布为Web Service了。只要拿到这个WSDL就可以开发相应的客户端调用程序了。 <br />
<br />
XFire为访问服务端Web Service提供了各种方便的方式：我们一般根据服务地址和窄接口类创建客户调用程序。 <br />
<br />
　　在不能获得服务窄接口类的情况下，XFire允许我们通过WSDL文件生成客户端调用程序，通过指定服务接口的方式调用服务。 <br />
<br />
1）通过WSDL文件生成客户端调用程序 <br />
<br />
首先我们通过http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl我们可以获得WSDL文件HelloWorldService.wsdl，并将其放在src目录下面，接着我们通过程序访问该WSDL文件，并调用需测试的方法。此时测试类WebServiceClientTest.java的内容如下所示： <br />
<br />
<br />
package test; <br />
<br />
import org.codehaus.xfire.client.Client; <br />
import org.springframework.core.io.ClassPathResource; <br />
import org.springframework.core.io.Resource; <br />
import webservice.HelloWorld; <br />
<br />
/** *//** <br />
*Copyright2007GuangZhouAmigo. <br />
*Allrightreserved. <br />
*HelloWorld的webservice的测试类. <br />
*@author&lt;a href="mailto:xiexingxing1121@126.com"&gt;AmigoXie&lt;/a&gt; <br />
*@version1.0 <br />
*Creationdate:2007-9-16-下午05:36:05 <br />
*/ <br />
publicclass WebServiceClientTest { <br />
HelloWorld helloWorld = null; <br />
<br />
publicstaticvoid main(String[] args) throws Exception { <br />
WebServiceClientTest test = new WebServiceClientTest(); <br />
test.testClient(); <br />
} <br />
<br />
publicvoid testClient() throws Exception { <br />
String wsdl = "HelloWorldService.wsdl"; //对应的WSDL文件 <br />
Resource resource = new ClassPathResource(wsdl); <br />
Client client = new Client(resource.getInputStream(), null); //根据WSDL创建客户实例 <br />
<br />
Object[] objArray = new Object[1]; <br />
objArray[0] = "阿蜜果"; <br />
//调用特定的Web Service方法 <br />
Object[] results = client.invoke("sayHelloWorld", objArray); <br />
System.out.println("result: " + results[0]); <br />
} <br />
} <br />
运行该类，可得到如下输出结果： <br />
<br />
result: hello,阿蜜果 <br />
<br />
可看出运行结果正确。 <br />
<br />
2）根据服务地址创建客户端调用程序 <br />
<br />
接着让我们来看一个根据服务地址创建客户端调用程序的例子。我们可以通过测试类来测试Web Service的正确性，下面让我们来看一个简单的测试类，首先我们在src/test目录建立WebServiceClientTest.java文件，并在src目录下建立客户端调用的Spring配置文件client.xml。在client.xml配置文件中我们定义了一个testWebService的bean，该bean访问wsdlDocumentUrl为http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl的WSDL。该xml文件的详细内容如下： <br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" <br />
"http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br />
&lt;beans&gt; <br />
&lt;bean id="testWebService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean"&gt; <br />
&lt;property name="serviceClass"&gt; <br />
&lt;value&gt;webservice.HelloWorld&lt;/value&gt; <br />
&lt;/property&gt; <br />
&lt;property name="wsdlDocumentUrl"&gt; <br />
&lt;value&gt;http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl&lt;/value&gt; <br />
&lt;/property&gt; <br />
&lt;/bean&gt; <br />
&lt;/beans&gt; <br />
<br />
在WebServiceClientTest.java文件中获得HelloWorld，并调用它的sayHelloWorld方法来完成测试，该类的详细内容如下所示： <br />
<br />
package test; <br />
<br />
import org.springframework.context.ApplicationContext; <br />
import org.springframework.context.support.ClassPathXmlApplicationContext; <br />
import webservice.HelloWorld; <br />
<br />
/** *//** <br />
*HelloWorld的webservice的测试类. <br />
*/ <br />
publicclass WebServiceClientTest { <br />
HelloWorld helloWorld = null; <br />
<br />
publicstaticvoid main(String[] args) { <br />
WebServiceClientTest test = new WebServiceClientTest(); <br />
test.testClient(); <br />
} <br />
<br />
publicvoid testClient() { <br />
ApplicationContext ctx = new ClassPathXmlApplicationContext( <br />
"client.xml"); <br />
helloWorld = (HelloWorld) ctx.getBean("testWebService"); <br />
System.out.println(helloWorld.sayHelloWorld("阿蜜果")); <br />
} <br />
} <br />
<br />
在启动webservice_helloworld工程的情况下，运行WebServiceClientTest类，可看到控制台包含如下信息： <br />
<br />
hello,阿蜜果 <br />
<br />
由此可看出调用Web Service成功。 <br />
<br />
四．总结 <br />
<br />
与Axis 相比，在实施Web Service时XFire更加简洁高效，并且XFire对Spring提供了强大的支持，可以非常方便地在Spring中使用XFire实施Web Service，因此XFire在短短的时间里成为了受Web Service开发者喜爱的框架。 <br />
<br />
　 　XFire为客户端提供了多种访问Web Service的方式，如果可以获取客户端的窄接口类，则可以采用窄接口类调用Web Service。如果仅能获取WSDL，XFire也可以采用动态反射的机制调用Web Service。XFire为Eclipse提供了一个可以根据WSDL生成客户端存根代码的插件，相信XFire也将为其它非Java语言提供类似的插 件。 <br />
<br />
<br />
在Axis2中也开始使用Stax来处理XML，还有Xfire不支持WSDL2.0, 而Axis2支持WSDL2.0。<br />
还可使用Xfire的后续版本，Apache CXF (相当于 Xfire2.0). <br />
</span></p>
<img src ="http://www.blogjava.net/103335460/aggbug/227868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 10:14 <a href="http://www.blogjava.net/103335460/articles/227868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire:开发WEB服务简易之道（转）</title><link>http://www.blogjava.net/103335460/articles/227856.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227856.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227856.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227856.html</trackback:ping><description><![CDATA[<font color="#ffa500">Web服务<br />
</font><clk>Web<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">服务</nobr>允许我们建立应用组件放置于网络上的分布式系统.&nbsp;不管这些应用组件是怎么写的,使用什么语言写的,要运行在什么操作系统上, 我们都能以统一的方式访问这些组件.如果一个Web服务有效并且设计实现了互用性问题,那么无论你的应用是用什么语言,在什么平台上<nobr oncontextmenu="return false" onmousemove="kwM(3)" id="clickeyekey3" onmouseover="kwE(event,3, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,3)" onmouseout="kwL(event,this)">开发</nobr>的,都可以使用这些服务.&nbsp;</clk><br />
<br />
<clk>&nbsp;为了实现平台无关,实现独立的访问Web服务, 业界制定了一系列<nobr oncontextmenu="return false" onmousemove="kwM(4)" id="clickeyekey4" onmouseover="kwE(event,4, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,4)" onmouseout="kwL(event,this)">技术</nobr>标准,下面是一些最重要的技术:</clk><br />
&nbsp;* XML<br />
&nbsp;* SOAP<br />
&nbsp;* WSDL<br />
<clk>下图展示了上述技术在<nobr oncontextmenu="return false" onmousemove="kwM(2)" id="clickeyekey2" onmouseover="kwE(event,2, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,2)" onmouseout="kwL(event,this)">工作</nobr>环境中是如何使用的.</clk><br />
<img height="294" alt="jw-0501-xfire.jpg" src="http://www.360doc.com/DownloadImg/5874/193384_1.jpg" width="603" border="0" /><br />
在这里,提供者是可以提供服务的应用组件, 申请者是需要使用服务的客户端程序. 很多其他技术也参与了这个交互过程,但是这里只显示了在Web服务环境中必不可少的核心组件.<br />
<br />
<font color="#ffa500">XFire<br />
</font>XFire是一个免费的,开源的SOAP框架. 它不仅允许你<strong><u><font color="#ff1493">轻松简易</font></u></strong>地实现这么一个环境.而且还提供了很多先进的特性.不错,你没有看错,"<strong><u><font color="#ff1493">轻松简易</font></u></strong>". 本文中你将会看到用XFire构建Web服务是多么的简单.如果你的Web应用有一个Java类, 现在你希望这个类编程Web服务,用XFire完成这一工作你不必写一句代码.仅需操作一下部署描述器,你就会得到一个Web服务. 是的, 就是这么简单.让我们来看个例子.<br />
<br />
<font color="#ffa500">一个简单的Java类<br />
</font>我的这个例子是一个位于Apache Tomcat 5.5.7主机运行在J2SE 1.4.2_07下的银行应用. 我假设你已经知道如何使用Java编写web应用并且已经配置了Tomcat服务器.我们的这个应用很简单,&nbsp; 只完成一项工作, 就是将钱从一个帐户转到另一个帐户.BankingService类中的transferFunds()为我们完成这一工作. 他需要4个传入参数<br />
<ol>
    <li><code>String fromAccount</code>
    <li><code>String toAccount</code>
    <li><code>double amount</code>
    <li><code>String currency</code> </li>
</ol>
<p><code>下面是代码:<br />
</code></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.360doc.com/DownloadImg/5874/193384_2.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.mybank.xfire.example;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_3.gif" align="top"  alt="" /><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_4.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"><clk>&nbsp;<nobr oncontextmenu="return false" onmousemove="kwM(1)" id="clickeyekey1" onmouseover="kwE(event,1, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,1)" onmouseout="kwL(event,this)">java</nobr>.text.NumberFormat;</clk><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_5.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.DecimalFormat;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_6.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_99_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_152_Open_Text.style.display='none'; Codehighlighter1_99_152_Closed_Image.style.display='inline'; Codehighlighter1_99_152_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_7.gif" align="top"  alt="" /><img id="Codehighlighter1_99_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_152_Closed_Text.style.display='none'; Codehighlighter1_99_152_Open_Image.style.display='inline'; Codehighlighter1_99_152_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_8.gif" align="top"  alt="" /></span><span id="Codehighlighter1_99_152_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_99_152_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;XFire&nbsp;WebServices&nbsp;sample&nbsp;implementation&nbsp;class.&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_9.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_209_1105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_1105_Open_Text.style.display='none'; Codehighlighter1_209_1105_Closed_Image.style.display='inline'; Codehighlighter1_209_1105_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_10.gif" align="top"  alt="" /><img id="Codehighlighter1_209_1105_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_1105_Closed_Text.style.display='none'; Codehighlighter1_209_1105_Open_Image.style.display='inline'; Codehighlighter1_209_1105_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_11.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BankingService&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IBankingService&nbsp;</span><span id="Codehighlighter1_209_1105_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_12.gif"  alt="" /></span><span id="Codehighlighter1_209_1105_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_13.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_14.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Default&nbsp;constructor.</span><span style="color: #008000"><br />
<img id="Codehighlighter1_270_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_280_Open_Text.style.display='none'; Codehighlighter1_270_280_Closed_Image.style.display='inline'; Codehighlighter1_270_280_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_15.gif" align="top"  alt="" /><img id="Codehighlighter1_270_280_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_270_280_Closed_Text.style.display='none'; Codehighlighter1_270_280_Open_Image.style.display='inline'; Codehighlighter1_270_280_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_16.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;BankingService()</span><span id="Codehighlighter1_270_280_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_17.gif"  alt="" /></span><span id="Codehighlighter1_270_280_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_18.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_19.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_291_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_291_344_Open_Text.style.display='none'; Codehighlighter1_291_344_Closed_Image.style.display='inline'; Codehighlighter1_291_344_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_20.gif" align="top"  alt="" /><img id="Codehighlighter1_291_344_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_291_344_Closed_Text.style.display='none'; Codehighlighter1_291_344_Open_Image.style.display='inline'; Codehighlighter1_291_344_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_21.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_291_344_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_291_344_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Transfers&nbsp;fund&nbsp;from&nbsp;one&nbsp;account&nbsp;to&nbsp;another.<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_22.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_23.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;transferFunds(<br />
<img id="Codehighlighter1_456_1098_Open_Image" onclick="this.style.display='none'; Codehighlighter1_456_1098_Open_Text.style.display='none'; Codehighlighter1_456_1098_Closed_Image.style.display='inline'; Codehighlighter1_456_1098_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_24.gif" align="top"  alt="" /><img id="Codehighlighter1_456_1098_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_456_1098_Closed_Text.style.display='none'; Codehighlighter1_456_1098_Open_Image.style.display='inline'; Codehighlighter1_456_1098_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_25.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;amount,&nbsp;String&nbsp;currency)</span><span id="Codehighlighter1_456_1098_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_26.gif"  alt="" /></span><span id="Codehighlighter1_456_1098_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_27.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_28.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;statusMessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_29.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_30.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Call&nbsp;business&nbsp;objects&nbsp;and&nbsp;other&nbsp;components&nbsp;to&nbsp;get&nbsp;the&nbsp;job&nbsp;done.<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_31.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Then&nbsp;create&nbsp;a&nbsp;status&nbsp;message&nbsp;and&nbsp;return.</span><span style="color: #008000"><br />
<img id="Codehighlighter1_662_941_Open_Image" onclick="this.style.display='none'; Codehighlighter1_662_941_Open_Text.style.display='none'; Codehighlighter1_662_941_Closed_Image.style.display='inline'; Codehighlighter1_662_941_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_32.gif" align="top"  alt="" /><img id="Codehighlighter1_662_941_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_662_941_Closed_Text.style.display='none'; Codehighlighter1_662_941_Open_Image.style.display='inline'; Codehighlighter1_662_941_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_33.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_662_941_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_34.gif"  alt="" /></span><span id="Codehighlighter1_662_941_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_35.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberFormat&nbsp;formatter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">###,###,###,###.00</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_36.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusMessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">COMPLETED:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;currency&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;formatter.format(amount)</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_37.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;was&nbsp;successfully&nbsp;transferred&nbsp;from&nbsp;A/C#&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fromAccount&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;to&nbsp;A/C#&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;toAccount;<br />
<img id="Codehighlighter1_962_1062_Open_Image" onclick="this.style.display='none'; Codehighlighter1_962_1062_Open_Text.style.display='none'; Codehighlighter1_962_1062_Closed_Image.style.display='inline'; Codehighlighter1_962_1062_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_38.gif" align="top"  alt="" /><img id="Codehighlighter1_962_1062_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_962_1062_Closed_Text.style.display='none'; Codehighlighter1_962_1062_Open_Image.style.display='inline'; Codehighlighter1_962_1062_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_39.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)</span><span id="Codehighlighter1_962_1062_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_40.gif"  alt="" /></span><span id="Codehighlighter1_962_1062_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_41.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusMessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">BankingService.transferFunds():&nbsp;EXCEPTION:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.toString();<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_42.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_43.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;statusMessage;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_44.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_45.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_46.gif" align="top"  alt="" />}</span></span></div>
<p>在上面的代码中你看到奇怪的代码了吗? 大概没有吧. 除了那个公共的默认构造函数.这个构造函数是必不可少的,因为XFire要用他来实例这个类.<br />
<br />
因为使用接口来完成是很好的实践,因此我们的类也实现了一个名叫IBankingService的接口.代码很简单:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.360doc.com/DownloadImg/5874/193384_47.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.mybank.xfire.example;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_48.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_68_194_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_194_Open_Text.style.display='none'; Codehighlighter1_68_194_Closed_Image.style.display='inline'; Codehighlighter1_68_194_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_49.gif" align="top"  alt="" /><img id="Codehighlighter1_68_194_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_68_194_Closed_Text.style.display='none'; Codehighlighter1_68_194_Open_Image.style.display='inline'; Codehighlighter1_68_194_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193384_50.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IBankingService&nbsp;</span><span id="Codehighlighter1_68_194_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193384_51.gif"  alt="" /></span><span id="Codehighlighter1_68_194_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_52.gif" align="top"  alt="" /><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_53.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;transferFunds(<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_54.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;amount,&nbsp;String&nbsp;currency);<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_55.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_56.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193384_57.gif" align="top"  alt="" /></span></div>
<div>实际开发中,这个方法可能包含所有复杂的调用,请求和处理操作,但是我们的例子将其最小化以便我们能将精力集中到我们的目标上:将这个方法转换成Web服务.<br />
<br />
你可以看到,我们的BankingService只不过是一个普通的Java类,没有任何代码说明它是否在Web服务中使用.这就对了!我们不需要写任何代码,所有工作都交给部署描述去处理.<br />
后面我将介绍如何编写部署描述。<br />
</div>
<div><font color="#ffa500">摘要：</font><font color="#000000">XFire本身就是基于Servlet的应用,因此我们需要向文件中添加一些必要的参照.那么我们就需要配置我们创建的Web服务.我们使用名叫services.xml的文件来完成配置。</font><br />
<br />
<font color="#ffa500">Web应用的部署描述<br />
</font>在Java中,Web应用至少使用一个名叫web.xml的部署描述来部署. XFire本身就是基于Severlet的应用,因此我们需要向文件中添加一些必要的参照.那么我们就需要配置我们创建的Web服务.我们使用名叫services.xml的文件来完成配置.<br />
<br />
<font color="#ffa500">web.xml<br />
</font>首先想让我们看一下web.xml.我们需要加上如下语句:
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;XFire Servlet&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.codehaus.xfire.transport.http.XfireConfigurableServlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br />
</div>
<br />
<font face="Courier New"><font color="#ffa500">services.xml</font><br />
下面我们就要描述一下我们的Web服务都包含什么.这个工作在services.xml中完成.这个文件位于META-INF/xfire目录下,下面是基本的配置条目:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">
<p><code>&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;service&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Banking&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;namespace&gt;mybank&lt;/namespace&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;serviceClass&gt;com.mybank.xfire.example.IBankingService&lt;/serviceClass&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;implementationClass&gt;com.mybank.xfire.example.BankingService&lt;/implementationClass&gt;<br />
&nbsp;&nbsp;&lt;/service&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&lt;/beans&gt;<br />
</code></p>
</div>
</font><font face="宋体, MS Song">让我们看看文件中的具体内容. 对Web服务的定义包含在<strong><font color="#ff0000">&lt;service&gt;</font></strong>元素内<font color="#ff0000">.&lt;service&gt;</font>元素下还有若干子元素. <br />
第一个子元素是<font color="#ff0000">&lt;name&gt;,</font> 你可以提供任何有效的xml名字,这个名字会被客户端程序和服务器上的其他组件使用.例如,当服务器起来以后,你可以在浏览器上使用这个名称来查看WSDL.<br />
下一个子元素是<font color="#ff0000">&lt;namespace&gt;.</font> 任何有效地xml名称都可以, &lt;namespace&gt;将作为你服务器的唯一标识变量使用.<br />
<font color="#ff0000">&lt;serviceClass&gt;</font>元素包含Java类名用来指明方法的签名.在我们的这个例子中是IBankingService接口.如果你的Java类没有实现任何接口,那就填入类名.在你的Java类或接口中也许含有不知一个方法,只需要一个入口来将他们转换成Web服务.<br />
</font><code><font face="Times New Roman"><font color="#ff0000">&lt;implementationClass&gt;</font>元素记录实现接口的Java类名.这是一个可选元素.如果前一个元素&lt;serviceClass&gt;填入的是接口,那么此处就要填入相应的实现类名.<br />
至此,我们的Web服务配置工作就完成了.<br />
<br />
<font color="#ff0000">XFire和其他库</font><br />
现在,我们做最后一步工作--获得所有必要的库文件.我们怎么获得他们呢? 访问XFire官方网站</font><a href="http://xfire.codehaus.org/"><font face="Times New Roman">http://xfire.codehaus.org/</font></a><font face="Times New Roman">&nbsp;下载xfire-distribution-1.0.zip并解压到本地文件夹中.将下列文件拷贝到WEB-INF\lib:<br />
</font>
<li><font face="Times New Roman">activation-1.0.2.jar </font>
<li><font face="Times New Roman">commons-codec-1.3.jar </font>
<li><font face="Times New Roman">commons-httpclient-3.0.jar </font>
<li><font face="Times New Roman">commons-logging-1.0.4.jar </font>
<li><font face="Times New Roman">jaxen-1.1-beta-8.jar </font>
<li><font face="Times New Roman">jdom-1.0.jar </font>
<li><font face="Times New Roman">log4j-1.2.x.jar </font>
<li><font face="Times New Roman">mail-1.3.3_01.jar </font>
<li><font face="Times New Roman">spring-1.2.x.jar </font>
<li><font face="Times New Roman">stax-api-1.0.jar </font>
<li><font face="Times New Roman">wsdl4j-1.5.2.jar </font>
<li><font face="Times New Roman">wstx-asl-2.9.jar </font>
<li><font face="Times New Roman">xbean-2.1.0.jar </font>
<li><font face="Times New Roman">xbean-spring-2.2.jar </font>
<li><font face="Times New Roman">xfire-all-1.0.jar </font>
<li><font face="Times New Roman">XmlSchema-1.0.jar </font>
<p><font face="Times New Roman">大功告成!让我们部署并启动应用.要部署这个例子,只需要将websvc.war复制到Apache Tomcat&nbsp;环境的webapps目录下,等待几分钟,应用会自动启动. 例子的所有源代码也包含在这个war文件中(文件太大，我将其分卷压缩)<a href="http://www.blogjava.net/Files/hsith/websvc.part1.rar"><strong><font face="Times New Roman">part1</font></strong></a>&nbsp; <a href="http://www.blogjava.net/Files/hsith/websvc.part2.rar"><strong><font face="Times New Roman">part2</font></strong></a>&nbsp;&nbsp;<a href="http://www.blogjava.net/Files/hsith/websvc.part3.rar"><strong><font face="Times New Roman">part3</font></strong></a>&nbsp; <a href="http://www.blogjava.net/Files/hsith/websvc.part4.rar"><strong><font face="Times New Roman">part4</font></strong></a>&nbsp; <a href="http://www.blogjava.net/Files/hsith/websvc.part5.rar"><strong><font face="Times New Roman">part5</font></strong></a></font><font face="Times New Roman">.现在,我们的应用已经是一个We</font><font face="Times New Roman">b服务了.&nbsp;<br />
<br />
</font><font face="Times New Roman"><font color="#ffa500">我们怎么知道Web服务有效?<br />
</font>我们来做一些测试,看看Web服务是否有效.<br />
首先,我们先来看看WSDL是否有效。在浏览器中输入URL。哪个URL?因为我们的war文件名叫websvc.war，services.xml 中给出的servicenames是Banking, 那么WSDL URL为</font><a href="http://localhost:8080/websvc/services/Banking?wsdl"><strong><font face="Times New Roman">http://localhost:8080/websvc/services/Banking?wsdl</font></strong></a><font face="Times New Roman"><strong>。<br />
</strong>请注意：URL的前一部分，例如：</font><a href="http://localhost:8080/"><font face="Times New Roman">http://localhost:8080</font></a><font face="Times New Roman">会根据你安装的应用服务不同而不同。如果你输入了URL,你将会看到以&lt;wsdl:definitions&gt;为根结点的xml文件。这个文件叫做web服务的WSDL.如果你看到了这个文件，那么初步验证你的Web服务有效。<br />
但是这个验证还不够。有时候情况会复杂一些，你可以看到WSDL，但是客户端却无法访问Web服务。因此要真正检验Web服务是否真的好使，就要用客户端程序对Web服务作一次真正的调用。<br />
</font></p>
<li>
<p>摘要：在《XFire:开发Web服务的简易之道(二)》中最后提到过：要想检验Web服务是否有效，需要一个客户端程序实际调用一下这个Web服务。本章我们就来创建这样一个用于检验的客户端程序，验证一下我们前面的工作是不是真的有效。最后总结一下用XFire开发Web服务的步骤。<br />
<br />
<font color="#ffa500">创建客户端程序<br />
</font>我们可以使用很多方法，任何SOAP工具来创建客户端程序，例如.Net或Apache Axis。我的这个例子中我是用一个名叫WsClient.java的Servlet中的动态代理。为了减少编码的代价，我将所有屏幕构建元素都放到doGet()方法中。对Web服务服务的实际调用在callWebService()方法中。代码很简单：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_35_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_35_Open_Text.style.display='none'; Codehighlighter1_0_35_Closed_Image.style.display='inline'; Codehighlighter1_0_35_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_1.gif" align="top"  alt="" /><img id="Codehighlighter1_0_35_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_35_Closed_Text.style.display='none'; Codehighlighter1_0_35_Open_Image.style.display='inline'; Codehighlighter1_0_35_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_2.gif" align="top"  alt="" /><span id="Codehighlighter1_0_35_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_0_35_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;Call&nbsp;the&nbsp;Web&nbsp;service<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_3.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;*<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_4.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_5.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;callWebService(<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_6.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromAccount,&nbsp;String&nbsp;toAccount,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;amount,&nbsp;String&nbsp;currency)&nbsp;<br />
<img id="Codehighlighter1_198_1507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_198_1507_Open_Text.style.display='none'; Codehighlighter1_198_1507_Closed_Image.style.display='inline'; Codehighlighter1_198_1507_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_7.gif" align="top"  alt="" /><img id="Codehighlighter1_198_1507_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_198_1507_Closed_Text.style.display='none'; Codehighlighter1_198_1507_Open_Image.style.display='inline'; Codehighlighter1_198_1507_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_8.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MalformedURLException,&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_198_1507_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193389_9.gif"  alt="" /></span><span id="Codehighlighter1_198_1507_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_10.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_11.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Create&nbsp;a&nbsp;metadata&nbsp;of&nbsp;the&nbsp;service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_12.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectServiceFactory().create(IBankingService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_13.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">callSoapServiceLocal():&nbsp;got&nbsp;service&nbsp;model.</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_14.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_15.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Create&nbsp;a&nbsp;proxy&nbsp;for&nbsp;the&nbsp;deployed&nbsp;service</span><span style="color: #008000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_16.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XFire&nbsp;xfire&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;XFireFactory.newInstance().getXFire();<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_17.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XFireProxyFactory&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XFireProxyFactory(xfire);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_18.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_19.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serviceUrl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/websvc/services/Banking</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_20.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_21.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBankingService&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_750_841_Open_Image" onclick="this.style.display='none'; Codehighlighter1_750_841_Open_Text.style.display='none'; Codehighlighter1_750_841_Closed_Image.style.display='inline'; Codehighlighter1_750_841_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_22.gif" align="top"  alt="" /><img id="Codehighlighter1_750_841_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_750_841_Closed_Text.style.display='none'; Codehighlighter1_750_841_Open_Image.style.display='inline'; Codehighlighter1_750_841_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_23.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_750_841_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193389_24.gif"  alt="" /></span><span id="Codehighlighter1_750_841_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_25.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IBankingService)&nbsp;factory.create(serviceModel,&nbsp;serviceUrl);<br />
<img id="Codehighlighter1_875_965_Open_Image" onclick="this.style.display='none'; Codehighlighter1_875_965_Open_Text.style.display='none'; Codehighlighter1_875_965_Closed_Image.style.display='inline'; Codehighlighter1_875_965_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_26.gif" align="top"  alt="" /><img id="Codehighlighter1_875_965_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_875_965_Closed_Text.style.display='none'; Codehighlighter1_875_965_Open_Image.style.display='inline'; Codehighlighter1_875_965_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_27.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(MalformedURLException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_875_965_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193389_28.gif"  alt="" /></span><span id="Codehighlighter1_875_965_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_29.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000">"</span><span style="color: #000000">WsClient.callWebService():&nbsp;EXCEPTION:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.toString());<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_30.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_31.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_32.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Invoke&nbsp;the&nbsp;service</span><span style="color: #008000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_33.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serviceResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_1065_1169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1065_1169_Open_Text.style.display='none'; Codehighlighter1_1065_1169_Closed_Image.style.display='inline'; Codehighlighter1_1065_1169_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_34.gif" align="top"  alt="" /><img id="Codehighlighter1_1065_1169_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1065_1169_Closed_Text.style.display='none'; Codehighlighter1_1065_1169_Open_Image.style.display='inline'; Codehighlighter1_1065_1169_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_35.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1065_1169_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193389_36.gif"  alt="" /></span><span id="Codehighlighter1_1065_1169_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_37.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;client.transferFunds(fromAccount,&nbsp;toAccount,&nbsp;amount,&nbsp;currency);<br />
<img id="Codehighlighter1_1190_1341_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1190_1341_Open_Text.style.display='none'; Codehighlighter1_1190_1341_Closed_Image.style.display='inline'; Codehighlighter1_1190_1341_Closed_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_38.gif" align="top"  alt="" /><img id="Codehighlighter1_1190_1341_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1190_1341_Closed_Text.style.display='none'; Codehighlighter1_1190_1341_Open_Image.style.display='inline'; Codehighlighter1_1190_1341_Open_Text.style.display='inline';" src="http://www.360doc.com/DownloadImg/5874/193389_39.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)</span><span id="Codehighlighter1_1190_1341_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.360doc.com/DownloadImg/5874/193389_40.gif"  alt="" /></span><span id="Codehighlighter1_1190_1341_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_41.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000">"</span><span style="color: #000000">WsClient.callWebService():&nbsp;EXCEPTION:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.toString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_42.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e.toString();<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_43.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_44.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">WsClient.callWebService():&nbsp;status=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;serviceResponse);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_45.gif" align="top"  alt="" /><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_46.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Return&nbsp;the&nbsp;response</span><span style="color: #008000"><br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_47.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;serviceResponse;<br />
<img src="http://www.360doc.com/DownloadImg/5874/193389_48.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<p><br />
这段代码做了些什么？让我解释一下：首先我们创建了一个服务模型，里面包含了对服务的描述，换句话说，我们创建了服务的元数据。我们是用XFire的ObjectServiceFactory通过接口IBankingService.class创建了这个服务模型。<br />
<br />
下一步就是获取XFire的代理对象。这一步中没有任何应用细节。通过proxyFactory，使用服务模型和服务终点URL(用于获得WSDL)，我们获得了服务的本地代理。<br />
<br />
这个代理就是实际的客户端。现在我们可以调用transferFunds()方法获得我们想要的Web服务了。<br />
<br />
一旦这个例子部署成功并启动，就可以用下面的Servlet URL检验：<br />
<strong><a href="http://localhost:8080/websvc/ws">http://localhost:8080/websvc/ws</a><br />
</strong>Servlet使用默认的参数访问Web服务并显示接收到的响应。你应该能看到下面两行信息<br />
Response Received<br />
COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678<br />
现在你可以确信Web服务真的起来了并且工作正常。<br />
<br />
你可以尝试传入不同的数据。你可以输入类似于下面的URL<br />
<strong><a href="http://localhost:8080/websvc/ws?from=11-2345&amp;to=77-9876&amp;amt=250.00&amp;cur=EUR">http://localhost:8080/websvc/ws?from=11-2345&amp;to=77<font color="#000000">-</font>9876&amp;amt=250.00&amp;cur=EUR</a></strong>.<br />
<br />
<font color="#ffa500">Web服务开发的基本步骤</font><br />
下面列出了使用XFire开发Web服务的基本步骤：<br />
1、检验Java类的方法和构造函数时公共的；<br />
2、将XFire Servlet相关的入口添加到web.xml中；<br />
3、创建services.xml并把它放到WEB-INF/classes/META-INF/xfire目录下；<br />
4、将Xfire和其他第三方库添加到你的Web应用的WEB-INF/lib 目录下。<br />
OK，这就是全部要做，就是这么简单。<br />
</p>
</li>
</code></div>
<img src ="http://www.blogjava.net/103335460/aggbug/227856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 09:32 <a href="http://www.blogjava.net/103335460/articles/227856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA简介(转)</title><link>http://www.blogjava.net/103335460/articles/227851.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Tue, 09 Sep 2008 01:16:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227851.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227851.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227851.html</trackback:ping><description><![CDATA[&nbsp;面向服务的体系结构（service-oriented architecture，SOA）是一个组件模型，它将应用程序的不同功能单元（称为服务）通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的，它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。<br />
<br />
这种具有中立的接口定义（没有强制绑定到特定的实现上）的特征称为服务之间的松耦合。松耦合系统的好处有两点，一点是它的灵活性，另一点是，当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时，它能够继续存在。而另一方面，紧耦合意味着应用程序的不同组件之间的接口与其功能和结构是紧密相连的，因而当需要对部分或整个应用程序进行某种形式的更改时，它们就显得非常脆弱。<br />
<br />
对松耦合的系统的需要来源于业务应用程序需要根据业务的需要变得更加灵活，以适应不断变化的环境，比如经常改变的政策、业务级别、业务重点、合作伙伴关系、行业地位以及其他与业务有关的因素，这些因素甚至会影响业务的性质。我们称能够灵活地适应环境变化的业务为按需（On demand）业务，在按需业务中，一旦需要，就可以对完成或执行任务的方式进行必要的更改。<br />
<br />
虽然面向服务的体系结构不是一个新鲜事物，但它却是更传统的面向对象的模型的替代模型，面向对象的模型是紧耦合的，已经存在二十多年了。虽然基于 SOA 的系统并不排除使用面向对象的设计来构建单个服务，但是其整体设计却是面向服务的。由于它考虑到了系统内的对象，所以虽然 SOA 是基于对象的，但是作为一个整体，它却不是面向对象的。不同之处在于接口本身。SOA 系统原型的一个典型例子是通用对象请求代理体系结构（Common Object Request Broker Architecture，CORBA），它已经出现很长时间了，其定义的概念与 SOA 相似。<br />
<br />
然而，现在的 SOA 已经有所不同了，因为它依赖于一些更新的进展，这些进展是以可扩展标记语言（eXtensible Markup Language，XML）为基础的。通过使用基于 XML 的语言（称为 Web 服务描述语言（Web Services Definition Language，WSDL））来描述接口，服务已经转到更动态且更灵活的接口系统中，非以前 CORBA 中的接口描述语言（Interface Definition Language，IDL）可比了。<br />
<br />
Web 服务并不是实现 SOA 的惟一方式。前面刚讲的 CORBA 是另一种方式，这样就有了面向消息的中间件（Message-Oriented Middleware）系统，比如 IBM 的 MQseries。但是为了建立体系结构模型，您所需要的并不只是服务描述。您需要定义整个应用程序如何在服务之间执行其工作流。您尤其需要找到业务的操作和业务中所使用的软件的操作之间的转换点。因此，SOA 应该能够将业务的商业流程与它们的技术流程联系起来，并且映射这两者之间的关系。例如，给供应商付款的操作是商业流程，而更新您的零件数据库，以包括进新供应的货物却是技术流程。因而，工作流还可以在 SOA 的设计中扮演重要的角色。<br />
<br />
此外，动态业务的工作流不仅可以包括部门之间的操作，甚至还可以包括与不为您控制的外部合作伙伴进行的操作。因此，为了提高效率，您需要定义应该如何得知服务之间的关系的策略，这种策略常常采用服务级协定和操作策略的形式。<br />
<br />
最后，所有这些都必须处于一个信任和可靠的环境之中，以同预期的一样根据约定的条款来执行流程。因此，安全、信任和可靠的消息传递应该在任何 SOA 中都起着重要的作用。<br />
<br />
我可以用面向服务的体系结构做什么？<br />
<br />
对 SOA 的需要来源于需要使业务 IT 系统变得更加灵活，以适应业务中的改变。通过允许强定义的关系和依然灵活的特定实现，IT 系统既可以利用现有系统的功能，又可以准备在以后做一些改变来满足它们之间交互的需要。<br />
<br />
下面举一个具体的例子。一个服装零售组织拥有 500 家国际连锁店，它们常常需要更改设计来赶上时尚的潮流。这可能意味着不仅需要更改样式和颜色，甚至还可能需要更换布料、制造商和可交付的产品。如果零售商和制造商之间的系统不兼容，那么从一个供应商到另一个供应商的更换可能就是一个非常复杂的软件流程。通过利用 WSDL 接口在操作方面的灵活性，每个公司都可以将它们的现有系统保持现状，而仅仅匹配 WSDL 接口并制订新的服务级协定，这样就不必完全重构它们的软件系统了。这是业务的水平改变，也就是说，它们改变的是合作伙伴，而所有的业务操作基本上都保持不变。这里，业务接口可以作少许改变，而内部操作却不需要改变，之所以这样做，仅仅是为了能够与外部合作伙伴一起工作。<br />
<br />
另一种形式是内部改变，在这种改变中，零售组织现在决定它还将把连锁零售商店内的一些地方出租给专卖流行衣服的小商店，这可以看作是采用店中店（store-in-store）的业务模型。这里，虽然公司的大多数业务操作都保持不变，但是它们现在需要新的内部软件来处理这样的出租安排。尽管在内部软件系统可以承受全面的检修，但是它们需要在这样做的同时不会对与现有的供应商系统的交互产生大的影响。在这种情况下，SOA 模型保持原封不动，而内部实现却发生了变化。虽然可以将新的方面添加到 SOA 模型中来加入新的出租安排的职责，但是正常的零售管理系统继续如往常一样。<br />
<br />
为了延续内部改变的观念，IT 经理可能会发现，软件的新配置还可以以另外的一种方式加以使用，比如出租粘贴海报的地方以供广告之用。这里，新的业务提议是通过在新的设计中重用灵活的 SOA 模型得出的。这是来自 SOA 模型的新成果，并且还是一个新的机会，而这样的新机会在以前可能是不会有的。<br />
<br />
垂直改变也是可能的，在这种改变中，零售商从销售他们自己的服装完全转变到专门通过店中店模型出租地方。如果垂直改变完全从最底层开始的话，就会带来 SOA 模型结构的显著改变，与之一起改变的还可能有新的系统、软件、流程以及关系。在这种情况下，SOA 模型的好处是它从业务操作和流程的角度考虑问题而不是从应用程序和程序的角度考虑问题，这使得业务管理可以根据业务的操作清楚地确定什么需要添加、修改或删除。然后可以将软件系统构造为适合业务处理的方式，而不是在许多现有的软件平台上常常看到的其他方式。<br />
<br />
正如您可以看到的，在这里，改变和 SOA 系统适应改变的能力是最重要的部分。对于开发人员来说，这样的改变无论是在他们工作的范围之内还是在他们工作的范围之外都有可能发生，这取决于是否有改变需要知道接口是如何定义的以及它们相互之间如何进行交互。与开发人员不同的是，架构师的作用就是引起对 SOA 模型大的改变。这种分工，就是让开发人员集中精力于创建作为服务定义的功能单元，而让架构师和建模人员集中精力于如何将这些单元适当地组织在一起，它已经有十多年的历史了，通常用统一建模语言（Universal Modeling Language，UML），并且描述成模型驱动的体系结构（Model-Driven Architecture，MDA）。<br />
<br />
对于面向同步和异步应用的，基于请求/响应模式的分布式计算来说，SOA是一场革命。一个应用程序的业务逻辑（business logic）或某些单独的功能被模块化并作为服务呈现给消费者或客户端。这些服务的关键是他们的松耦合特性。例如，服务的接口和实现相独立。应用开发人员或者系统集成者可以通过组合一个或多个服务来构建应用，而无须理解服务的底层实现。举例来说，一个服务可以用。NET或J2EE来实现，而使用该服务的应用程序可以在不同的平台之上，使用的语言也可以不同。<br />
<br />
SOA有以下特性<br />
<br />
SOA服务具有平台独立的自我描述XML文档。Web服务描述语言（WSDL， Web Services Description Language）是用于描述服务的标准语言。<br />
<br />
SOA 服务用消息进行通信，该消息通常使用XML Schema来定义（也叫做XSD， XML Schema Definition）。消费者和提供者或消费者和服务之间的通信多见于不知道提供者的环境中。服务间的通讯也可以看作企业内部处理的关键商业文档。<br />
<br />
在一个企业内部，SOA服务通过一个扮演目录列表（directory listing）角色的登记处（Registry）来进行维护。应用程序在登记处（Registry）寻找并调用某项服务。统一描述，定义和集成（UDDI， Universal Description， Definition， and Integration）是服务登记的标准。<br />
<br />
每项SOA服务都有一个与之相关的服务品质（QoS， quality of service）。QoS的一些关键元素有安全需求（例如认证和授权），可靠通信（译注：可靠消息是指，确保消息&#8220;仅且仅仅&#8221;发送一次，从而过滤重复信息。），以及谁能调用服务的策略。<br />
<br />
为什么选择SOA？<br />
<br />
不同种类的操作系统，应用软件，系统软件和应用基础结构（application infrastructure）相互交织，这便是IT企业的现状。一些现存的应用程序被用来处理当前的业务流程（business processes），因此从头建立一个新的基础环境是不可能的。企业应该能对业务的变化做出快速的反应，利用对现有的应用程序和应用基础结构（application infrastructure）的投资来解决新的业务需求，为客户，商业伙伴以及供应商提供新的互动渠道，并呈现一个可以支持有机业务（organic business）的构架。SOA凭借其松耦合的特性，使得企业可以按照模块化的方式来添加新服务或更新现有服务，以解决新的业务需要，提供选择从而可以通过不同的渠道提供服务，并可以把企业现有的或已有的应用作为服务， 从而保护了现有的IT基础建设投资。<br />
<br />
如图1的例子所示，一个使用SOA的企业，可以使用一组现有的应用来创建一个供应链复合应用（supply chain composite application），这些现有的应用通过标准接口来提供功能。<br />
<br />
服务架构<br />
<br />
为了实现SOA，企业需要一个服务架构，图2显示了一个例子：<br />
<br />
在图2中， 服务消费者（service consumer）可以通过发送消息来调用服务。这些消息由一个服务总线（service bus）转换后发送给适当的服务实现。这种服务架构可以提供一个业务规则引擎（business rules engine），该引擎容许业务规则被合并在一个服务里或多个服务里。这种架构也提供了一个服务管理基础（service management infrastructure），用来管理服务，类似审核，列表（billing），日志等功能。此外，该架构给企业提供了灵活的业务流程，更好地处理控制请求（regulatory requirement），例如Sarbanes Oxley（SOX），并且可以在不影响其他服务的情况下更改某项服务。<br />
<br />
SOA基础结构<br />
<br />
要运行，管理SOA应用程序，企业需要SOA基础，这是SOA平台的一个部分。SOA基础必须支持所有的相关标准，和需要的运行时容器。图3所示的是一个典型的SOA基础结构。<br />
<br />
SOAP， WSDL， UDDI<br />
<br />
WSDL，UDDI和SOAP是SOA基础的基础部件。WSDL用来描述服务；UDDI用来注册和查找服务；而SOAP，作为传输层，用来在消费者和服务提供者之间传送消息。SOAP是Web服务的默认机制，其他的技术为可以服务实现其他类型的绑定。一个消费者可以在UDDI注册表（registry）查找服务，取得服务的WSDL描述，然后通过SOAP来调用服务。<br />
<br />
WS-I Basic Profile<br />
<br />
WS-I Basic Profile，由Web服务互用性组织（Web Services Interoperability Organization）提供，是SOA服务测试与互用性所需要的核心构件。服务提供者可以使用Basic Profile测试程序来测试服务在不同平台和技术上的互用性。<br />
<br />
J2EE 和 .Net<br />
<br />
尽管J2EE和。NET平台是开发SOA应用程序常用的平台，但SOA不仅限于此。像J2EE这类平台，不仅为开发者自然而然地参与到SOA中来提供了一个平台，还通过他们内在的特性，将可扩展性，可靠性，可用性以及性能引入了SOA世界。新的规范，例如 JAXB（Java API for XML Binding），用于将XML文档定位到Java类；JAXR（Java API for XML Registry）用来规范对UDDI注册表（registry）的操作；XML-RPC（Java API for XML-based Remote Procedure Call）在J2EE1.4中用来调用远程服务，这使得开发和部署可移植于标准J2EE容器的Web服务变得容易，与此同时，实现了跨平台（如。NET）的服务互用。<br />
<br />
服务品质<br />
<br />
在企业中，关键任务系统（mission-critical system，译注：关键任务系统是指如果一个系统的可靠性对于一个组织是至关重要的，那么该系统就是该企业的关键任务系统。比如，电话系统对于一个电话促销企业来说就是关键任务系统，而文字处理系统就不那么关键了。）用来解决高级需求，例如安全性，可靠性，事物。当一个企业开始采用服务架构作为工具来进行开发和部署应用的时候，基本的Web服务规范，像WSDL，SOAP，以及UDDI就不能满足这些高级需求。正如前面所提到的，这些需求也称作服务品质（QoS，quality of services）。与QoS相关的众多规范已经由一些标准化组织（standards bodies）提出，像W3C（World Wide Web Consortium）和OASIS（the Organization for the Advancement of Structured Information Standards）。下面的部分将会讨论一些QoS服务和相关标准。<br />
<br />
安全<br />
<br />
Web服务安全规范用来保证消息的安全性。该规范主要包括认证交换，消息完整性和消息保密。该规范吸引人的地方在于它借助现有的安全标准，例如，SAML（as Security Assertion Markup Language）来实现web服务消息的安全。OASIS正致力于Web服务安全规范的制定。<br />
<br />
可靠<br />
<br />
在典型的SOA 环境中，服务消费者和服务提供者之间会有几种不同的文档在进行交换。具有诸如&#8220;仅且仅仅传送一次&#8221;（ once-and-only-once delivery），&#8220;最多传送一次&#8221;（ at-most-once delivery），&#8220;重复消息过滤&#8221;（duplicate message elimination），&#8220;保证消息传送&#8221;（guaranteed message delivery）等特性消息的发送和确认，在关键任务系统（mission-critical systems）中变得十分重要。WS-Reliability 和 WS-ReliableMessaging是两个用来解决此类问题的标准。这些标准现在都由OASIS负责。<br />
<br />
策略<br />
<br />
服务提供者有时候会要求服务消费者与某种策略通信。比如，服务提供商可能会要求消费者提供Kerberos安全标示，才能取得某项服务。这些要求被定义为策略断言（policy assertions）。一项策略可能会包含多个断言。WS-Policy用来标准化服务消费者和服务提供者之间的策略通信。<br />
<br />
控制<br />
<br />
当企业着手于服务架构时，服务可以用来整合数据仓库（silos of data），应用程序，以及组件。整合应用意味着例如异步通信，并行处理，数据转换，以及校正等进程请求必须被标准化。在SOA中，进程是使用一组离散的服务创建的。BPEL4WS 或者 WSBPEL（Web Service Business Process Execution Language）是用来控制这些服务的语言。WSBPEL目前也由OASIS负责。<br />
<br />
管理<br />
<br />
随着企业服务的增长，所使用的服务和业务进程的数量也随之增加，一个用来让系统管理员管理所有运行在多相环境下的服务的管理系统就显得尤为重要。 WSDM（Web Services for Distributed Management）规定了任何根据WSDM实现的服务都可以由一个WSDM适应（WSDM-compliant）的管理方案来管理。<br />
<br />
其它的qos特性，比如合作方之间的沟通和通讯，多个服务之间的事务处理，都在WS-Coordination 和 WS-Transaction 标准中描述， 这些都是OASIS 的工作。<br />
<br />
SOA 不是Web服务<br />
<br />
在理解SOA和Web服务的关系上，经常发生混淆。根据2003年4月的Gartner报道，Yefim V. Natis就这个问题是这样解释的：&#8220;Web服务是技术规范，而SOA是设计原则。特别是Web服务中的WSDL，是一个SOA配套的接口定义标准：这是 Web服务和SOA的根本联系。&#8221;从本质上来说，SOA是一种架构模式，而Web服务是利用一组标准实现的服务。Web服务是实现SOA的方式之一。用 Web服务来实现SOA的好处是你可以实现一个中立平台，来获得服务，而且随着越来越多的软件商支持越来越多的Web服务规范，你会取得更好的通用性。<br />
<br />
SOA的优势<br />
<br />
SOA的概念并非什么新东西，SOA不同于现有的分布式技术之处在于大多数软件商接受它并有可以实现SOA的平台或应用程序。SOA伴随着无处不在的标准，为企业的现有资产或投资带来了更好的重用性。SOA能够在最新的和现有的应用之上创建应用；SOA能够使客户或服务消费者免予服务实现的改变所带来的影响；SOA能够升级单个服务或服务消费者而无需重写整个应用，也无需保留已经不再适用于新需求的现有系统。总而言之，SOA以借助现有的应用来组合产生新服务的敏捷方式，提供给企业更好的灵活性来构建应用程序和业务流程。 <br />
<br />
<br />
<br />
工作流机制是SOA的灵魂，下面咱就谈谈这个灵魂。 <br />
<br />
完整的工作流系统包含三个部分： <br />
<br />
第一，工作流本身的数据模型以及控制流程实例流转的引擎； <br />
第二，与业务数据密切相关的工作流边界，负责关联业务数据和工作流； <br />
第三，工作流的流程管理子系统，最理想的是可视化编辑。 <br />
<br />
目前，开源的工作流引擎有osworkflow,jbpm,shark等，这些工作流都符合工作流联盟的规范。但是要让他们符合你的需求比较难。最重要的原因是，你的系统里层级和架构设计，比如DAO的方式等规范，与他们对工作流本身数据模型管理的方式出入比较大。osworkflow里有几种可选的DAO方式，JDBC支持，hibernate支持，hibernate+spring也支持。但是整合方式未必和你的系统规范吻合。 <br />
除了在数据模型操作上有出入外，在流程管理上也未必符合你的要求。流程管理的最高境界就是让客户按需求自己去配置业务流程。而从osworkflow等提供的方式来看，客户还必须得精通xml等技术，客户还不把我们这些人宰了？因此，用他们的东西，一定程度上可以解放工作量，灵活修改流程配置，但是要求是提前跟客户沟通好有哪些具体流程，万一流程有变，还得程序员自己去修改，做不到让客户来可视化的自己拖放流程。不过IBM的dominao等做的不错，流程设计还是挺牛的。 <br />
如果工作流引擎有了，程序员要做的就是开发将业务和工作流关联起来的边界程序。别以为你有个工作流放那了，你就轻松了。引擎不知道业务数据要被如何计算，以及不知道你什么用例下才触发工作流。而且对于角色权限控制也不知道你是怎么规定的。边界程序就是要做这些事。 <br />
<br />
有几个概念容易混淆：工作流，控制流，业务流。 <br />
<br />
工作流是可以被取代的：在业务模型上多加几个控制状态的字段就可以了。 <br />
使用工作流虽然很好，但是要付出代价的：开发成本高，程序运行成本高，维护成本也高。 <br />
<br />
如果你的业务流程设计时可以用控制流，那就尽量用状态字段取代工作流吧，毕竟SOA不是用来杀鸡的刀 
<img src ="http://www.blogjava.net/103335460/aggbug/227851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-09 09:16 <a href="http://www.blogjava.net/103335460/articles/227851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire中实现WS-Security时出现的异常及原因(转)</title><link>http://www.blogjava.net/103335460/articles/227730.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 08 Sep 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227730.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227730.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227730.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.缺包，在客户端添加xalan.jarException in thread "main" java.lang.NoClassDefFoundError: org/apache/xml/utils/URI$MalformedURIException&nbsp;&nbsp;&nbsp; at org.apache.ws.security.message.WSSecSignature.pre...&nbsp;&nbsp;<a href='http://www.blogjava.net/103335460/articles/227730.html'>阅读全文</a><img src ="http://www.blogjava.net/103335460/aggbug/227730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-08 14:30 <a href="http://www.blogjava.net/103335460/articles/227730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire的Client的三种模式(转)</title><link>http://www.blogjava.net/103335460/articles/227728.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 08 Sep 2008 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227728.html</guid><description><![CDATA[<p style="margin: 0cm 0cm 0pt 24.75pt; text-indent: -18.75pt; tab-stops: list 24.75pt"><span style="font-size: 12pt; font-family: 宋体">1.<span style="font: 7pt &apos; times: ">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 13.5pt; font-family: 宋体">Client</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">开发者拥有Web服务端的class</span></strong></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; font-family: 宋体">即：能拿到服务端的接口Class和Entity类及aegis 配置文件</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; font-family: 宋体">//</span><span style="font-size: 12pt; font-family: 宋体">传统POJO模式</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">Service srvcModel = new ObjectServiceFactory().create(Hello.class);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">XFireProxyFactory factory = new XFireProxyFactory(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;XFireFactory.newInstance().getXFire());</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">String helloWorldURL = " http://localhost:8080/webservice/services/Hello ";</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">Hello srvc = ( Hello) factory.create(srvcModel,</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&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;&nbsp;&nbsp;&nbsp;&nbsp; helloWorldURL);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp; System.out.println(srvc.sayHello("Robin"));</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">// JSR181</span><span style="font-size: 12pt; font-family: 宋体">模式，注意这里Server端开发组需要向Client提供实现类，而不止于//接口，有点危险</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">Service&nbsp;srvcModel = new AnnotationServiceFactory()</span></p>
<p style="margin: 0cm 0cm 0pt 58.5pt"><span style="font-size: 12pt; color: green; font-family: 宋体">.create(HelloImpl.class);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">XFireProxyFactory factory = new XFireProxyFactory(XFireFactory</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .newInstance().getXFire());</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">String helloWorldURL = "http://localhost:8080/webservice/services/Hello";</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">System.out.println(hello.sayHello("caohuili:"));</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">2 </span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">动态模式</span></strong></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">动态模式不需要服务端的class，不过性能和复杂对象映射等估计做得不会太好。</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">Client client = new Client(new URL(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">"http://localhost:8080/webservice/services/Hello?wsdl"));</span></span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] results = client</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .invoke("sayHello", new Object[] { "Cao," });</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println((String) results[0]);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><strong><span style="font-size: 13.5pt; font-family: 宋体">3 </span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">根据WSDL生成Client Stub</span></strong></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;//</span><span style="font-size: 12pt; font-family: 宋体">简单参数的</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">HelloClient client=new HelloClient();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloPortType port =client.getHelloHttpPort();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(port.sayHello("hi!"));</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; font-family: 宋体">//</span><span style="font-size: 12pt; font-family: 宋体">参数复杂的</span></p>
<p style="margin: 0cm 0cm 0pt 6pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt; color: green; font-family: 宋体">MemberServiceClient client = new MemberServiceClient();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemberService memberService = client.getMemberServiceHttpPort();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user = new User();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*JAXBElement&lt;String&gt; name = new JAXBElement&lt;String&gt;(new QName(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://memberService", "username"), String.class, "smallnest");</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAXBElement&lt;String&gt; password = new JAXBElement&lt;String&gt;(new QName(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://memberService", "password"), String.class, "123456");*/</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ObjectFactory objFac=new ObjectFactory();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAXBElement&lt;String&gt; name = objFac.createUserUsername("smallnest");</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAXBElement&lt;String&gt; password = objFac.createUserPassword("123456");</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setUsername(name);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setPassword(password);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Member oneMember = new Member();</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAXBElement&lt;String&gt; memeberName = new JAXBElement&lt;String&gt;(new QName(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://memberService", "name"), String.class, "</span><span style="font-size: 12pt; color: green; font-family: 宋体">迈克");</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAXBElement&lt;String&gt; email = new JAXBElement&lt;String&gt;(new QName(</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://memberService", "email"), String.class,</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "micro@micro.com");</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oneMember.setName(memeberName);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oneMember.setEmail(email);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oneMember.setRank(6);</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 12pt; color: green; font-family: 宋体">调用方法</span></p>
<p style="margin: 0cm 0cm 0pt 6pt"><span style="font-size: 12pt; color: green; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memberService.addMember(oneMember, user);</span></p>
 <img src ="http://www.blogjava.net/103335460/aggbug/227728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-08 14:28 <a href="http://www.blogjava.net/103335460/articles/227728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire入门教程(转)</title><link>http://www.blogjava.net/103335460/articles/227726.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 08 Sep 2008 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227726.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: XFire是新一代的Java Web服务引擎，XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比，XFire的配置非常简单，可以非常容易地和Spring集成，它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。由于使用了StAX（the Streaming API for XML，基于流的XML解析）作为XML解析器，XFire的...&nbsp;&nbsp;<a href='http://www.blogjava.net/103335460/articles/227726.html'>阅读全文</a><img src ="http://www.blogjava.net/103335460/aggbug/227726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-08 14:27 <a href="http://www.blogjava.net/103335460/articles/227726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用xfire的Eclipse Plugin生成web服务的客户端(转)</title><link>http://www.blogjava.net/103335460/articles/227718.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 08 Sep 2008 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227718.html</guid><wfw:comment>http://www.blogjava.net/103335460/comments/227718.html</wfw:comment><comments>http://www.blogjava.net/103335460/articles/227718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/103335460/comments/commentRss/227718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/103335460/services/trackbacks/227718.html</trackback:ping><description><![CDATA[<p><font face="宋体">注：这篇随笔</font><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">用到的服务是上一篇文章<font color="#1d58d1">《<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">中，用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">发布</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">服务》</span></font>中发布的<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">HelloService</span>。<br />
</span><font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;本文编码环境：</font><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse SDK <ST1:CHSDATE w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">3.2.2</ST1:CHSDATE></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Tomcat5.5.20</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire-1.2.6</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">。</span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: "><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">正文：</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;利用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">xfire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">生成</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">服务客户端的方法有多种，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse Plugin</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">为</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">WSDL-&gt;Code generator</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">提供了</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">支持，它需要</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse 3.2</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">和</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Java 5</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">。这里我们用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse Plugin</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">根据</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">wsdl</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">文件地址生成客户端代码，而我们只需要编写几行代码即可实现调用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">服务。下面就是方法步骤：<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">第一步，安装插件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">打开</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Help</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">菜单，选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">&#8221;Software Updates&#8221;</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，然后再选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">&#8221;Find and Install.&#8221;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">"Search for new features to install"</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，然后点击</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Next</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">"Create New Remote Site"</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，</span><span style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: "> </span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">name</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">中输入</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">"XFire"</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">eclipse update site</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">中输入</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: "><a href="http://dist.codehaus.org/xfire/update/"><span style="color: windowtext; text-decoration: none; text-underline: none">http://dist.codehaus.org/xfire/update/</span></a></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">OK</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Finish</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">注意完成上述操作后，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">要下载和安装插件，时间长短要视网速而定，请耐心等待，安装完成时还要重启</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">。</span><br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">第二步，使用插件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">首先新建一个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">java</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">项目</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFireProject</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，然后依次选择菜单</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">File-&gt;New-&gt;Other </span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，选择</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">文件夹下的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Code generation from WSDL document</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，打开代码生成向导，如图二所示。<br />
</span><img height="496" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xshy3412/xfire5.jpg" width="570" border="0" /><br />
<span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSDL</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">的地址栏填入</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: "><a href="http://localhost:8080/WSProject/services/HelloService?wsdl"><font color="#1d58d1">http://localhost:8080/WSProject/services/HelloService?wsdl</font></a></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Output directory</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">栏中点浏览按钮，选择我们刚才新建的项目</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFireProject</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">，这两项是必填的。可选项中，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">package</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">一栏可以选已经存在的包名，如果不填这一项，代码生成器会在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">wsdl</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">目标命名空间的基础上创建一个。<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">&nbsp;&nbsp;&nbsp;&nbsp;完成后，可以看到项目中多了</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">类库，还有</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">package</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">下面的生成的一些类。此时要保证</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">IDE</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Tomcat</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">服务器是打开的。<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">&nbsp;&nbsp;&nbsp;&nbsp;此时，在调用服务之前，还有一个重要的步骤，从</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFireProject</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">项目的右键菜单里调出</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">Properties</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">配置窗口，选中左面一栏中的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">项，右面会列出所有与</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &apos; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; times: ">XFire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">运行有关的类库，按图三中所示的，选中一些类库，这些类库在调用本服务时是必须的。<br />
<img height="779" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xshy3412/xfire3.jpg" width="1036" border="0" /><br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: &apos; mso-hansi-font-family: &apos; mso-bidi-font-family: &apos; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; times: ">&nbsp;&nbsp;&nbsp;&nbsp;所有的配置都已经完成，最后就是编写代码完成调用。代码如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;wsClient;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hao.HelloServiceClient;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hao.HelloServicePortType;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_104_579_Open_Image" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_104_579_Open_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_104_579_Closed_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_104_579_Closed_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_104_579_Closed_Image" style="display: none" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_104_579_Closed_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_104_579_Open_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_104_579_Open_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Invoke&nbsp;</span><span id="Codehighlighter1_104_579_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_104_579_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_108_173_Open_Image" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_108_173_Open_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_108_173_Closed_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_108_173_Closed_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_108_173_Closed_Image" style="display: none" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_108_173_Closed_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_108_173_Open_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_108_173_Open_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_108_173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_108_173_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;这个方法调用web服务并返回服务执行的结果<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;yourName<br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;invokeServiceNow(String&nbsp;yourName)<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_232_387_Open_Image" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_232_387_Open_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_232_387_Closed_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_232_387_Closed_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_232_387_Closed_Image" style="display: none" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_232_387_Closed_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_232_387_Open_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_232_387_Open_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_232_387_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_232_387_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloServiceClient&nbsp;service</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HelloServiceClient();<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloServicePortType&nbsp;port</span><span style="color: #000000">=</span><span style="color: #000000">service.getHelloServiceHttpPort();<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;port.sayHello(yourName);<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_390_413_Open_Image" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_390_413_Open_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_390_413_Closed_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_390_413_Closed_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_390_413_Closed_Image" style="display: none" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_390_413_Closed_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_390_413_Open_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_390_413_Open_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_390_413_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_390_413_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
</span><span style="color: #008080">21</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img id="Codehighlighter1_455_577_Open_Image" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_455_577_Open_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_455_577_Closed_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_455_577_Closed_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_455_577_Closed_Image" style="display: none" onclick="this.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_455_577_Closed_Text.style.display=&amp;apos;none&amp;apos;; Codehighlighter1_455_577_Open_Image.style.display=&amp;apos;inline&amp;apos;; Codehighlighter1_455_577_Open_Text.style.display=&amp;apos;inline&amp;apos;;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_455_577_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_455_577_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">24</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;MyName</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">xshy</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Invoke.invokeServiceNow(MyName));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
&nbsp; </p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">最后程序运行得到的输出结果是&#8220;</span>xshy,<span style="font-family: 宋体">你好</span>!<span style="font-family: 宋体">&#8221;。<br />
</span><span style="font-size: 10.5pt; font-family: 宋体">注意：在运行调用程序时，</span><span style="font-size: 10.5pt; font-family: &apos; times: ">Tomcat</span><span style="font-size: 10.5pt; font-family: 宋体">也必须是打开的。 </p>
</span></span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/103335460/aggbug/227718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-08 13:49 <a href="http://www.blogjava.net/103335460/articles/227718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中，用XFire发布web服务(转)</title><link>http://www.blogjava.net/103335460/articles/227717.html</link><dc:creator>雪山飞狐</dc:creator><author>雪山飞狐</author><pubDate>Mon, 08 Sep 2008 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/103335460/articles/227717.html</guid><description><![CDATA[<span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">环境：</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Eclipse SDK <ST1:CHSDATE w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">3.2.2</ST1:CHSDATE></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Tomcat5.5.20</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">XFire-1.2.6</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">。</span><br />
<span style="font-size: 10.5pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;首先建立一个动态</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">web</span><span style="font-size: 10.5pt; font-family: 宋体">项目，命名为&#8220;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">WSProject</span><span style="font-size: 10.5pt; font-family: 宋体">&#8221;，将</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">xfire-distribution-1.2.6.zip</span><span style="font-size: 10.5pt; font-family: 宋体">解压缩后，把</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">xfire-all-1.2.6.jar</span><span style="font-size: 10.5pt; font-family: 宋体">和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">lib</span><span style="font-size: 10.5pt; font-family: 宋体">目录下的所有</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">jar</span><span style="font-size: 10.5pt; font-family: 宋体">包都拷贝到项目的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">WebContent/WEB-INF/lib</span><span style="font-size: 10.5pt; font-family: 宋体">目录下。编写一个用于发布的类文件</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">HelloService.java</span><span style="font-size: 10.5pt; font-family: 宋体">。这里我用一个简单的类，它接受传来的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">参数，返回</span><span style="font-size: 10.5pt; font-family: 宋体">&#8220;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">{ name }</span><span style="font-size: 10.5pt; font-family: 宋体">，你好！&#8221;。代码如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;hao;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_40_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_114_Open_Text.style.display='none'; Codehighlighter1_40_114_Closed_Image.style.display='inline'; Codehighlighter1_40_114_Closed_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_40_114_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_40_114_Closed_Text.style.display='none'; Codehighlighter1_40_114_Open_Image.style.display='inline'; Codehighlighter1_40_114_Open_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloService&nbsp;</span><span id="Codehighlighter1_40_114_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_40_114_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_78_112_Open_Image" style="display: inline" onclick="this.style.display='none'; Codehighlighter1_78_112_Open_Text.style.display='none'; Codehighlighter1_78_112_Closed_Image.style.display='inline'; Codehighlighter1_78_112_Closed_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_78_112_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_78_112_Closed_Text.style.display='none'; Codehighlighter1_78_112_Open_Image.style.display='inline'; Codehighlighter1_78_112_Open_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHello(String&nbsp;name)</span><span id="Codehighlighter1_78_112_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_78_112_Open_Text" style="display: inline"><span style="color: #000000">{<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,你好！</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;下一步就是对</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">XML</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件的配置，这些配置非常关键，大多错误也出在这上面。<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;先说</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，它是对所有要发布的服务的描述文件，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">xfire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">就是依据这些信息来发布你的服务。这里针对我们刚才那个类建立</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">。内容如下：<br />
</span></span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://xfire.codehaus.org/config/1.0"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloService</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">serviceClass</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">hao.HelloService</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">serviceClass</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">标签的子标签不止这两个，但其余的都是可选的。关于</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的更多描述，请参阅</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">xfire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的官方网站。文件建好了，就是把它放到项目的哪个位置的问题了，这里我在项目的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">WebContent/ META-INF</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">目录下面新建一个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">xfire</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件夹，把</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件放到这个新建文件夹里。最后再把</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">META-INF</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件夹整个移到</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">WebContent/ WEB-INF</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">目录下，这时</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件的配置全部完成，如果我说的还不清楚，请直接看图一，图中左侧有文件结构，只要照那个结构调整项目中的文件及文件夹的位置就可以了。<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;注意，如果</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">services.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件的放置位置不对，在用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体"><a href="http://localhost:8080/WSProject/services/">http://localhost:8080/WSProject/services/</a></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">网址访问服务器时，会抛出下面的异常：<br />
<pre><strong><span style="background: #525d76; color: white">Exception</span><span style="background: #525d76; color: white">：</span></strong></pre>
<pre style="tab-stops: 21.75pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><span style="color: black">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">javax.servlet.ServletException: Error initializing XFireServlet.</span></pre>
<pre><strong><span style="background: #525d76; color: white">root cause</span><span style="background: #525d76; color: white">：</span></strong></pre>
<p><span style="font-size: 10.5pt; color: black; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist</span></p>
<p><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;然后是</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件，在项目已有的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web.xml</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件基础上修改一下就可以。修改后的最终内容如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000">&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XFireServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.codehaus.xfire.transport.http.XFireConfigurableServlet<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XFireServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/servlet/XFireServlet/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XFireServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/services/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;到这里第一部分的所有步骤已经完成，打开</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Tomcat</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，在服务器上运行这个动态</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">项目。输入网址</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体"><a href="http://localhost:8080/WSProject/services/HelloService?wsdl">http://localhost:8080/WSProject/services/HelloService?wsdl</a></span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，如果正确发布，会得到如图一中显示的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">wsdl</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文档。<br />
<img height="495" alt="" src="http://images.cnblogs.com/cnblogs_com/xshy3412/xfire1.jpg" width="764" border="0" /><br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&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;&nbsp;&nbsp;&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;以后要访问这个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">服务的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">wsdl</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件，只需要把</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Tomcat</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">打开，然后输入上面的网址就可以了，这在第二部分创建客户端访问</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">服务时要用到。好了，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">web</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">服务的发布就完成了。</span></span></span></span></span></span> 
 <img src ="http://www.blogjava.net/103335460/aggbug/227717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/103335460/" target="_blank">雪山飞狐</a> 2008-09-08 13:47 <a href="http://www.blogjava.net/103335460/articles/227717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>