﻿<?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-j2ee绿洲-文章分类-xfire</title><link>http://www.blogjava.net/livery/category/23503.html</link><description>找到属于自己的一片天空</description><language>zh-cn</language><lastBuildDate>Thu, 28 Jun 2007 19:00:25 GMT</lastBuildDate><pubDate>Thu, 28 Jun 2007 19:00:25 GMT</pubDate><ttl>60</ttl><item><title>XFire初探(3)</title><link>http://www.blogjava.net/livery/articles/125824.html</link><dc:creator>心情经纬</dc:creator><author>心情经纬</author><pubDate>Fri, 22 Jun 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/livery/articles/125824.html</guid><wfw:comment>http://www.blogjava.net/livery/comments/125824.html</wfw:comment><comments>http://www.blogjava.net/livery/articles/125824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/livery/comments/commentRss/125824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/livery/services/trackbacks/125824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;在经历过早年&nbsp;Delphi,&nbsp;C++,&nbsp;Java&nbsp;等不成熟环境中开发&nbsp;WebService&nbsp;的折磨之后，接触&nbsp;ASP.NET&nbsp;的最大感触，就是&nbsp;WebService&nbsp;的开发门槛被大大降低了。无需对&nbsp;SOAP&nbsp;或基本架构有任何了解，仅...&nbsp;&nbsp;<a href='http://www.blogjava.net/livery/articles/125824.html'>阅读全文</a><img src ="http://www.blogjava.net/livery/aggbug/125824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/livery/" target="_blank">心情经纬</a> 2007-06-22 14:17 <a href="http://www.blogjava.net/livery/articles/125824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xfire入门(1)</title><link>http://www.blogjava.net/livery/articles/125813.html</link><dc:creator>心情经纬</dc:creator><author>心情经纬</author><pubDate>Fri, 22 Jun 2007 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/livery/articles/125813.html</guid><wfw:comment>http://www.blogjava.net/livery/comments/125813.html</wfw:comment><comments>http://www.blogjava.net/livery/articles/125813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/livery/comments/commentRss/125813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/livery/services/trackbacks/125813.html</trackback:ping><description><![CDATA[<p><a name=N10097><span class=atitle>XFire 安装包</span></a></p>
<p>XFire 框架目前的最新版本是 1.2.6，可以访问 xfire.codehaus.org 下载 XFire 框架的安装包，下载时请选择&#8220;全部二进制发布包（Binary Distribution in zip package）&#8221;，而不仅仅是&#8220;XFire jar 文件（Jar of all XFire modules）&#8221;。</p>
<p>下载完成后，我们可以将下载的 .zip 文件解压缩到任意的文件夹中（后面的章节中使用 % XFIRE_HOME % 表示 XFire 框架的安装目录），解压缩后形成的文件目录结构如下：</p>
<ul>
    <li><strong>api（目录）</strong>
    <p>api 目录中是 XFire 框架中所有类（class）对应的 API 文档，为开发者使用 XFire 完成应用开发提供帮助。</p>
    <li><strong>examples（目录）</strong>
    <p>examples 目录中包含了所有随 XFire 二进制包发布的实例，包括这些实例的源代码和相关 Web 应用配置内容。</p>
    <li><strong>lib（目录）</strong>
    <p>lib 目录中包含 XFire 运行所需要的外部支持类包（.jar文件），可以根据不同项目所需的 XFire 特性选择所需要的支持类包。保守的方法是在 Web 项目中包含所有的外部支持类包（.jar文件）。</p>
    <li><strong>manual（目录）</strong>
    <p>manual 目录中包含有 XFire 框架的帮助文档，开发者可以从这些帮助文档中学习更多运用 XFire 框架实现 SOA 的知识和技巧。</p>
    <li><strong>modules（目录）</strong>
    <p>modules 目录中包含了 XFire 框架根据不同特性分别编译的二进制包文件。发布基于 XFire 框架的 Web 项目时，可以选择使用该目录下的所有 .jar 文件，也可以选择 XFire-all-1.2.6.jar 文件。</p>
    <li><strong>XFire-all-1.2.6.jar</strong>
    <p>XFire 框架的二进制包文件，包含了全部的模块（modules）。</p>
    <li><strong>LICENSE.txt</strong>
    <p>LICENSE.txt 文件中包含了 XFire 框架的授权协议。</p>
    <li><strong>NOTICE.txt</strong>
    <li><strong>README.txt</strong>
    <p>这两个文件中包含了 XFire 发布时的一些有用的信息。</p>
    </li>
</ul>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=N100F4><span class=atitle>XFire 框架支撑环境</span></a></p>
<p>XFire框架是一种基于Servlet技术的SOA应用开发框架，要正常运行基于XFire应用框架开发的企业应用，除了XFire框架本身之外，还需要JDK和Servlet容器的支持。</p>
<p><a name=N100FD><span class=smalltitle><strong><font face=Arial>1．JDK 版本选择、下载和安装</font></strong></span></a></p>
<p>XFire 支持非常多的特性，其中不同的特性对 JDK 版本的要求有所不同，比如如果项目中选择基于 JSR181 标准发布 Web 服务，我们就需要选择 JDK5 或者以上版本，如果仅仅选择将 Web 服务绑定到最简单的 POJO，我们只需要选择 JDK1.4 版本即可。</p>
<p>JDK 各版本均可以在 <a href="http://java.sun.com/" target=new><u><font color=#5c81a7>java.sun.com</font></u></a> 网站上下载，如何安装 JDK 请参考 SUN 公司的相关技术文档和 JDK 的帮助文档。</p>
<p><a name=N1010D><span class=smalltitle><strong><font face=Arial>2．Servlet 容器下载和安装</font></strong></span></a></p>
<p>XFire 是一种基于 Servlet 技术的 SOA 应用开发框架，需要 Servlet 容器的支持。XFire 支持在多种 Servlet 容器中运行，包括 Websphere、Weblogic、TOMCAT 等。为了说明的简单，我们选择使用 TOMCAT（版本5.0.30）作为 XFire 的运行容器，所有配置过程和发布步骤的说明也均是针对 TOMCAT，如果读者使用 TOMCAT 之外的其它 Servlet 容器或者选择了 TOMCAT 的其它版本，下面的配置过程和步骤可能需要做出调整，请读者根据实际 Servlet 容器的帮助文档进行相应调整。</p>
<p>TOMCAT 各版本均可以在 <a href="http://tomcat.apache.org/" target=new><u><font color=#5c81a7>tomcat.apache.org</font></u></a> 网站上下载，如何正确安装 TOMCAT 服务器请参考 TOMCAT 服务器的帮助文档。</p>
<p><a name=N1011D><span class=smalltitle><strong><font face=Arial>3．xalan</font></strong></span></a></p>
<p>XFire 需要 xalan 项目的支持，然而 1.2.6 版本中并没有带有相应的 jar 文件，因此请访问 <a href="http://xml.apache.org/" target=new><u><font color=#5c81a7>xml.apache.org</font></u></a>，下载 xalan 项目的二进制包。</p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=N1012A><span class=atitle>XFire 应用配置</span></a></p>
<p>前面的章节中我们下载和安装了 XFire 安装包和所需要的支持环境，现在我们开始学习如何从零开始创建 XFire 应用开发环境。下面的所有配置过程和发布步骤均针对 TOMCAT（版本5.0.30）服务器，如果选择其它的 Servlet 容器，下面的配置过程和步骤可能需要做出调整，请读者根据实际 Servlet 容器的帮助文档进行相应调整。</p>
<p><a name=h1><span class=smalltitle><strong><font face=Arial>1、创建 Web 应用目录和基本元素</font></strong></span></a></p>
<ol type=a>
    <li>在 %TOMCAT_HOME%/webapps 目录下创建新的 Web 应用目录 &#8220;XFire&#8221;
    <p><em>[注] 其中的 %TOMCAT_HOME% 指向 TOMCAT 的安装目录。</em> </p>
    <li>在 &#8221;XFire&#8221;目录下创建 &#8221;WEB-INF&#8221;目录、
    <li>在 &#8221; WEB-INF&#8221;目录下创建 &#8221;lib&#8221;目录和 &#8221;classes&#8221;目录
    <li>在 &#8221; WEB-INF&#8221;目录下创建 Web 应用描述文件 &#8221;web.xml&#8221;， &#8221;web.xml&#8221;文件的内容见 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#code11"><u><font color=#996699>清单 1-1</font></u></a>。 </li>
</ol>
<br><a name=code11><strong>清单 1-1 WEB-INF\web.xml</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>            1、	&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
            2、	&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"
            3、	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            4、	    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
            5、	    version="2.4"&gt;
            6、
            7、	    &lt;display-name&gt;XFire实例&lt;/display-name&gt;
            8、	    &lt;description&gt;
            9、	         基于XFire框架发布Web服务的例子
            10、	    &lt;/description&gt;
            11、
            12、	&lt;/web-app&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N1015B><span class=smalltitle><strong><font face=Arial>2、拷贝 XFire 所需的支持类包文件</font></strong></span></a></p>
<p>拷贝 %XFIRE_HOME%/lib 目录下所有文件到 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#h1"><u><font color=#996699>&#8220;1、创建 Web 应用目录和基本元素&#8221;</font></u></a> 中所创建的 &#8221;lib&#8221;目录下，将 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷贝到 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#h1"><u><font color=#996699>&#8220;1、创建 Web 应用目录和基本元素&#8221;</font></u></a> 中所创建的 &#8221;lib&#8221;目录下。将 xalan 安装包中的所有 jar 文件和所需要的支持 jar 文件拷贝到相同的 &#8221;lib&#8221;目录下。</p>
<p><strong>[注] </strong>为了减少拷贝的 jar 文件的数目，开发者可以根据项目的需要选择需要拷贝的 jar 文件，而不是全部拷贝，如何根据需要选择拷贝合适的类包文件请访问 <a href="http://xfire.codehaus.org/Dependency+Guide"><u><font color=#5c81a7>XFire 站点</font></u></a>。 </p>
<p><a name=N10175><span class=smalltitle><strong><font face=Arial>3、配置 XFire 框架运行所需的 Servlet</font></strong></span></a></p>
<p>修改 web.xml 文件，在其中增加如下 Servlet 定义内容。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>1、	&lt;servlet&gt;
            2、	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
            3、	    &lt;display-name&gt;XFire Servlet&lt;/display-name&gt;
            4、	    &lt;servlet-class&gt;
            5、	        org.codehaus.xfire.transport.http.XFireConfigurableServlet
            6、	    &lt;/servlet-class&gt;
            7、	  &lt;/servlet&gt;
            8、
            9、	  &lt;servlet-mapping&gt;
            10、	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
            11、	    &lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;
            12、	  &lt;/servlet-mapping&gt;
            13、
            14、	  &lt;servlet-mapping&gt;
            15、	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
            16、	    &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
            17、	&lt;/servlet-mapping&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N10181><span class=smalltitle><strong><font face=Arial>4、创建 XFire 框架的服务发布文件 services.xml</font></strong></span></a></p>
<ol type=a>
    <li>在 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#h1"><u><font color=#996699>&#8220;1、创建 Web 应用目录和基本元素&#8221;</font></u></a> 中创建的 classes 目录下新建目录 &#8221;META-INF\xfire&#8221;；
    <li>在步骤 a) 中新建的 &#8221;xfire&#8221;文件目录下创建新文件 services.xml，文件的默认内容如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#code12"><u><font color=#996699>清单1-2</font></u></a> 。 </li>
</ol>
<br><a name=code12><strong>清单 1-2 WEB-INF\classes\META-INF\xfire\services.xml</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>            1、	&lt;beans xmlns="http://XFire.codehaus.org/config/1.0"&gt;
            2、	&lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=N101A1><span class=atitle>将 POJO 发布成 Web 服务</span></a></p>
<p>XFire 框架中，我们有两种方式将 POJO 发布成 Web 服务：</p>
<ul>
    <li>一种方式是直接使用 Web 服务接口和 Web 服务实现类（POJO）来发布；
    <li>另一种方式是基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务； </li>
</ul>
<p>下面的章节中我们将学习使用第一种方式来完成 POJO 的 Web 服务发布。我们将使用经典的 &#8221;Hello World!&#8221;例子来演示将 POJO 发布成 Web 服务所需要的步骤，不过我们不再是简单的访问一个 Java 方法来输出 &#8221;Hello World!&#8221;字符串，而是转为在 SOA 环境下实现：Web 服务客户端通过访问服务器端发布成 Web 服务的 POJO 获得返回的 &#8221;Hello World!&#8221;字符串后输出到客户端的控制台上。</p>
<p>将 POJO 发布成 Web 服务的基本步骤如下：</p>
<ol>
    <li>创建 Web 服务接口，声明该 Web 服务对外暴露的接口；
    <li>创建 Web 服务实现类，为 Web 服务接口提供实现；
    <li>修改 XFire 框架的服务发布文件 ---- services.xml，将 POJO 发布成 Web 服务。 </li>
</ol>
<p>下面我们通过创建 &#8221;Hello World!&#8221;例子来具体说明如何实现这三个步骤。</p>
<p><a name=N101C8><span class=smalltitle><strong><font face=Arial>1．创建 Web 服务接口 ---- HelloWorldService</font></strong></span></a></p>
<p>要将 POJO 发布成 Web 服务，首先需要创建 Web 服务接口，在接口中声明该 Web 服务需要对外暴露的接口。</p>
<p>我们根据需要创建 Web 服务接口 &#8221; HelloWorldService&#8221;，在其中声明一个 &#8221;sayHello&#8221;方法，该方法返回 &#8221;String &#8221;类型的内容。&#8221; HelloWorldService&#8221;接口对应的 Java 文件代码如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#code13"><u><font color=#996699>清单 1-3</font></u></a>。</p>
<br><a name=code13><strong>清单 1-3 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldService.java</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>            1．package org.vivianj.xfire.pojo;
            2．
            3． /**
            4． * HelloWorldService 中声明需要发布成 Web 服务的所有 Java 方法
            5． * HelloWorldService 作为Web服务接口
            6． */
            7． public interface HelloWorldService {
            8．	/**
            9．	     * sayHello 方法声明了 Web 服务对外暴露的接口
            10．	 *
            11．	 * @return 返回给客户端的字符串
            12．	 */
            13．	public String sayHello();
            14．}
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101E0><span class=smalltitle><strong><font face=Arial>2．创建 Web 服务实现类 &#8221;HelloWorldServiceImpl&#8221;</font></strong></span></a></p>
<p>创建 Web 服务实现类 &#8221;HelloWorldServiceImpl&#8221;，它继承 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#h1"><u><font color=#996699>&#8221;1、创建Web服务接口 ---- HelloWorldService&#8221;</font></u></a> 中创建的 HelloWorldService 接口，并且为它声明的 &#8221;sayHello&#8221;方法提供具体实现： 返回字符串&#8221;Hello World!&#8221;。 &#8221;HelloWorldServiceImpl&#8221;类对应的 Java 文件代码如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#code14"><u><font color=#996699>清单 1-4</font></u></a>。</p>
<br><a name=code14><strong>清单 1-4 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldServiceImpl.java</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>            1．package org.vivianj.xfire.pojo;
            2．
            3．/**
            4． * HelloWorldServiceImpl 中为 Web 服务接口中声明的所有 Java 方法提供具体实现
            5． * HelloWorldServiceImpl 作为 Web 服务的实现类
            6． */
            7．public class HelloWorldServiceImpl implements HelloWorldService {
            8．
            9．	/*
            10．	 * sayHello 方法为 HelloWorldService 服务接口定义的 sayHello 方法提供具体实现
            11．	 *
            12．	 * @see org.vivianj.XFire.pojo.HelloWorldService#sayHelloToXFire()
            13．	 */
            14．	public String sayHello() {
            15．		return "Hello World!";
            16．	}
            17．
            18．}
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101F9><span class=smalltitle><strong><font face=Arial>3．修改 services.xml，将 POJO 发布成 Web 服务</font></strong></span></a></p>
<p>我们可以在 WEB-INF\classes\META-INF\XFire\services.xml 文件中的 &lt;beans &#8230;&gt; 和 &lt;/beans&gt; 元素中间加入如下的 xml 内容将上面创建的 HelloWorldService 发布成 Web 服务。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>1．&lt;service&gt;
            2．	&lt;name&gt;HelloWorldService&lt;/name&gt;
            3．	&lt;namespace&gt;http://vivianj.org/HelloWorldService&lt;/namespace&gt;
            4．	&lt;serviceClass&gt;
            5．		org.vivianj.xfire.pojo.HelloWorldService
            6．	&lt;/serviceClass&gt;
            7．	&lt;implementationClass&gt;
            8．		org.vivianj.xfire.pojo.HelloWorldServiceImpl
            9．	&lt;/implementationClass&gt;
            10．&lt;/service&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中各元素的功能如下：</p>
<ul>
    <li><strong>service</strong>
    <p>service 标签和它所包含的 xml 内容为发布成 Web 服务的 POJO 提供完整的描述。</p>
    <li><strong>name</strong>
    <p>Web 服务被发布时所采用的唯一名称。</p>
    <li><strong>namespace</strong>
    <p>Web 服务发布时所使用的命名空间。</p>
    <li><strong>serviceClass</strong>
    <p>Web 服务接口类的全名，包括包名和类名。</p>
    <li><strong>implemetationClass</strong>
    <p>Web 服务实现类的全名，包括包名和类名。</p>
    </li>
</ul>
<p>更多 service 元素的子元素和它们的用法请参考 <a href="http://xfire.codehaus.org/services.xml+Reference"><u><font color=#5c81a7>XFire 站点</font></u></a>。</p>
<p>通过上面的三个步骤，我们已经将新创建的HelloWorldService发布成了Web服务，我们可以使用下面的步骤测试一下创建的Web服务是否能够正常运行：</p>
<ol>
    <li>编译上面的步骤中创建的 Java 接口和类；
    <li>启动 TOMCAT 服务器。
    <li>等 TOMCAT 服务器完全启动后，打开浏览器，在地址栏中输入 http://localhost:8080/XFire/services/HelloWorldService?wsdl。 </li>
</ol>
<p>其中 HelloWorldServcie 是配置文件中 service\name 元素所定义的内容，&#8221;wsdl&#8221;参数表示查看该 Web 服务的 WSDL（Web服务描述语言）文件。</p>
<p>如果浏览器中出现如下图所示类似的内容，表示 Web 服务发布成功，我们可以编写客户端访问该 Web 服务从服务器获取返回字符串，本文下载资源中提供的下载文件中包含有可供参考的客户端类 org.vivianj.xfire.pojo.client.HelloWorldServiceClient。</p>
<br><a name=N10256><strong>图：浏览器中访问效果</strong></a><br><img alt="" src="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/fig001.jpg"> <br>
<p>如果浏览器中出现错误提示，请按照上面的步骤和说明检查已经完成的开发、配置过程是否完全正确。</p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=N10263><span class=atitle>结束语</span></a></p>
<p>本文中作者首先讲解了 XFire 框架的主要特性，XFire 框架的运行环境以及基于 XFire 框架开发 SOA 应用的基本步骤，并且借助于 SOA 环境下的 &#8221;Hello World!&#8221;例子，详细的讲解和演示了如何基于 XFire 框架、经过简单的开发、配置步骤就将一个 POJO 类中包含的方法发布成Web服务。从 &#8221;Hello World!&#8221;例子实现的过程中，我们可以发现 XFire 框架最大化的发挥了 POJO 的作用，减少了 SOA 实施时对框架本身的依赖，降低了 SOA 实施的难度，企业实施 SOA 时并不需要增加太多的投入就可以实现目标。</p>
<img src ="http://www.blogjava.net/livery/aggbug/125813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/livery/" target="_blank">心情经纬</a> 2007-06-22 13:22 <a href="http://www.blogjava.net/livery/articles/125813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xfire初探(2)</title><link>http://www.blogjava.net/livery/articles/125795.html</link><dc:creator>心情经纬</dc:creator><author>心情经纬</author><pubDate>Fri, 22 Jun 2007 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/livery/articles/125795.html</guid><wfw:comment>http://www.blogjava.net/livery/comments/125795.html</wfw:comment><comments>http://www.blogjava.net/livery/articles/125795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/livery/comments/commentRss/125795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/livery/services/trackbacks/125795.html</trackback:ping><description><![CDATA[问一下.Net的开发者，开发Web Services有多困难?他们会被你的问题逗乐，他们会告诉你所有步骤花费的时间不会超过一分钟。再问一下Java开发者，运气好的话你会碰到上面的回答，一般情况下，你会得到一个完全不同的答案。从Web Services引入到Java中至今已经5年了，然而它仍然被认为是一门较新的技术，一个主要的原因就是使用Java实现Web Services太困难了。现在，随着新一代Web Services引擎XFire的发布，这种情况将会发生明显的变化。使用XFire，你可以把Java类方法发布为Web Services而不需要编写额外的代码。在这篇文章中，你将会看到XFire使Web Services开发变得多么容易和简单。
<p>　　Web Services使我们能够在网络上建立分布式系统，应用程序组件可以通过任何平台、任何语言和任何方式访问。无论应用程序如何开发，使用了什么语言，以及运行在什么操作系统平台上，只要它作为Web Service，并且为协同解决问题而设计，那么你的应用程序，以任何语言开发或在任何平台上，都可以利用它的服务。这是Web Service的主要概念。</p>
<p>　　为了实现Web Services的平台无关性和实现访问独立性，软件行业需要遵循一些作为标准的技术。其中一些包括:</p>
<p>　　---XML:在Web Services环境中各层之间进行传递的默认数据格式。</p>
<p>　　---SOAP:封装和交换信息的默认协议。第一次被提出时，它是只取Simple Object Access Protocol(简单对象访问协议)的首字母。但是现在SOAP更多被认为是一个特定的名词，以它自己而命名，同样很多人认为这是用词不当:SOAP实际上不是用来访问对象的。另外，它也不再简单。</p>
<p>　　---WSDL(Web Services Description Language，Web Services描述语言):描述Web Services的语言。尽管基于XML并且可以被人理解，WSDL主要是由机器处理，由客户端程序读取和理解。</p>
<p>　　下面的高级层次图表，基于WWW协会发布的&#8220;Web Services Architecture&#8221;(Web Services架构)文档，显示了这些技术在实际的工作环境中是如何发挥作用:</p>
<p><a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/06/39/6fu472rkvoe2.jpg" target=_blank><img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt=点击放大此图片 src="http://www.360doc.com/DownloadImg/73/228251_1.jpg" border=0></a></p>
<p>　　这个流程图显示了Web Services中的核心技术是如何工作的。</p>
<p>　　这里，Provider是提供服务的应用程序组件，Requester是使用服务的客户端程序。很多其他技术也会参与到交互中，但是这个图只显示了在Web Services环境中必需的核心技术组件。</p>
<p>　　XFire是一个免费的开源SOAP框架，它不仅可以极大方便地实现这样一个环境，并且可以提供许多Web Services规范中高级特征，这些特征在多数的商业或者开源工具都没有提供。你要恰当的理解这些单词:great ease and simplicity(非常轻松和简单)。你将会看到使用XFire创建Web Services是多么的简单。</p>
<div>　　假如你的Web应用有一个Java类，并且你想把它的一个方法发布为Web Services，当使用XFire时，你不需要编写一行额外的Java代码。只需要编辑发布描述符，然后你就会得到一个Web Services。是的，它相当地简单。我们来看一个例子。</div>
<div>&nbsp;</div>
<div><a class=f1>&nbsp;</div>
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　<strong>一个简单的Java类</strong></p>
<p>　　我们的例子是一个银行业应用程序，服务器是运行在J2SE1.4.2_07下的Apache Tomcat5.5.7。假定你已经了解如何使用Java编写Web应用程序，并知道应该如何把它部署到Apache Tomcat服务器上。我们的Web应用程序非常简单;它只做一件事——将资金从一个账户转到另外一个账户上。一个普通的Java类BankingService包含了一个叫做transferFunds()的方法来为我们完成这项工作。它需要四个输入参数:</p>
<ul>
    <li>　　1、 String fromAccount
    <li>　　2、 String toAccount
    <li>　　3、 double amount
    <li>　　4、 String currency </li>
</ul>
<p>　　代码如下:</p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3>
            <p><font face=Verdana>package com.mybank.xfire.example;</font></p>
            <p><font face=Verdana>import java.text.NumberFormat;<br>import java.text.DecimalFormat;</font></p>
            <p><font face=Verdana>/** XFire WebServices sample implementation class. <br>*/<br>public class BankingService implements IBankingService {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //Default constructor.<br>&nbsp;&nbsp;&nbsp; public BankingService(){&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** Transfers fund from one account to another.<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public String transferFunds(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fromAccount, String toAccount, double amount, String currency){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String statusMessage = "";<br>&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;&nbsp;&nbsp;&nbsp; //Call business objects and other components to get the job done.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Then create a status message and return.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberFormat formatter = new DecimalFormat("###,###,###,###.00");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return statusMessage;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>　　在这里你看到了什么异常的东西了吗?或许没有，除了默认的构造函数，类型是public。这是必须的。否则，XFire不能够初始化这个类。</div>
<div>&nbsp;</div>
<div></a><a class=f1>&nbsp;
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　因为使用接口的设计是一个好的实践，所以我们的Java类也实现了一个称为IBankingService的接口。代码十分简单:</p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3>
            <p><font face=Verdana>package com.mybank.xfire.example;</font></p>
            <p><font face=Verdana>public interface IBankingService {&nbsp; </font></p>
            <p><font face=Verdana>&nbsp;&nbsp;&nbsp; public String transferFunds(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fromAccount, String toAccount, double amount, String currency);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>　　在实际实现中，这样一个方法可能包括各种类型的复杂调用、查询和处理操作。但是我们的示例代码已经最小化了，以至于我们可以集中精力在主要目标上:把这个方法发布为Web Services。</p>
<p>　　你可以看到BankingService是一个普通的Java类，没有任何代码告诉我们它将会在Web Services中使用。好的，这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。</p>
<p>　　<strong>Web应用的部署描述符</strong></p>
<p>　　在Java中，Web应用程序通常需要至少一个部署描述符(叫做web.xml)对其进行配置。XFire本身是一个基于servlet的应用程序。因此，我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。</p>
<p>　　<strong>web.xml</strong></p>
<p>　　首先，修改web.xml。我们需要增加下面的XFire servlet相关的条目:</p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3>
            <div><font face=Verdana>&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br>&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; &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; &lt;/servlet&gt;</font></div>
            <div><font face=Verdana>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
</a><br><a class=f1>&nbsp;
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　<font face=Verdana><strong>services.xml</strong></font></p>
<p>　　现在我们不得不说一下我们的Web Services的由什么组成的了。这由一个叫做services.xml的文件完成，它存放在META-INF/xfire目录下，而这整个目录放在WEB-INF/classes文件夹中，它在Web应用程序的标准类路径中。这里是services.xml中的基本配置条目:</p>
</implementationclass>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3><font face=Verdana>&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br>&nbsp; <br>&nbsp; &lt;service&gt;<br>&nbsp;&nbsp;&nbsp; &lt;name&gt;Banking&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;namespace&gt;mybank&lt;/namespace&gt;<br>&nbsp;&nbsp;&nbsp; &lt;serviceClass&gt;com.mybank.xfire.example.IBankingService&lt;/serviceClass&gt;<br>&nbsp;&nbsp;&nbsp; &lt;implementationClass&gt;com.mybank.xfire.example.BankingService&lt;/implementationClass&gt;<br>&nbsp; &lt;/service&gt;&nbsp; <br>&nbsp; <br>&lt;/beans&gt;</font></td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;　　让我们看看这里都包含了什么内容。Web Services的定义包含在<service>元素中，它还含有一些子元素。第一个子元素是<name>，它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如，在服务准备好以后，你将在浏览器上使用这个名字来查看WSDL。</p>
<p>　　<font face=Verdana>下一个子元素是&lt;namespace&gt;。任何合法的XML名字都是可以的。&lt;namespace&gt;用来唯一标识你的服务的各个参数。<br>&lt;serviceClass&gt;元素包含了Java类的名字，它指定了方法签名。在我们的例子中，它是接口IBankingService。如果Java类没有实现任何接口，你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。</font></p>
<p><font face=Verdana>　　&lt;implementationClass&gt;保存了实现方法的Java类名。这是一个可选元素。如果上一个元素&lt;serviceClass&gt;包含了一个接口，那么相应的实现类必须在这里指定。</font></p>
<p><font face=Verdana>　　就是这样。我们的Web Services配置完成了</font>。</p>
<p>　　<strong>XFire和其它类库</strong></p>
<p>　　现在是最后一步了，需要得到所有必需的类库。我们怎样得到它们呢?去XFire网站，下载xfire-distribution-1.0.zip，然后解压到一个本地文件夹。复制下面的jar文件和它的库文件夹到WEB-INF/lib中:</p>
<ul>
    <li>　　&#8226; activation-1.0.2.jar
    <li>　　&#8226; commons-codec-1.3.jar
    <li>　　&#8226; commons-httpclient-3.0.jar
    <li>　　&#8226; commons-logging-1.0.4.jar
    <li>　　&#8226; jaxen-1.1-beta-8.jar
    <li>　　&#8226; jdom-1.0.jar
    <li>　　&#8226; log4j-1.2.x.jar
    <li>　　&#8226; mail-1.3.3_01.jar
    <li>　　&#8226; spring-1.2.x.jar
    <li>　　&#8226; stax-api-1.0.jar
    <li>　　&#8226; wsdl4j-1.5.2.jar
    <li>　　&#8226; wstx-asl-2.9.jar
    <li>　　&#8226; xbean-2.1.0.jar
    <li>　　&#8226; xbean-spring-2.2.jar
    <li>　　&#8226; xfire-all-1.0.jar
    <li>　　&#8226; XmlSchema-1.0.jar </li>
</ul>
<p>　　一切妥当。我们来部署和启动应用程序。为了部署示例应用，只需要复制websvc.war到Apache Tomcat的webapps文件夹中，再等待几秒钟。它将会自动启动。这个应用的全部源代码也包含在这个war文件中。我们的程序已经准备作为一个Web Service了。</p>
</a><a class=f1>
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　<strong>我们如何知道Web Service正在工作呢?</strong></p>
<p>　　为了了解Web Service是否正在工作，我们需要测试。首先，我们测试来看WSDL是否可用。我们在浏览器中输入URL。哪个URL?因为我们的应用程序的war文件是websvc.war，并且在services.xml中给出的服务名是Banking，WSDL的URL应该是:http://localhost:8080/websvc/services/Banking?wsdl。</p>
<p>　　请注意:URL的第一部分，例如，http://localhost:8080，可能会根据你的应用服务器不同而不同。无论怎样，当你输入URL后，将会看到一个XML文档，它的根元素是<wsdl:definitions>。这个文档叫做服务的WSDL。如果你看到了，这就是你的应用作为Web Service已经可用的第一个证明。</p>
<p>　　但是这个测试是不够的。可能会发生这种情况，可以看到WSDL，但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了，我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。</p>
<p>　　<strong>开发一个客户端</strong></p>
<p>　　你可以使用任何的SOAP工具创建客户端，例如，.Net或者Apache Axis，有很多种方法:使用从WSDL产生的stubs，使用动态代理，等等。在例子中，我们使用一个动态代理，以一个简单的Servlet形式，叫做WsClient.java。为了保持代码两最小，所有在屏幕显示的元素都放在了doGet()方法中。对Web Service的实际调用由callWebService()方法完成，它相当地简单。和下面的类似:</p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3>
            <p><font face=Verdana>/* Call the Web service<br>&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public String callWebService(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fromAccount, String toAccount, double amount, String currency) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws MalformedURLException, Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create a metadata of the service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("callSoapServiceLocal(): got service model." );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create a proxy for the deployed service<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFire xfire = XFireFactory.newInstance().getXFire();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFireProxyFactory factory = new XFireProxyFactory(xfire);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String serviceUrl = "http://localhost:8080/websvc/services/Banking";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBankingService client = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = (IBankingService) factory.create(serviceModel, serviceUrl);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (MalformedURLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Invoke the service<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String serviceResponse = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceResponse = e.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("WsClient.callWebService(): status=" + serviceResponse);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
            <p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Return the response<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return serviceResponse;<br>&nbsp;&nbsp;&nbsp; } </font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>　　这个代码是如何工作的呢?我来解释一下:首先，我们创建一个服务模型，它包含服务的说明——换句话说，就是服务的元数据。我们使用XFire的ObjectServiceFactory从IBankingService.class接口创建这个模型。</p>
<p>　　接着，为XFire获得一个代理工厂对象，它包含了常规的代码，也相当地简单和易懂。这一步中没有任何特定应用的东西。从这个proxyFactory，使用服务模型和服务端点URL(用来获得WSDL)，我们可以得到一个服务的本地代理。</p>
</a></wsdl:definitions><a class=f1>
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　就是它了。这个代理就是实际的客户端。现在，我们可以调用它的transferFunds()方法来得到我们需要的Web Service。</p>
<p>　　一旦示例应用发布并启动，就可以尝试servlet URL:</p>
<p>　　http://localhost:8080/websvc/ws。</p>
<p>　　这个Servlet使用默认参数来调用Web Service和显示接收到的响应。页面的最后两行应该读取:</p>
<p>　　Response Received<br>　　COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678</p>
<p>　　现在你可以确定Web Service已经发布并且在运行中了。</p>
<p>　　为了尝试不同的输入值，你可以使用完整的URL，例如:</p>
<p>　　http://localhost:8080/websvc/ws?from=11-2345&amp;to=77-9876&amp;amt=250.00&amp;cur=EUR。</p>
<p>　　<strong>基本的Web Services开发步骤清单</strong></p>
<p>　　这个清单总结了将一个Java方法发布为Web Service所必须的步骤:</p>
<ul>
    <li>　　1、 检查Java类的方法和默认构造函数确保为public
    <li>　　2、 增加XFire servlet相关条目到web.xml中
    <li>　　3、 创建services.xml，把它放到WEB-INF/classes/META-INF/xfire目录下
    <li>　　4、 增加XFire和第三方包到你的Web应用的WEB-INF/lib文件夹中 </li>
</ul>
<p>　　这就是所有需要的步骤，是的，相当简单。</p>
<p>　　<strong>XFire的其他高级特性</strong></p>
<p>　　XFire的使用可能比较简单，但是在特性和功能性上，它却占据着领导者的位置。下面是它的高级特性:</p>
<ul>
    <li>　　---本地数据绑定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。数据绑定说明了Web Services的XML请求和映射到Java对象的XML响应。
    <li>　　---使用StAX(Streaming API for XML)处理XML文档。同DOM的基于树和SAX的事件驱动的处理方式相比，StAX使用了拉(pull)机制，它使处理更快速，内存效率更高。
    <li>　　---支持多种传输协议，如HTTP、JMS(Java Message Service)和JVM内部传输。
    <li>　　---嵌入式，这是XFire的核心功能之一。你可以把这个SOAP引擎嵌入到你的应用中，完全隐藏所有XFire特定引用，同样所有配置都是程序驱动。
    <li>　　---丰富的API，它使XFire可高度自定义，允许开发者在不同的阶段截获请求，并且对他们进行处理。
    <li>　　---兼容最新的标准例如SOAP1.1(没有加密远程工程调用，或者RPC)和1.2、WSDL1.1、the Web Services Interoperability Organization&#8217;s Basic Profile 1.0、Web Services Addressing和WS-Security。 </li>
</ul>
<p>　　最重要的是，XFire属于新一代Web Services引擎。不仅仅是营销用语，&#8220;新一代&#8221;有一些重要的意义。Apache Axis是第一代Java语言的Web Services引擎，已经成为了所有后来工具的参考标准。在过去的几年里，Axis以及这些其它的工具已经在很多生产环境中进行了实地测试。从中得出的一个关键的问题就是Web Services并不最适合RPC类型的通信。对于性能和效率，面向文档的消息形式是最好的方式。但是Apache Axis和很多其他的Web Services引擎都被设计成了面向RPC的(尽管它们支持文档形式)。现在，整个行业正在开发新一代的SOAP引擎，设计为面向文档的。Apache已经宣布结束旧版本的Axis引擎开发，现在专注于Axis2，现在它的预发布版本是0.95。XFire在今年的2月份发布了它的第一个产品版本(1.0)。它的下一个版本(1.1)仅仅在几个星期之后就进行了发布。</p>
</a><a class=f1>
<div class=guanggao><span id=contentAdv></span></div>
<p>&nbsp;</p>
<p>　　<strong>性能</strong></p>
<p>　　Web Services需要消耗很多资源，但是性能方面它们不是那么引人注目。XFire打破了这种趋势。它消耗更少的内存(部分因为 StAX的使用)，但是表现却比多数可比较的SOAP引擎出色。你可以在资源中提供的链接中看到比较的结果。</p>
<p>　　此外，XFire还提供了各种方法来进一步优化性能。一个方法是使用JVM内置传输(in-JVM transport)。如果你知道Web Services和客户端运行在同一个JVM上，你可以选择使用本地传输，它可以大幅提升性能。在示例中的客户端代码，看以下指定服务端点URL的这行:</p>
<p>　　String serviceUrl = "http://localhost:8080/websvc/services/Banking";</p>
<p>　　替换为</p>
<p>　　String serviceUrl = "xfire.local://Banking";</p>
<p>　　你会看到性能上的明显提高，因为它绕过了整个网络层。</p>
<p>　　<strong>局限性</strong></p>
<p>　　XFire有些重要的局限性你应该清楚:</p>
<ul>
    <li>　　---开发Web Services的好的实践是从WSDL开始。大部分的SOAP引擎提供了从WSDL生成服务stub的工具。XFire也提供了这样一个工具。但是它是基于注释(annotations-based)的，因此需要J2SE5.0。对于仍坚持使用J2SE1.4.x的人来说，它不是一个令人拍手叫好的工具，因为我们有很多其他方式来编写客户端，一个就是文章中演示的方式。
    <li>　　---附件支持，它将会包含在未来发行的版本中。
    <li>　　---易于学习的用户向导。XFire团队在这个方面还有很多工作需要做。 </li>
</ul>
<p>　　<strong>结论</strong></p>
<p>　　Java当前的趋势是简化技术的使用。因此，我们正看到一波基于POJO的开发成就。同时，面向服务架构(SOA，Services-oriented architecture)和Web Services已经变成了当前行业的热点话题。XFire正是在这种情况下产生的。它能够使POJO发布为最少的Web Services，而只需要付出最小化的努力。从而，它使希望使用这项技术的初级开发者的学习曲线变得平缓。同时，由于它兼容最新标准和提供了丰富的API，XFire为高级用户提供了更多的大好机会。</p>
</a></div>
<img src ="http://www.blogjava.net/livery/aggbug/125795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/livery/" target="_blank">心情经纬</a> 2007-06-22 11:56 <a href="http://www.blogjava.net/livery/articles/125795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>