﻿<?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-romkk-shi-随笔分类-专题技术</title><link>http://www.blogjava.net/romkk-shi/category/24589.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Aug 2007 10:25:17 GMT</lastBuildDate><pubDate>Mon, 13 Aug 2007 10:25:17 GMT</pubDate><ttl>60</ttl><item><title>使用xfire建立webservice </title><link>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136371.html</link><dc:creator>路边的石头-java</dc:creator><author>路边的石头-java</author><pubDate>Mon, 13 Aug 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136371.html</guid><wfw:comment>http://www.blogjava.net/romkk-shi/comments/136371.html</wfw:comment><comments>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/romkk-shi/comments/commentRss/136371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/romkk-shi/services/trackbacks/136371.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p align=center><font size=3><span>webservice</span><span>的工作原理</span></font></p>
<p align=center><font size=3></font></p>
<p align=center><span><font face="Times New Roman" size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zxs9999/clip_image001.jpg">&nbsp;</font></span></p>
<p><font size=3><span>实际上，</span><span><font face="Times New Roman">WebService</font></span><span>的主要目标是跨平台的可互操作性。为了达到这一目标，</span><span><font face="Times New Roman">WebService</font></span><span>完全基于</span><span><font face="Times New Roman">XML</font></span><span>（可扩展标记语言）、</span><span><font face="Times New Roman">XSD</font></span><span>（</span><span><font face="Times New Roman">XMLSchema</font></span><span>）等独立于平台、独立于软件供应商的标准，是创建可互操作的、分布式应用程序的新平台。由此可以看出，在以下四种情况下，使用</span><span><font face="Times New Roman">WebService</font></span><span>会带来极大的好处。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>优势一：跨防火墙的通信</font></span></p>
<p><font size=3><span>如果应用程序有成千上万的用户，而且分布在世界各地，那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。在这种情况下，使用</span><span><font face="Times New Roman">DCOM</font></span><span>就不是那么简单，通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是，选择用浏览器作为客户端，写下一大堆</span><span><font face="Times New Roman">ASP</font></span><span>页面，把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大，程序很难维护。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>举个例子，在应用程序里加入一个新页面，必须先建立好用户界面</span><span><font face="Times New Roman">(Web</font></span><span>页面</span><span><font face="Times New Roman">)</font></span><span>，并在这个页面后面，包含相应商业逻辑的中间层组件，还要再建立至少一个</span><span><font face="Times New Roman">ASP</font></span><span>页面，用来接受用户输入的信息，调用中间层组件，把结果格式化为</span><span><font face="Times New Roman">HTML</font></span><span>形式，最后还要把&#8220;结果页&#8221;送回浏览器。要是客户端代码不再如此依赖于</span><span><font face="Times New Roman">HTML</font></span><span>表单，客户端的编程就简单多了。</span></font></p>
<p><font size=3><span>如果中间层组件换成</span><span><font face="Times New Roman">WebService</font></span><span>的话，就可以从用户界面直接调用中间层组件，从而省掉建立</span><span><font face="Times New Roman">ASP</font></span><span>页面的那一步。要调用</span><span><font face="Times New Roman">WebService</font></span><span>，可以直接使用</span><span><font face="Times New Roman">MicrosoftSOAPToolkit</font></span><span>或</span><span><font face="Times New Roman">.NET</font></span><span>这样的</span><span><font face="Times New Roman">SOAP</font></span><span>客户端，也可以使用自己开发的</span><span><font face="Times New Roman">SOAP</font></span><span>客户端，然后把它和应用程序连接起来。不仅缩短了开发周期，还减少了代码复杂度，并能够增强应用程序的可维护性。同时，应用程序也不再需要在每次调用中间层组件时，都跳转到相应的&#8220;结果页&#8221;。</span></font></p>
<p><font size=3><span>从经验来看，在一个用户界面和中间层有较多交互的应用程序中，使用</span><span><font face="Times New Roman">WebService</font></span><span>这种结构，可以节省花在用户界面编程上</span><span><font face="Times New Roman">20%</font></span><span>的开发时间。另外，这样一个由</span><span><font face="Times New Roman">WebService</font></span><span>组成的中间层，完全可以在应用程序集成或其它场合下重用。最后，通过</span><span><font face="Times New Roman">WebService</font></span><span>把应用程序的逻辑和数据&#8220;暴露&#8221;出来，还可以让其它平台上的客户重用这些应用程序。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>优势二：应用程序集成</font></span></p>
<p><font size=3><span>允许在不同平台上、以不同语言编写的各种程序以基于标准的方式相互通信。企业级的应用程序开发者都知道，企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来，而这种集成将花费很大的开发力量。应用程序经常需要从运行在</span><span><font face="Times New Roman">IBM</font></span><span>主机上的程序中获取数据；或者把数据发送到主机或</span><span><font face="Times New Roman">UNIX</font></span><span>应用程序中去。即使在同一个平台上，不同软件厂商生产的各种软件也常常需要集成起来。通过</span><span><font face="Times New Roman">WebService</font></span><span>，应用程序可以用标准的方法把功能和数据&#8220;暴露&#8221;出来，供其它应用程序使用。</span></font></p>
<p><font size=3><span>例如，有一个订单记录程序，用于从客户获得新订单，包括客户信息、发货地址、数量、价格和付款方式等内容；还有一个订单执行程序，用于实际货物发送的管理。这两个程序来自不同软件厂商。一份新订单进来之后，订单记录程序需要通知订单执行程序发送货物。通过在订单执行程序上面增加一层</span><span><font face="Times New Roman">WebService</font></span><span>，订单执行程序可以把&#8220;</span><span><font face="Times New Roman">AddOrder</font></span><span>&#8221;函数&#8220;暴露&#8221;出来。这样，每当有新订单到来时，订单登录程序就可以调用这个函数来发送货物了。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>优势三：</span><span><font face="Times New Roman">B2B</font></span><span>的集成</span></font></p>
<p><font size=3><span>用</span><span><font face="Times New Roman">WebService</font></span><span>集成应用程序，可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢？跨公司的商务交易集成通常叫做</span><span><font face="Times New Roman">B2B</font></span><span>集成。</span></font></p>
<p><font size=3><span><font face="Times New Roman">WebService</font></span><span>是</span><span><font face="Times New Roman">B2B</font></span><span>集成成功的关键。通过</span><span><font face="Times New Roman">WebService</font></span><span>，公司可以把关键的商务应用&#8220;暴露&#8221;给指定的供应商和客户。例如，把电子下单系统和电子发票系统&#8220;暴露&#8221;出来，客户就可以以电子的方式发送订单，供应商则可以以电子的方式发送原料采购发票。当然，这并不是一个新的概念，</span><span><font face="Times New Roman">EDI(</font></span><span>电子文档交换</span><span><font face="Times New Roman">)</font></span><span>早就是这样了。但是，</span><span><font face="Times New Roman">WebService</font></span><span>的实现要比</span><span><font face="Times New Roman">EDI</font></span><span>简单得多，而且</span><span><font face="Times New Roman">WebService</font></span><span>运行在</span><span><font face="Times New Roman">Internet</font></span><span>上，在世界任何地方都可轻易实现，其运行成本就相对较低。不过，</span><span><font face="Times New Roman">WebService</font></span><span>并不像</span><span><font face="Times New Roman">EDI</font></span><span>那样，是文档交换或</span><span><font face="Times New Roman">B2B</font></span><span>集成的完整解决方案。</span><span><font face="Times New Roman">WebService</font></span><span>只是</span><span><font face="Times New Roman">B2B</font></span><span>集成的一个关键部分，还需要许多其它的部分才能实现集成。</span></font></p>
<p><font size=3><span>用</span><span><font face="Times New Roman">WebService</font></span><span>来实现</span><span><font face="Times New Roman">B2B</font></span><span>集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑&#8220;暴露&#8221;出来，成为</span><span><font face="Times New Roman">WebService</font></span><span>，就可以让任何指定的合作伙伴调用这些商务逻辑，而不管他们的系统在什么平台上运行，使用什么开发语言。这样就大大减少了花在</span><span><font face="Times New Roman">B2B</font></span><span>集成上的时间和成本，让许多原本无法承受</span><span><font face="Times New Roman">EDI</font></span><span>的中小企业也能实现</span><span><font face="Times New Roman">B2B</font></span><span>集成。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>优势四：软件和数据重用</font></span></p>
<p><span><font size=3>软件重用是一个很大的主题，重用的形式很多，重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用，另一种形式是二进制形式的组件重用。</font></span></p>
<p><font size=3><span>用</span><span><font face="Times New Roman">WebService</font></span><span>集成各种应用中的功能，为用户提供一个统一的界面</span></font></p>
<p><span><font size=3>当前，像表格控件或用户界面控件这样的可重用软件组件，在市场上都占有很大的份额。但这类软件的重用有一个很大的限制，就是重用仅限于代码，数据不能重用。原因在于，发布组件甚至源代码都比较容易，但要发布数据就没那么容易，除非是不会经常变化的静态数据。</font></span></p>
<p><font size=3><span><font face="Times New Roman">WebService</font></span><span>在允许重用代码的同时，可以重用代码背后的数据。使用</span><span><font face="Times New Roman">WebService</font></span><span>，再也不必像以前那样，要先从第三方购买、安装软件组件，再从应用程序中调用这些组件；只需要直接调用远端的</span><span><font face="Times New Roman">WebService</font></span><span>就可以了。举个例子，要在应用程序中确认用户输入的地址，只需把这个地址直接发送给相应的</span><span><font face="Times New Roman">WebService</font></span><span>，这个</span><span><font face="Times New Roman">WebService</font></span><span>就会帮你查阅街道地址、城市、省区和邮政编码等信息，确认这个地址是否在相应的邮政编码区域。</span><span><font face="Times New Roman">WebService</font></span><span>的提供商可以按时间或使用次数来对这项服务进行收费。这样的服务要通过组件重用来实现是不可能的，那样的话你必须下载并安装好包含街道地址、城市、省区和邮政编码等信息的数据库，而且这个数据库还是不能实时更新的。</span></font></p>
<p><font size=3><span>另一种软件重用的情况是，把好几个应用程序的功能集成起来。例如，要建立一个局域网上的门户站点应用，让用户既可以查询联邦快递包裹，查看股市行情，又可以管理自己的日程安排，还可以在线购买电影票。现在</span><span><font face="Times New Roman">Web</font></span><span>上有很多应用程序供应商，都在其应用中实现了这些功能。一旦他们把这些功能都通过</span><span><font face="Times New Roman">WebService</font></span><span>&#8220;暴露&#8221;出来，就可以非常容易地把所有这些功能都集成到你的门户站点中，为用户提供一个统一的、友好的界面。</span></font></p>
<p><font size=3><span>将来，许多应用程序都会利用</span><span><font face="Times New Roman">WebService</font></span><span>，把当前基于组件的应用程序结构扩展为组件</span><span><font face="Times New Roman">/WebService</font></span><span>的混合结构，可以在应用程序中使用第三方的</span><span><font face="Times New Roman">WebService</font></span><span>提供的功能，也可以把自己的应用程序功能通过</span><span><font face="Times New Roman">WebService</font></span><span>提供给别人。两种情况下，都可以重用代码和代码背后的数据。</span></font></p>
<p><font size=3><span>从以上论述可以看出，</span><span><font face="Times New Roman">WebService</font></span><span>在通过</span><span><font face="Times New Roman">Web</font></span><span>进行互操作或远程调用的时候是最有用的。不过，也有一些情况，</span><span><font face="Times New Roman">WebService</font></span><span>根本不能带来任何好处。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>短处一：单机应用程序</font></span></p>
<p><font size=3><span>目前，企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下，最好就不要用</span><span><font face="Times New Roman">WebService</font></span><span>，只要用本地的</span><span><font face="Times New Roman">API</font></span><span>就可以了。</span><span><font face="Times New Roman">COM</font></span><span>非常适合于在这种情况下工作，因为它既小又快。运行在同一台服务器上的服务器软件也是这样。最好直接用</span><span><font face="Times New Roman">COM</font></span><span>或其它本地的</span><span><font face="Times New Roman">API</font></span><span>来进行应用程序间的调用。当然</span><span><font face="Times New Roman">WebService</font></span><span>也能用在这些场合，但那样不仅消耗太大，而且不会带来任何好处。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>短处二：局域网的同构应用程序</font></span></p>
<p><font size=3><span>在许多应用中，所有的程序都是用</span><span><font face="Times New Roman">VB</font></span><span>或</span><span><font face="Times New Roman">VC</font></span><span>开发的，都在</span><span><font face="Times New Roman">Windows</font></span><span>平台下使用</span><span><font face="Times New Roman">COM</font></span><span>，都运行在同一个局域网上。例如，有两个服务器应用程序需要相互通信，或者有一个</span><span><font face="Times New Roman">Win32</font></span><span>或</span><span><font face="Times New Roman">WinForm</font></span><span>的客户程序要连接局域网上另一个服务器的程序。在这些程序里，使用</span><span><font face="Times New Roman">DCOM</font></span><span>会比</span><span><font face="Times New Roman">SOAP/HTTP</font></span><span>有效得多。与此相类似，如果一个</span><span><font face="Times New Roman">.NET</font></span><span>程序要连接到局域网上的另一个</span><span><font face="Times New Roman">.NET</font></span><span>程序，应该使用</span><span><font face="Times New Roman">.NETremoting</font></span><span>。有趣的是，在</span><span><font face="Times New Roman">.NETremoting</font></span><span>中，也可以指定使用</span><span><font face="Times New Roman">SOAP/HTTP</font></span><span>来进行</span><span><font face="Times New Roman">WebService</font></span><span>调用。不过最好还是直接通过</span><span><font face="Times New Roman">TCP</font></span><span>进行</span><span><font face="Times New Roman">RPC</font></span><span>调用，那样会有效得多。</span></font></p>
<p><font size=3><span>总之，只要从应用程序结构的角度看，有别的方法比</span><span><font face="Times New Roman">WebService</font></span><span>更有效、更可行，那就不要用</span><span><font face="Times New Roman">WebService</font></span><span>。</span></font></p>
<p><font size=3><span>将</span><span><font face="Times New Roman">Web Service</font></span><span>定义为：通过</span><span><font face="Times New Roman"> SOAP </font></span><span>在</span><span><font face="Times New Roman"> Web</font></span><span>上提供的软件服务，使用</span><span><font face="Times New Roman"> WSDL </font></span><span>文件进行说明，并通过</span><span><font face="Times New Roman"> UDDI </font></span><span>进行注册。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">Web Service</font></span><span>架构：</span><span><font face="Times New Roman">Web Service</font></span><span>是独立的、模块化的应用，能够通过因特网来描述、发布、定位以及调用。在</span><span><font face="Times New Roman">Web Service</font></span><span>的体系架构中包括三个角色：服务提供者</span><span><font face="Times New Roman">(Service Provider)</font></span><span>、服务请求者</span><span><font face="Times New Roman">(Service Requestor)</font></span><span>、服务注册器</span><span><font face="Times New Roman">(Service Registry)</font></span><span>。角色间主要有三个操作：发布</span><span><font face="Times New Roman">(Publish)</font></span><span>、查找</span><span><font face="Times New Roman">(Find)</font></span><span>、绑定</span><span><font face="Times New Roman">(Bind)</font></span><span>。</span></font></p>
<p><span><font size=3>下图清楚的描述了三种角色，以及角色之间的作用关系。</font></span></p>
<p><span><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zxs9999/image001.jpg"></span></p>
<p align=center><span><font size=3></font></span></p>
<p><font size=3><span><font face="Times New Roman">Web Service</font></span><span>协议标准</span></font></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>、简单对象访问协议（</span><span><font face="Times New Roman">SOAP</font></span><span>）</span></font></p>
<p><font size=3><span><font face="Times New Roman">SOAP</font></span><span>是</span><span><font face="Times New Roman">Simple Object Access Protocol</font></span><span>的缩写，是一种基于</span><span><font face="Times New Roman">XML</font></span><span>的不依赖传输协议的表示层协议，用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在</span><span><font face="Times New Roman">SOAP</font></span><span>的下层，可以是</span><span><font face="Times New Roman">HTTP</font></span><span>，也可以是</span><span><font face="Times New Roman">SMTP/POP3</font></span><span>，还可以是为一些应用而专门设计的特殊的通信协议。</span></font></p>
<p><font size=3><span><font face="Times New Roman">SOAP</font></span><span>包括三个主要部分：</span></font></p>
<p><font size=3><span><font face="Times New Roman">SOAP</font></span><span>封装结构：定义了一个整体框架，以表示消息中包含什么内容，谁来处理这些内容以及这些内容是可选的或是必需的。</span></font></p>
<p><font size=3><span><font face="Times New Roman">SOAP</font></span><span>编码规则：定义了用以交换应用程序定义的数据类型的实例的一系列机制。</span></font></p>
<p><font size=3><span><font face="Times New Roman">SOAP RPC</font></span><span>表示：定义了一个用来表示远程过程调用和应答的协定。</span></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>、</span><span><font face="Times New Roman">Web Service</font></span><span>描述语言（</span><span><font face="Times New Roman">WSDL</font></span><span>）</span></font></p>
<p><font size=3><span><font face="Times New Roman">WSDL</font></span><span>是</span><span><font face="Times New Roman">Web Service Description Language</font></span><span>的缩写，该语言将网络服务定义成一个能交换消息的通信端点集，为分布式系统提供了帮助文档，同时也可作为自动实现应用间通信的解决方案。</span></font></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>、统一描述、发现和集成协议（</span><span><font face="Times New Roman">UDDI</font></span><span>）</span></font></p>
<p><font size=3><span><font face="Times New Roman">UDDI</font></span><span>是一套基于</span><span><font face="Times New Roman">Web</font></span><span>的、分布式的、为</span><span><font face="Times New Roman">Web Service</font></span><span>提供的、信息注册中心的实现标准规范，同时也包含一组使企业能将自身提供的</span><span><font face="Times New Roman">Web Service</font></span><span>注册，以使别的企业能够发现的访问协议的实现标准。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>通过</span><span><font face="Times New Roman">xfire</font></span><span>实现了</span><span><font face="Times New Roman">webservice</font></span><span>。下面详细介绍一下</span><span><font face="Times New Roman">xfire</font></span><span>。</span></font></p>
<p><font size=3><span><font face="Times New Roman">XFire</font></span><span>是一个免费的</span><span><font face="Times New Roman">,</font></span><span>开源的</span><span><font face="Times New Roman">SOAP</font></span><span>框架</span><span><font face="Times New Roman">. </font></span><span>它不仅允许你<span>轻松简易</span>地实现这么一个环境</span><span><font face="Times New Roman">.</font></span><span>而且还提供了很多先进的特性</span><span><font face="Times New Roman">.</font></span><span>如果你的</span><span><font face="Times New Roman">Web</font></span><span>应用有一个</span><span><font face="Times New Roman">Java</font></span><span>类</span><span><font face="Times New Roman">, </font></span><span>现在你希望这个类变成</span><span><font face="Times New Roman">Web</font></span><span>服务</span><span><font face="Times New Roman">,</font></span><span>用</span><span><font face="Times New Roman">XFire</font></span><span>完成这一工作你不必写一句代码</span><span><font face="Times New Roman">.</font></span><span>仅需操作一下部署描述器</span><span><font face="Times New Roman">,</font></span><span>你就会得到一个</span><span><font face="Times New Roman">Web</font></span><span>服务</span><span><font face="Times New Roman">.</font></span></font></p>
<p><font size=3><span><span><font face="Times New Roman">一、</font></span></span><span>建立接口文件</span><span><font face="Times New Roman">com.resoft.recis.ws.ReCISService</font></span></font></p>
<p><span><font face="Times New Roman" size=3>public interface ReCISService {</font></span></p>
<p><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span>请求系统设置信息</span></font></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public AppInfo getAppInfo();</font></font></span></p>
<p><span><font face="Times New Roman" size=3>}</font></span></p>
<p><span><font face="Times New Roman" size=3>public class ReCISServiceImp implements ReCISService {</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public com.resoft.recis.ws.AppInfo getAppInfo() {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return com.resoft.recis.ws.AppInfo.getAppInfo();</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p><span><font face="Times New Roman" size=3>}</font></span></p>
<p><font size=3><span><span><font face="Times New Roman">二、</font></span></span><span>已存在类</span><span><font face="Times New Roman">com.resoft.recis.ws. AppInfo</font></span></font></p>
<p><span><font face="Times New Roman" size=3>public class AppInfo {</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>double cardLeft;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/** default constructor */</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public AppInfo() {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public double getCardLeft() {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return cardLeft;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setCardLeft(double cardLeft) {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.cardLeft = cardLeft;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static &nbsp;AppInfo getAppInfo() {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Session session = HibernateUtil.getSession();</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.resoft.recis.biz.AppInfo dbappinfo = (com.resoft.recis.biz.AppInfo) Util</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><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; </span>.getHQLResult(session, "from AppInfo");</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (dbappinfo == null) {</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return null;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.resoft.recis.ws.AppInfo appinfo = new com.resoft.recis.ws.AppInfo();</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setOperid("");</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setOrgcode("");</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setCardHeight(dbappinfo.getCardHeight());</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setCardLeft(dbappinfo.getCardLeft());</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setCardTop(dbappinfo.getCardTop());</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>appinfo.setCardWidth(dbappinfo.getCardWidth());</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HibernateUtil.closeSession();</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return appinfo;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p><span><font face="Times New Roman" size=3>}</font></span></p>
<p><font size=3><font face="Times New Roman"><span><span>三、</span></span><span>Web.xml</span></font><span>应用的部署描述</span></font></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;!—<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>xfire</span><span>的</span><span>servlet</span><span>配置文件</span><span> --&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>XFireServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>display-name</span><span>&gt;</span><span>XFire Servlet</span><span>&lt;/</span><span>display-name</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-class</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>org.codehaus.xfire.transport.http.XFireConfigurableServlet</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>servlet-class</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>servlet</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-mapping</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>XFireServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/servlet/XFireServlet/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>servlet-mapping</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-mapping</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>XFireServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/services/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>servlet-mapping</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>servlet-mapping</span><span>&gt;</span></p>
<p><font size=3><span><span><font face="Times New Roman">四、</font></span></span><span>创建</span><span><font face="Times New Roman">services.xml</font></span><span>文件</span></font></p>
<p><font size=3><span><font face="Times New Roman">XFire</font></span><span>本身就是基于</span><span><font face="Times New Roman">Servlet</font></span><span>的应用</span><span><font face="Times New Roman">,xfire</font></span><span>使用</span><span><font face="Times New Roman">services.xml</font></span><span>文件来完成</span><span>Web</span><span>服务</span><span>配置。</span><span>这个文件位于</span><span>src/META-INF/xfire</span><span>目录下</span><span>,</span></font></p>
<p><span><font face="Times New Roman" size=3>src\META-INF\xfire</font></span></p>
<p><font size=3><span>下面是基本的配置条目，</span><span>这个配置文件中配置了</span><span><font face="Times New Roman">xfire</font></span><span>的接口，实现与验印控件的交互。</span></font></p>
<p><span>&lt;</span><span>beans </span><span>xmlns</span><span>=</span><span>"http://xfire.codehaus.org/config/1.0"</span><span>&gt;</span></p>
<p><span>&nbsp;</span><span>&lt;</span><span>service</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>name</span><span>&gt;</span><span>ReCISService</span><span>&lt;/</span><span>name</span><span>&gt;</span><span><span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>namespace</span><span>&gt;</span><span>http://resoft</span><span>&lt;/</span><span>namespace</span><span>&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>serviceClass</span><span>&gt;</span><span>com.resoft.recis.ws.ReCISService</span><span>&lt;/</span><span>serviceClass</span><span>&gt;</span><span><span>&nbsp;&nbsp; </span></span><span>&lt;</span><span>implementationClass</span><span>&gt;</span><span>com.resoft.recis.ws.ReCISServiceImp</span><span>&lt;/</span><span>implementat<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ionClass</span><span>&gt;</span><span> </span></p>
<p><span>&nbsp;</span><span>&lt;/</span><span>service</span><span>&gt;</span></p>
<p><span>&lt;/</span><span>beans</span><span>&gt;</span></p>
<p>&nbsp;</p>
<p><font size=3><span>services.xml</span><span>文件中的具体内容如下：</span></font></p>
<p><font size=3><span>&lt;service&gt;</span><span>元素：</span></font></p>
<p><font size=3><span>对</span><span>Web</span><span>服务的定义包含在</span><span>&lt;service&gt;</span><span>元素内。</span><span>&lt;service&gt;</span><span>元素下还有若干子元素。</span></font></p>
<p><font size=3><span>&lt;name&gt;</span><span>子元素：</span></font></p>
<p><font size=3><span>可以提供任何有效的</span><span>xml</span><span>名字</span><span>,</span><span>这个名字会被客户端程序和服务器上的其他组件使用</span><span>.</span><span>例如</span><span>,</span><span>当服务器起来以后</span><span>,</span><span>你可以在浏览器上使用这个名称来查看</span><span>WSDL.</span></font></p>
<p><font size=3><span>&lt;namespace&gt;</span><span>子元素：</span></font></p>
<p><font size=3><span>任何有效地</span><span>xml</span><span>名称都可以</span><span>, &lt;namespace&gt;</span><span>将作为你服务器的唯一标识变量使用</span><span>.</span></font></p>
<p><font size=3><span>&lt;serviceClass&gt;</span><span>子元素：</span></font></p>
<p><font size=3><span>包含</span><span>Java</span><span>类名用来指明方法的签名</span><span>.</span><span>在这个例子中是</span><span>ReCISService</span><span>接口</span><span>.</span><span>如果</span><span>Java</span><span>类没有实现任何接口</span><span>,</span><span>那就填入类名</span><span>.</span><span>只需要这一个入口来将他们转换成</span><span>Web</span><span>服务</span><span>.</span></font></p>
<p><font size=3><span>&lt;implementationClass&gt;</span><span>子元素：</span></font></p>
<p><font size=3><span>记录实现接口的</span><span>Java</span><span>类名</span><span>.</span><span>这是一个可选元素</span><span>.</span><span>如果前一个元素</span><span>&lt;serviceClass&gt;</span><span>填入的是接口</span><span>,</span><span>那么此处就要填入相应的实现类名</span><span>.</span></font></p>
<p><font size=3><span><span>五、</span></span><span>XFire</span><span>和所有必要的库文件</span></font></p>
<p><font size=3><span>访问</span><span>XFire</span><span>官方网站</span><span><a href="http://xfire.codehaus.org/"><span>http://xfire.codehaus.org/</span></a>&nbsp;</span><span>下载</span><span>xfire-distribution-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.2.5</st1:chsdate>.zip</span><span>并解压到本地文件夹中</span><span>.</span><span>参考</span><span>xfire-distribution-1.2.5\xfire-1.2.5\manual\Dependency Guide.html</span><span>中介绍拷贝相关</span><span>jar</span><span>包到</span><span>WEB-INF\lib</span><span>，</span><span>xfire-distribution-1.2.5</span><span>需要的</span><span>jar</span><span>包如下：</span></font></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>&nbsp;&nbsp;xfire-all-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.2.5</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>&nbsp;activation-1.1.jar </font></span></p>
<p><span><font size=3>commons-codec-1.3.jar</font></span></p>
<p><span><font size=3>commons-httpclient-3.0.jar</font></span></p>
<p><span><font size=3>commons-logging-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.4</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>mail-1.4.jar</font></span></p>
<p><span><font size=3>jaxen-1.1-beta-9.jar</font></span></p>
<p><span><font size=3>jdom-1.0.jar</font></span></p>
<p><span><font size=3>junit-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.8.1</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>servlet-api-2.3.jar</font></span></p>
<p><span><font size=3>spring-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.2.6</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>stax-api-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.1</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>wsdl4j-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.1</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>wstx-asl-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.2.0</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>xbean-<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.2.0</st1:chsdate>.jar</font></span></p>
<p><span><font size=3>xbean-spring-2.8.jar</font></span></p>
<p><span><font size=3>XmlSchema-1.1.jar</font></span></p>
<p><span><font size=3>xfire-jsr181-api-1.0-M1.jar</font></span></p>
<p><font size=3><span><span>六、</span></span><span>通过</span><span>URL</span><span>验证</span><span>Web</span><span>服务有效性</span></font></p>
<p><font size=3><span>首先</span><span>,</span><span>我们先来看看</span><span>WSDL</span><span>是否有效。在浏览器中输入</span><span>URL</span><span>地址为</span><span><a href="http://127.0.0.1/ReCIS/services/ReCISService?wsdl">http://127.0.0.1/test/services/ReCISService?wsdl</a> </span><span>注意</span><span>URL</span><span>中</span><span>IP</span><span>地址和端口号是否需要修改。</span><span>如果输入了有效的</span><span><font face="Times New Roman">URL,</font></span><span>将会看到以</span><span><font face="Times New Roman">&lt;wsdl:definitions&gt;</font></span><span>为根结点的</span><span><font face="Times New Roman">xml</font></span><span>文件。这个文件叫做</span><span><font face="Times New Roman">web</font></span><span>服务的</span><span><font face="Times New Roman">WSDL.</font></span><span>如果你看到了这个文件，那么初步验证你的</span><span><font face="Times New Roman">Web</font></span><span>服务有效。</span></font></p>
<p><font size=3><span>但是这个验证还不够。有时候情况会复杂一些，你可以看到</span><span><font face="Times New Roman">WSDL</font></span><span>，但是客户端却无法访问</span><span><font face="Times New Roman">Web</font></span><span>服务。因此要真正检验</span><span><font face="Times New Roman">Web</font></span><span>服务是否真的好使，就要用客户端程序对</span><span><font face="Times New Roman">Web</font></span><span>服务作一次真正的调用。</span></font></p>
<p><font size=3><span><span>七、</span></span><span>客户端验证</span><span>Web</span><span>服务有效性</span></font></p>
<p><font size=3><span>建立下面测试类测试</span><span>Web</span><span>服务器的有效性。</span></font></p>
<p><span><font size=3>public class TestWebservice</font></span></p>
<p><span><font size=3>{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public static void main(String args[])</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String serviceURL ="http://127.0.0.1/test/services/ReCISService";&nbsp;</font></span><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>Service serviceModel = new ObjectServiceFactory().create(ReCISService.class,null,"http://resoft",null);</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>XFireProxyFactory serviceFactory = new XFireProxyFactory();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>ReCISService service = (ReCISService) serviceFactory.create(serviceModel, serviceURL);</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Client client = Client.getInstance(service);</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("begin");</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.resoft.recis.ws.AppInfo ai=service.getAppInfo();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(ai.getCardHeight());</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("end");</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch (MalformedURLException e)</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>e.printStackTrace();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} catch (Exception e) {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>e.printStackTrace();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>}</font></span></p><script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.blogjava.net/romkk-shi/aggbug/136371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/romkk-shi/" target="_blank">路边的石头-java</a> 2007-08-13 14:17 <a href="http://www.blogjava.net/romkk-shi/archive/2007/08/13/136371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是Web Service？</title><link>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136370.html</link><dc:creator>路边的石头-java</dc:creator><author>路边的石头-java</author><pubDate>Mon, 13 Aug 2007 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136370.html</guid><wfw:comment>http://www.blogjava.net/romkk-shi/comments/136370.html</wfw:comment><comments>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/romkk-shi/comments/commentRss/136370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/romkk-shi/services/trackbacks/136370.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p style="TEXT-INDENT: 2em">Web service到底是什么；在什么情况下你应该使用Web service。
<p style="TEXT-INDENT: 2em">分布式应用程序和浏览器
<p style="TEXT-INDENT: 2em">研究一下当前的应用程序开发，你会发现一个绝对的倾向：人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面，而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高，一半是因为应用程序安装和配置的问题，另一半是因为客户和服务器之间通信的问题。
<p style="TEXT-INDENT: 2em">传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作，同时也是许多IT工程师的噩梦。事实上，许多IT工程师宁愿忍受浏览器所带来的功能限制，也不愿在局域网上去运行一个DCOM。在我看来，结果就是一个发布容易，但开发难度大而且用户界面极其受限的应用程序。极端的说，就是你花了更多的资金和时间，却开发出从用户看来功能更弱的应用程序。不信？问问你的会计师对新的基于浏览器的会计软件有什么想法：绝大多数商用程序用户希望使用更加友好的Windows用户界面。
<p style="TEXT-INDENT: 2em">关于客户端与服务器的通信问题，一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时，当前许多防火墙也配置为只允许HTTP连接。
<p style="TEXT-INDENT: 2em">许多商用程序还面临另一个问题，那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的，并且都运行在Windows平台上，那就天下太平了。然而，事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放，并由COBOL语言编写的大型机程序访问。而且，目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。现在，除了最简单的程序之外，所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法，如文件传输和分析，消息队列，还有仅适用于某些情况的的API，如IBM的"高级程序到程序交流(APPC)"等来完成的。在以前，没有一个应用程序通信标准，是独立于平台、组建模型和编程语言的。只有通过Web Service，客户端和服务器才能够自由的用HTTP进行通信，不论两个程序的平台和编程语言是什么。
<p style="TEXT-INDENT: 2em">什么是Web Service
<p style="TEXT-INDENT: 2em">对这个问题，我们至少有两种答案。从表面上看，Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。这就是说，你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如，你想创建一个Web service ，它的作用是返回当前的天气情况。那么你可已建立一个ASP页面，它接受邮政编码作为查询字符串，然后返回一个由逗号隔开的字符串，包含了当前的气温和天气。要调用这个ASP页面，客户端需要发送下面的这个HTTP GET请求：
<p style="TEXT-INDENT: 2em">http://host.company.com/weather.asp?zipcode=20171
<p style="TEXT-INDENT: 2em">返回的数据就应该是这样：
<p style="TEXT-INDENT: 2em">21,晴
<p style="TEXT-INDENT: 2em">这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求，暴露出了一个可以通过Web调用的API。当然，Web service 还有更多的东西。
<p style="TEXT-INDENT: 2em">下面是对Web service 更精确的解释： Web services是建立可互操作的分布式应用程序的新平台。作为一个Windows程序员，你可能已经用COM或DCOM建立过基于组件的分布式应用程序。COM是一个非常好的组件技术，但是我们也很容易举出COM并不能满足要求的情况。
<p style="TEXT-INDENT: 2em">Web service平台是一套标准，它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言，在任何你喜欢的平台上写Web service ，只要我们可以通过Web service标准对这些服务进行查询和访问。
<p style="TEXT-INDENT: 2em">新平台
<p style="TEXT-INDENT: 2em">Web service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性，Web service平台必须提供一套标准的类型系统，用于沟通不同平台、编程语言和组件模型中的不同类型系统。在传统的分布式系统中，基于界面(interface)的平台提供了一些方法来描述界面、方法和参数（译注：如COM和COBAR中的IDL语言）。同样的，Web service平台也必须提供一种标准来描述Web service，让客户可以得到足够的信息来调用这个Web service。最后，我们还必须有一种方法来对这个Web service进行远程调用。这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性，这种RPC协议还必须与平台和编程语言无关。下面几个小节就简要介绍了组成Web service平台的这三个技术。
<p style="TEXT-INDENT: 2em">XML和XSD
<p style="TEXT-INDENT: 2em">可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外，XML主要的优点在于它既是平台无关的，又是厂商无关的。无关性是比技术优越性更重要的：软件厂商是不会选择一个由竞争对手所发明的技术的。
<p style="TEXT-INDENT: 2em">XML解决了数据表示的问题，但它没有定义一套标准的数据类型，更没有说怎么去扩展这套数据类型。例如，整形数到底代表什么？16位，32位，还是64位？这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型，并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时，为了符合Web service标准，所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换，但你很可能会根据你的需要修改一下转换过程。在第二章中，我们将深入XSD，学习怎样转换自定义的数据类型(例如类)到XSD的类型。
<p style="TEXT-INDENT: 2em">SOAP
<p style="TEXT-INDENT: 2em">Web service建好以后，你或者其他人就会去调用它。简单对象访问协议(SOAP)提供了标准的RPC方法来调用Web service。实际上，SOAP在这里有点用词不当：它意味着下面的Web service是以对象的方式表示的，但事实并不一定如此：你完全可以把你的Web service写成一系列的C函数，并仍然使用SOAP进行调用。SOAP规范定义了SOAP消息的格式，以及怎样通过HTTP协议来使用SOAP。SOAP也是基于XML和XSD的，XML是SOAP的数据编码方式。第三章我们会讨论SOAP，并结识SOAP消息的各种元素。
<p style="TEXT-INDENT: 2em">WSDL
<p style="TEXT-INDENT: 2em">你会怎样向别人介绍你的Web service有什么功能，以及每个函数调用时的参数呢？你可能会自己写一套文档，你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题：当程序员坐到电脑前，想要使用你的Web service的时候，他们的工具(如Visual Studio)无法给他们提供任何帮助，因为这些工具根本就不了解你的Web
<p style="TEXT-INDENT: 2em">service。解决方法是：用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言，用于描述Web service及其函数、参数和返回值。因为是基于XML的，所以WSDL既是机器可阅读的，又是人可阅读的，这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档，又能导入WSDL文档，生成调用相应Web service的代码。</p><script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.blogjava.net/romkk-shi/aggbug/136370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/romkk-shi/" target="_blank">路边的石头-java</a> 2007-08-13 14:15 <a href="http://www.blogjava.net/romkk-shi/archive/2007/08/13/136370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么时候应该使用Web Service</title><link>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136367.html</link><dc:creator>路边的石头-java</dc:creator><author>路边的石头-java</author><pubDate>Mon, 13 Aug 2007 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136367.html</guid><wfw:comment>http://www.blogjava.net/romkk-shi/comments/136367.html</wfw:comment><comments>http://www.blogjava.net/romkk-shi/archive/2007/08/13/136367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/romkk-shi/comments/commentRss/136367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/romkk-shi/services/trackbacks/136367.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>现在我将列举三种情况，在这三种情况下，你将会发现使用Web service会带来极大的好处。此后，我还会举出不应该使用Web service的一些情况。
<p>　　<strong>跨越防火墙的通信</strong></p>
<p>　　如果你的应用程序有成千上万的用户，而且他们都分布在世界各地，那么客户端和服务器之间的通信将是一个棘手的问题。那是因为客户端和服务器之间通常都会有防火墙或者代理服务器。在这种情况下，你想使用DCOM就不是那么简单了，而且，通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用户手中。于是，你最终选择了用浏览器作为客户端，写下一堆ASP页面，把应用程序的中间层暴露给最终用户。结果呢?运气好的话，只是开发难度大了一些，运气不好的话，就会得到一个根本无法维护的应用程序。</p>
<p>　　想象一下你应该怎么在你的应用程序里面加入一个新的页面:你必须先建立好用户界面(Web页面)，以及在这个页面后面，包含相应商业逻辑的中间层组件。这还不够，你还要再建立至少一个ASP页面，用来接受用户输入的信息，调用中间层组件，把结果格式化为HTML形式，最后还要把"结果页"送回浏览器。要是客户端代码不再如此依赖于HTML表单，客户端的编程不就简单多了吗?还有，建立ASP页面的那一步可以省略掉吗?</p>
<p>　　当然。如果你的中间层组件是Web service的话，你完全可以从用户界面直接调用中间层组件，从而省掉建立ASP页面的那一步。要调用Web service，你可以直接使用Microsoft SOAP Toolkit或.NET这样的SOAP客户端，也可以使用你自己开发的SOAP客户端，然后把它和你的应用程序连接起来。这样做，不仅可以缩短开发周期，还可以减少代码的复杂度，并增强整个应用程序的可维护性。同时，你的应用程序也不再需要在每次调用中间层组件时，都跳转到相应的"结果页"了。</p>
<p>　　以我的经验来看，在一个用户界面和中间层有较多交互的应用程序中，使用Web service这种结构，可以轻松的节省花在用户界面编程上的20%的开发时间。这样做还有另一个好处，就是你将得到一个由Web service组成的中间层，这一层是完全可以在应用程序集成或其他场合下被重用的。最后，通过Web service把你的应用程序的逻辑和数据暴露出来，还可以让其它平台上的客户重用你的应用程序。</p>
<p>　　<strong>应用程序集成</strong></p>
<p>　　企业级的应用程序开发者都知道，企业里经常都要把用不同语言写成的在不同平台上运行的各种程序集成起来，而这种集成将花费很大的开发的力量。你的应用程序经常都需要从运行在古老的IBM主机上的程序中获取数据;或者再把数据发送到主机或UNIX应用程序中去。即使是在同一个平台上，不同的软件厂商生产的各种软件也常常需要集成起来。通过Web service，应用程序可以用标准的方法把功能和数据暴露出来，供其它的应用程序使用。</p>
<p>　　例如，你有一个订单登录程序，用于登录从客户来的新订单，包括客户信息、发货地址、数量、价格和付款方式等信息。同时，你还有一个订单执行程序，用于实际货物发送的管理。这两个程序是来自不同软件厂商的。一份新订单进来之后，订单登录程序需要通知订单执行程序发送货物。通过在订单执行程序上面增加一层Web service，订单执行程序可以把"AddOrder"函数暴露出来。这样，每当有新订单到来时，订单登录程序就可以调用这个函数来发送货物了。进而通过Web service集成应用程序</p>
<p>　　<strong>B2B的集成</strong></p>
<p>　　用Web service集成应用程序，可以使你公司内部的商务处理更加自动化。但当交易跨越了你的供应商和客户，突破了公司的界线时又会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。</p>
<p>　　Web service是B2B集成成功的关键。通过Web service，你的公司可以把关键的商务应用暴露给指定的供应商和客户。例如，把你的电子下单系统和电子发票系统暴露出来，你的客户就可以以电子的方式向你发送购货订单，而你的供应商则可以以电子的方式把原料采购的发票发送给你。当然，这并不是一个新的概念:电子文档交换(EDI)早就是这样了。Web service和EDI之间的主要区别在于，Web service的实现要比EDI简单得多，而且Web service是运行在Internet上的，在世界任何地方都可轻易实现，这样其运行成本就相对较低。不过，Web service并不像EDI那样，是文档交换或B2B集成的一套完整的解决方案。Web service只是B2B集成的一个关键部分，还需要许多其它的部分才能完成这个集成。</p>
<p>　　用Web service来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把你的商务逻辑暴露出来，成为Web service，你就可以让任何指定的合作伙伴轻松的调用你的商务逻辑，而不管他们的系统在什么平台上运行，使用的是什么开发语言。这样就大大减少了花在B2B集成的上的时间和成本。这样的低成本让许多原本无法承受EDI的投资成本的中小企业也能实现B2B集成。</p>
<p>　　<strong>软件重用</strong></p>
<p>　　软件重用是一个很大的主题，它有很多的形式和程度。最基本的形式是源代码模块或者类一级的重用。另一种形式是二进制形式的组件重用。当前，像表格控件或用户界面控件这样的可重用软件组件在市场上都占有很大的份额。但这类软件的重用都有一个很严重的限制:重用仅限于代码，而数据不能被重用。原因在于你可以很轻易的发布组件甚至源代码，但要发布数据就没那么容易了，除非那些数据都是不会经常变化的静态数据。</p>
<p>　　而Web service允许你在重用代码的同时，重用代码后面的数据。使用Web service，你不再像以前那样，要先从第三方购买、安装软件组件，再从你的应用程序中调用这些组件。你只需要直接调用远端的Web service就可以了。举个例子，你想在你的应用程序中确认用户输入的邮件地址，那么，你只需把这个地址直接发送给相应的Web service，这个Web service 就会帮你查阅街道地址、城市、省区和邮政编码等信息，确认这个地址的确在相应的邮政编码区域。Web service 的提供商可以按时间或使用次数来对这项服务进行收费。这样的服务要通过组件重用来实现是不现实的，因为那样的话你必须下载并安装好包含街道地址、城市、省区和邮政编码等信息的数据库，而且这个数据库还是不能实时更新的。</p>
<p>　　另一种软件重用的情况是把好几个应用程序的功能集成起来。例如，你想要建立一个局域网上的门户站点应用，让用户既可以查询他们的联邦快递包裹，察看股市行情，又可以管理他们的日程安排，还可以在线购买电影票。现在Web上有很多应用程序供应商，都在其应用中实现了上面的这些功能。一旦他们把这些功能都通过Web service 暴露出来，你就可以非常轻易地把所有这些功能都集成到你的门户站点中，为用户提供一个统一的、友好的界面。</p>
<p>　　<strong>用Web service来集成各种应用中的功能，为用户提供一个统一的界面</strong></p>
<p>　　许多应用程序都会利用Web service，把当前基于组件的应用程序结构扩展为组件和Web service 的混合结构。你也可以在应用程序中使用第三方的Web service 提供的功能。你还可以把你自己的应用程序的功能通过Web service 提供给别人。所有这些情况下，你都可以重用代码和代码后面的数据。总之，Web service 将是软件重用的一种非常有力的形式。</p>
<p>　　<strong>什么时候不应该使用Web Service</strong></p>
<p>　　一个对Web service的完整介绍还应该包括什么时候不该用Web service。经过前面的介绍，我们知道了Web service 在通过Web进行互操作或远程调用的时候是最有用的。不过，还有许多情况，Web service根本不能给你带来任何好处。</p>
<p>　　<strong>单机应用程序</strong></p>
<p>　　目前，我们还有很多桌面应用程序是供商用和个人使用的。其中一些只需要与运行在本机上的其他程序通信。在这种情况下，我们最好就不要再用Web service ，只要用本地的API就可以了。COM非常适合于在这种情况下工作，因为它既小又快。运行在一台服务器上的服务器软件也是这样:最好直接用COM或其他本地的API来进行应用程序间的调用。当然Web service 也能用在这些情况下，但那样不仅消耗太大，而且不会给你带来任何好处。</p>
<p>　　<strong>局域网上的同构应用程序</strong></p>
<p>　　在许多应用中，你所有的程序都是用VB或VC开发的，都在Windows平台下使用COM，都运行在同一个局域网上。例如，你有两个服务器应用程序需要相互通信，或者你有一个Win32或WinForm的客户程序要连接到局域网上的另一个服务器程序。在这些程序里使用DCOM会比SOAP/HTTP有效的多。类似的，如果你的一个.NET程序要连接到LAN上的另一个.NET程序，那么你应该使用.NET remoting。有趣的是，在.NET remoting中，你也可以指定使用SOAP/HTTP来进行Web service 调用。不过最好还是直接通过TCP进行RPC调用，那样会有效得多。总之，只要你从应用程序结构的角度看来，有别的方法比Web service 更有效，更可行，那就不要再用Web service。</p>
<p>　　<strong>总结</strong></p>
<p>　　Web service是创建可互操作的分布式应用程序的新平台。Web service 的主要目标是跨平台的可互操作性。为了达到这一目标，Web service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。</p>
<p>　　Web service在应用程序跨平台和跨网络进行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用，以及通过Web进行客户端和服务器的通信的场合。</p>
<p>　　当然，Web service也不是万能的，你不能到处滥用Web service。在有些情况下，Web service 会降低应用程序的性能，而不会带来任何好处。例如，一台机器或一个局域网里面运行的同构应用程序就不应该用Web service 进行通信。</p><script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-08-02: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.blogjava.net/romkk-shi/aggbug/136367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/romkk-shi/" target="_blank">路边的石头-java</a> 2007-08-13 14:10 <a href="http://www.blogjava.net/romkk-shi/archive/2007/08/13/136367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>