﻿<?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-漫步红林-文章分类-WebService &amp; SOA</title><link>http://www.blogjava.net/hyint/category/37823.html</link><description>品味技术与生活之间的差距，追求代码与国画之间艺术的差距。</description><language>zh-cn</language><lastBuildDate>Thu, 26 Feb 2009 12:36:49 GMT</lastBuildDate><pubDate>Thu, 26 Feb 2009 12:36:49 GMT</pubDate><ttl>60</ttl><item><title>SOA框架的六个不完美之处</title><link>http://www.blogjava.net/hyint/articles/256069.html</link><dc:creator>苦瓜</dc:creator><author>苦瓜</author><pubDate>Sun, 22 Feb 2009 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/hyint/articles/256069.html</guid><wfw:comment>http://www.blogjava.net/hyint/comments/256069.html</wfw:comment><comments>http://www.blogjava.net/hyint/articles/256069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyint/comments/commentRss/256069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyint/services/trackbacks/256069.html</trackback:ping><description><![CDATA[<font style="line-height: 1.8em" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为一个具有发展前景的应用系统架构，SOA尚处在不断的发展中，肯定存在许多有待改进的地方。Stencil Group咨询公司的Brent Sleeper 在《The five missing pieces of SOA》中列举了SOA在可靠性、安全性、编制、遗留系统支持和语义方面还存在严重不足。<br />
一 : 可靠性(Reliability)<br />
　　SOA还没有完全为事务的最高可靠性——不可否认性(nonrepudiation)、消息一定会被传送且仅传送一次(once-and-only-once delivery)以及事务撤回(rollback)——做好准备，不过等标准和实施技术成熟到可以满足这一需求的程度并不遥远。<br />
二 : 安全性(Security)<br />
　　在过去，访问控制只需要登录和验证; 而在SOA环境中，由于一个应用软件的组件很容易去跟属于不同域的其他组件进行对话，所以确保迥然不同又相互连接的系统之间的安全性就复杂得多了。<br />
三 : 编排 (Orchestration)<br />
　　统一协调分布式软件组件以便构建有意义的业务流程是最复杂的，但它同时也最适合面向服务类型的集成，原因很显然，建立在SOA上面的应用软件可以被设计成可以按需要拆散、重新组装的服务。作为目前业务流程管理(BPM)解决方案的核心，编排功能使IT管理人员能够通过已经部署的套装或自己开发的应用软件的功能，把新的元应用软件(meta-application)连接起来。 事实上，最大的难题不是建立模块化的应用软件，而是改变这些系统表示所处理数据的方法。<br />
四 :遗留系统处理(Legacy support)<br />
　　SOA中提供集成遗留系统的适配器， 遗留应用适配器屏蔽了许多专用性API的复杂性和晦涩性。一个设计良好的适配器的作用好比是一个设计良好的SOA服务：它提供了一个抽象层，把应用基础设施的其余部分与各种棘手问题隔离开来。一些厂商就专门把遗留应用软件&#8220;语义集成&#8221;到基于XML的集成构架中。 但是集成遗留系统的工作始终是一个挑战。<br />
五 : 语义 Semantics<br />
　　定义事务和数据的业务含义，一直是IT管理人员面临的最棘手问题。语义关系是设计良好SOA架构的核心要素。 就目前而言，没有哪一项技术或软件产品能够真正解决语义问题。为针对特定行业和功能的流程定义并实施功能和数据模型是一项繁重的任务，它最终必须由业务和IT管理人员共同承担。不过，预制组件和经过实践证明的咨询技能可以简化许多难题。<br />
　　采用XML技术也许是一个不错的主意。许多公司越来越认识到制定本行业XML标准的重要性。譬如，会计行业已提议用可扩展业务报告语言(XBRL)来描述及审查总账类型的记录。<br />
　　重要的是学会如何以服务来表示基本的业务流程。改变开发方式需要文化变迁，相比之下，解决技术难题只是一种智力操练。<br />
六 :性能(performance)<br />
　　批评SOA的人士经常会提到性能是阻碍其采用的一个障碍，但技术的标准化总需要在速度方面有一些牺牲。这种怀疑观点通常针对两个方面：SOA的分布性质和Web服务协议的开销。<br />
　　不可否认，任何分布式系统的执行速度都不如独立式系统，这完全是因为网络的制约作用造成的。当然，有些应用软件无法容忍网络引起的延迟，例如那些对实时性要求很高的应用软件，所以在应用SOA架构之前，搞清楚它的适用范围就显得很重要了</font><wbr style="line-height: 1.8em"> 
<img src ="http://www.blogjava.net/hyint/aggbug/256069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyint/" target="_blank">苦瓜</a> 2009-02-22 18:24 <a href="http://www.blogjava.net/hyint/articles/256069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService视点</title><link>http://www.blogjava.net/hyint/articles/256065.html</link><dc:creator>苦瓜</dc:creator><author>苦瓜</author><pubDate>Sun, 22 Feb 2009 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/hyint/articles/256065.html</guid><wfw:comment>http://www.blogjava.net/hyint/comments/256065.html</wfw:comment><comments>http://www.blogjava.net/hyint/articles/256065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyint/comments/commentRss/256065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyint/services/trackbacks/256065.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体">&nbsp; </span>
<p style="text-align: left" align="left"><span><span style="font-family: 宋体">摘要：</span></span></p>
<p style="text-indent: 25pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">本文介绍了</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的起源和基本原理，分析了在企业应用中</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">带来的冲击和变革，指出了</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的一些优缺点以及如何正确地应用</span><span style="font-size: 10pt; font-family: Times">Web Services. </span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">无论是在计算机杂志还是在</span><span style="font-size: 10pt; font-family: Times">Internet</span><span style="font-size: 10pt; font-family: 宋体">上，目前最热门的话题莫过于&#8220;</span><span style="font-size: 10pt; font-family: Times">Web Services&#8221;</span><span style="font-size: 10pt; font-family: 宋体">。各个平台之间的锋争，各个新产品的发布，众多新标准的制订，大都和</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">有关。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">我的一些朋友是这样的一些人，他们总是用着最新的平台，尝试着最新的技术，他们喜欢变化，喜欢流行，用他们自己的话说，新技术创造新生活！可是，当我的一个朋友，带领他们一个部门的开发人员，花了两个月的，将他们内部的管理系统用</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">重新设计和实现了一遍，却发现在实际使用的情况下，系统性能非常糟糕。他提出了这样一个问题：是不是</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">现在还处于实验和市场炒作时期，根本没有进入实用的阶段？简单的回答是：</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">不是万能的，它有它的应用范围和优势劣势。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的起源</span><span style="font-size: 10pt; font-family: Times">Web</span><span style="font-size: 10pt; font-family: 宋体">应用的巨大成功和不断发展，使其渗透到商业领域和个人生活的各个方面。人们只要使用浏览器，就可以享受到各种各样的</span><span style="font-size: 10pt; font-family: Times">Web</span><span style="font-size: 10pt; font-family: 宋体">服务，例如网上购物，网上交易，网络游戏，预定车票，网上聊天和交友等等。与此同时，由于</span><span style="font-size: 10pt; font-family: Times">Web</span><span style="font-size: 10pt; font-family: 宋体">技术所带来的优势（统一的客户端和较好的维护性），使一些传统的应用纷纷转型到</span><span style="font-size: 10pt; font-family: Times">BS</span><span style="font-size: 10pt; font-family: 宋体">结构上。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">然而，在发展中，逐步暴露了一些问题。所有这些</span><span style="font-size: 10pt; font-family: Times">Web</span><span style="font-size: 10pt; font-family: 宋体">页面都是为人准备的，是让人去阅读，去输入，去判断。因此各种反映视觉效果的内容占用了大量的网络带宽，例如各种图片，字体信息，文字排版样式等。而真正含有高价值的一些信息，被深深埋在这些显示信息中，很难被其他应用和程序所使用。更重要的是，各种</span><span style="font-size: 10pt; font-family: Times">web</span><span style="font-size: 10pt; font-family: 宋体">服务之间缺少交互和通讯的机制。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-size: 10pt; font-family: 宋体"><span style="font-family: 宋体">程序之间的互相通讯很重要吗？简单举一个例子。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体"><span style="font-family: 宋体">假设你经常去国外出差，在你回国以后，第一件事就是费用报销了。而你们公司有这样的财务规定，所有的报销款，都按报销当天的外汇比价进行结算。因此在你填写报销单的时候必须先填写每一笔在各个国家的花消，然后上网查出当天的外汇比价，填写到报销单上。剩下的事情也许不用你做了，你的报销单填写工具会自动进行换算和统计。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">觉得有什么不妥吗？作为</span><span style="font-size: 10pt; font-family: Times">IT</span><span style="font-size: 10pt; font-family: 宋体">公司的员工，也许都有一个特点，计算机能做的事情，尽量要计算机去做。外汇比价的查询可以让计算机自动去做嘛！然而，让你的程序自动去网页上查找指定的外汇比价可不是一件容易的事。因为这些网页是给人阅读的，人眼和大脑的反应速度有多快，它们可以从一整页信息中快速定位到你所要的内容，而且无论网页怎样变化和改版都不会带来太大的影响。而应用程序想要做同样的事就差得太远了。因此，现在需要的是专门为应用程序制定的</span><span style="font-size: 10pt; font-family: Times">Web</span><span style="font-size: 10pt; font-family: 宋体">服务。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">随着应用程序之间通讯的需求越来越大，这就需要制定统一的标准和协议。</span><span style="font-size: 10pt; font-family: Times">HP</span><span style="font-size: 10pt; font-family: 宋体">公司是最先提出这个观点的公司，他们制定了有关&#8220;</span><span style="font-size: 10pt; font-family: Times">e-Speak&#8221;</span><span style="font-size: 10pt; font-family: 宋体">的标准来保证应用程序之间的交互，并声称将成为下一代</span><span style="font-size: 10pt; font-family: Times">Internet</span><span style="font-size: 10pt; font-family: 宋体">信息交互的标准。而随后，</span><span style="font-size: 10pt; font-family: Times">MicroSoft</span><span style="font-size: 10pt; font-family: 宋体">意识到此计划的美好前景，便推出了</span><span style="font-size: 10pt; font-family: Times">.Net</span><span style="font-size: 10pt; font-family: 宋体">战略；</span><span style="font-size: 10pt; font-family: Times">IBM</span><span style="font-size: 10pt; font-family: 宋体">很快就发布了</span><span style="font-size: 10pt; font-family: Times">Web Services Toolkit(WSTK)</span><span style="font-size: 10pt; font-family: 宋体">，和</span><span style="font-size: 10pt; font-family: Times">Web Services Development Environment(WSDE)</span><span style="font-size: 10pt; font-family: 宋体">，申明对</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的全力支持。与此同时，</span><span style="font-size: 10pt; font-family: Times">Oracle</span><span style="font-size: 10pt; font-family: 宋体">也开发出自己的</span><span style="font-size: 10pt; font-family: Times">Dynamic Services</span><span style="font-size: 10pt; font-family: 宋体">，并和</span><span style="font-size: 10pt; font-family: Times">Oracle 8i Release 2</span><span style="font-size: 10pt; font-family: 宋体">集成在一起。在这以后，</span><span style="font-size: 10pt; font-family: Times">W3C</span><span style="font-size: 10pt; font-family: 宋体">统一制定了</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的各种标准。而</span><span style="font-size: 10pt; font-family: Times">SUN</span><span style="font-size: 10pt; font-family: 宋体">公司在宣布了自己的</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的框架以后，将</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的标准溶入</span><span style="font-size: 10pt; font-family: Times">J2EE</span><span style="font-size: 10pt; font-family: 宋体">的环境，使</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">有了广泛支持的基础和平台。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的基本原理</span><span style="font-size: 10pt; font-family: Times">Web Services </span><span style="font-size: 10pt; font-family: 宋体">是通过一系列标准和协议来保证程序之间的动态连接。其中最基本的协议包括：</span><span style="font-size: 10pt; font-family: Times">SOAP, WSDL, UDDI</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 9.0pt 21.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l&nbsp;</span><span style="font-size: 10pt; font-family: Times">SOAP: </span><span style="font-size: 10pt; font-family: 宋体">是&#8220;</span><span style="font-size: 10pt; font-family: Times">Simple Object Access Protocol&#8221;</span><span style="font-size: 10pt; font-family: 宋体">的缩写，</span><span style="font-size: 10pt; font-family: Times">SOAP</span><span style="font-size: 10pt; font-family: 宋体">是消息传递的协议，它规定了</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">WebServices</span><span style="font-size: 10pt; font-family: 宋体">之间是怎样传递信息的。简单的说，</span><span style="font-size: 10pt; font-family: Times">SOAP</span><span style="font-size: 10pt; font-family: 宋体">规定了：</span></span></p>
<p style="margin-left: 19.05pt; text-indent: -5pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">1. </span><span style="font-size: 10pt; font-family: 宋体">传递信息的格式为</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">。这就使</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">能够在任何平台上，用任何语言进行实.</span></span></p>
<p style="margin-left: 19.05pt; text-indent: -5pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">2. </span><span style="font-size: 10pt; font-family: 宋体">远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等</span></span></p>
<p style="margin-left: 19.05pt; text-indent: -5pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">3. </span><span style="font-size: 10pt; font-family: 宋体">参数类型和</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">格式之间的映射。这是因为，被调用的方法有时候需要传递一个复杂的参</span></span></p>
<p style="margin-left: 19pt; text-indent: 10pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">数，例如，一个</span><span style="font-size: 10pt; font-family: Times">Person</span><span style="font-size: 10pt; font-family: 宋体">对象。怎样用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">来表示一个对象参数，也是</span><span style="font-size: 10pt; font-family: Times">SOAP</span><span style="font-size: 10pt; font-family: 宋体">所定义的范围</span></span></p>
<p style="text-indent: 15pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">4. </span><span style="font-size: 10pt; font-family: 宋体">异常处理以及其他的相关信息</span><span style="font-size: 10pt; font-family: Times">.</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 9.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l&nbsp;</span><span style="font-size: 10pt; font-family: Times">&nbsp;WSDL:</span><span style="font-size: 10pt; font-family: 宋体">是&#8220;</span><span style="font-size: 10pt; font-family: Times">Web Services Description Language&#8221;</span><span style="font-size: 10pt; font-family: 宋体">的缩写</span><span style="font-size: 10pt; font-family: Times">.</span><span style="font-size: 10pt; font-family: 宋体">意如其名</span><span style="font-size: 10pt; font-family: Times">,WSDL</span><span style="font-size: 10pt; font-family: 宋体">是</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的定义语</span></span></p>
<p style="margin-left: 10.1pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">言。当你实现了某种服务的时候</span><span style="font-size: 10pt; font-family: Times">(</span><span style="font-size: 10pt; font-family: 宋体">如</span><span style="font-size: 10pt; font-family: Times">,</span><span style="font-size: 10pt; font-family: 宋体">股票查询服务</span><span style="font-size: 10pt; font-family: Times">),</span><span style="font-size: 10pt; font-family: 宋体">为了让别的程序调用</span><span style="font-size: 10pt; font-family: Times">,</span><span style="font-size: 10pt; font-family: 宋体">你必须告诉大家你的服务的接口</span><span style="font-size: 10pt; font-family: Times">.</span><span style="font-size: 10pt; font-family: 宋体">例如</span><span style="font-size: 10pt; font-family: Times">,</span><span style="font-size: 10pt; font-family: 宋体">服务名称，服务所在的机器名称，监听端口号，传递参数的类型</span><span style="font-size: 10pt; font-family: Times">,</span><span style="font-size: 10pt; font-family: 宋体">个数和顺序</span><span style="font-size: 10pt; font-family: Times">,</span><span style="font-size: 10pt; font-family: 宋体">返回结果的类型等等</span><span style="font-size: 10pt; font-family: Times">.</span><span style="font-size: 10pt; font-family: 宋体">这样别的应用程序才能调用你的服务。</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">协议就是规定了有关</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">描述的标准。</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: Times">UDDI: </span><span style="font-size: 10pt; font-family: 宋体">是</span><span style="font-size: 10pt; font-family: Times">Universal Description, Discovery, and Integration</span><span style="font-size: 10pt; font-family: 宋体">的缩写。简单说，</span><span style="font-size: 10pt; font-family: Times">UDDI</span><span style="font-size: 10pt; font-family: 宋体">用于集中存放</span></span></p>
<p style="text-indent: 5pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">和查找</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">描述文件，起着目录服务器的作用。</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">如上是一个</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的生命周期是：</span></span></p>
<p style="margin-left: 45pt; text-indent: -18pt; text-align: left; tab-stops: list 45.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">实现一个</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">，使其能够接受和响应</span><span style="font-size: 10pt; font-family: Times">SOAP</span><span style="font-size: 10pt; font-family: 宋体">消息（现在有很多工具都可以帮助实现）</span></span></p>
<p style="margin-left: 45pt; text-indent: -18pt; text-align: left; tab-stops: list 45.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">撰写一个</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">文件用于描述此</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">。（现在有很多工具可以自动生成</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">文件）。</span></span></p>
<p style="margin-left: 45pt; text-indent: -18pt; text-align: left; tab-stops: list 45.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">将此</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">发布到</span><span style="font-size: 10pt; font-family: Times">UDDI</span><span style="font-size: 10pt; font-family: 宋体">上。</span></span></p>
<p style="margin-left: 45pt; text-indent: -18pt; text-align: left; tab-stops: list 45.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">其他的应用程序（客户端）从</span><span style="font-size: 10pt; font-family: Times">UDDI</span><span style="font-size: 10pt; font-family: 宋体">上搜索到你的</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">。</span></span></p>
<p style="margin-left: 45pt; text-indent: -18pt; text-align: left; tab-stops: list 45.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">根据你的</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">，客户端可以编写程序（现在有很多工具可以自动生成调用程序）调用你的</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">。</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的缺点由于是基于</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">的应用，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">与生俱来地在拥有</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">带来的一切优势的同时，不可避免地继承了</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">所带来的一些限制。</span></span></p>
<p style="margin-left: 9pt; text-indent: -9pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l&nbsp;</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">通常需要大量的</span><span style="font-size: 10pt; font-family: Times">CPU</span><span style="font-size: 10pt; font-family: 宋体">资源。因为</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">数据要经过多步处理才能被系统使用。首先是效验（</span><span style="font-size: 10pt; font-family: Times">validate</span><span style="font-size: 10pt; font-family: 宋体">），检查它的格式是否符合</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">的规范，以及根据应用程序定义（</span><span style="font-size: 10pt; font-family: Times">DTD</span><span style="font-size: 10pt; font-family: 宋体">或</span><span style="font-size: 10pt; font-family: Times">Schema</span><span style="font-size: 10pt; font-family: 宋体">）检查是否符合语义上的规范；然后还要进行解析（</span><span style="font-size: 10pt; font-family: Times">parse</span><span style="font-size: 10pt; font-family: 宋体">），从</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">文档分解出单个的元素；最后还要转换成应用程序所需要的二进制表达（例如，把&#8220;</span><span style="font-size: 10pt; font-family: Times">12&#8221;</span><span style="font-size: 10pt; font-family: 宋体">转换成整型</span><span style="font-size: 10pt; font-family: Times">12</span><span style="font-size: 10pt; font-family: 宋体">的二进制表示）。</span></span></p>
<p style="margin-left: 9pt; text-indent: -9pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l&nbsp;</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">还意味着占用较多的内存资源。在进行</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">解析的时候，会产生大量的临时内存对象。特别是在处理</span><span style="font-size: 10pt; font-family: Times">DOM</span><span style="font-size: 10pt; font-family: 宋体">对象的时候。这些大量的临时对象对于象</span><span style="font-size: 10pt; font-family: Times">JAVA</span><span style="font-size: 10pt; font-family: 宋体">这类自动回收内存的语言和系统其实是一种负担，大量的临时对象将会使系统每隔一段时间就会进行内存回收，从而降低系统的性能。当然，现在有的</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的产品（如</span><span style="font-size: 10pt; font-family: Times">axis</span><span style="font-size: 10pt; font-family: 宋体">）采用了</span><span style="font-size: 10pt; font-family: Times">SAX</span><span style="font-size: 10pt; font-family: 宋体">技术，大大减少了内存的占用量。详细信息请参考：（</span><u><span style="font-size: 10pt; color: blue; font-family: Times"><a href="http://xml.apache.org/axis/index.html">http://xml.apache.org/axis/index.html</a></span></u><span style="font-size: 10pt; font-family: 宋体">）。</span></span></p>
<p style="margin-left: 9pt; text-indent: -9pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l&nbsp;</span><span style="font-size: 10pt; font-family: 宋体">网络资源的消耗也是</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">应用的一些限制。因为基于</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">数据的传递通常数据量要比二进制的协议（如</span><span style="font-size: 10pt; font-family: Times">RMI/IIOP</span><span style="font-size: 10pt; font-family: 宋体">）要大的多。这种额外的消耗在网络资源比较紧张或网络传输比较频繁的应用中会产生一定的影响。</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">除了</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">带来的限制，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">本身也具有一些缺点：</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">到目前为止，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">还可以说是一种无状态（</span><span style="font-size: 10pt; font-family: Times">stateless</span><span style="font-size: 10pt; font-family: 宋体">）的服务。</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">所谓</span><span style="font-size: 10pt; font-family: Times">stateless</span><span style="font-size: 10pt; font-family: 宋体">就意味着不保存客户端服务调用者的任何信息。这是由</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的本质所决定的。</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">在本质上是要为应用程序之间提供数据通讯的标准，为企业应用之间动态地提供大颗粒度的服务，所以</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">并不适合于非常精细的基于会话的方法调用以及复杂的事务（</span><span style="font-size: 10pt; font-family: Times">transaction</span><span style="font-size: 10pt; font-family: 宋体">）处理之中。</span></span><span style="font-size: 9pt; font-family: Times"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">也许有人会对我这点提出异议！因为，现在有很多</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的产品（如</span><span style="font-size: 10pt; font-family: Times">WASD</span><span style="font-size: 10pt; font-family: 宋体">），不但可以保存</span><span style="font-size: 10pt; font-family: Times">session</span><span style="font-size: 10pt; font-family: 宋体">的信息，使服务成为有状态（</span><span style="font-size: 10pt; font-family: Times">stateful</span><span style="font-size: 10pt; font-family: 宋体">）的服务，而且还实现了</span><span style="font-size: 10pt; font-family: Times">remote interface</span><span style="font-size: 10pt; font-family: 宋体">，可以在</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的会话中传递远程对象的句柄，让客户端可以操纵递远程对象（详细信息请参考：</span><u><span style="font-size: 10pt; color: blue; font-family: Times">http://www.systinet.com</span></u><span style="font-size: 10pt; font-family: 宋体">）。原理上说，这并不难实现，因为在</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">数据中，可以互相传送任何数据，包括</span><span style="font-size: 10pt; font-family: Times">sessionID</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: Times">transactionID</span><span style="font-size: 10pt; font-family: 宋体">，有了这些</span><span style="font-size: 10pt; font-family: Times">ID</span><span style="font-size: 10pt; font-family: 宋体">，从技术角度上说，实现有状态（</span><span style="font-size: 10pt; font-family: Times">stateful</span><span style="font-size: 10pt; font-family: 宋体">）的服务和事务处理并不复杂。但是，这样功能缺少标准的支持，当前版本的</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">还无法表示这些复杂的服务。在企业内部，你可以任意使用这些特殊的功能，可以自己定义会话状态的交互协议，因为服务者和服务调用者之间的通讯都在你的控制之中；然而要将这些服务发布到</span><span style="font-size: 10pt; font-family: Times">Internet</span><span style="font-size: 10pt; font-family: 宋体">上，其他的应用程序是无法根据标准去识别这些特殊功能。</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">数据绑定也存在一些不足。</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">因为所有的数据传递都用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">格式，因此，需要在二进制数据和</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">数据之间有个转换。但是，并不是所有的二进制数据都能方便地用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">来表示，并不是所有的</span><span style="font-size: 10pt; font-family: Times">JAVA</span><span style="font-size: 10pt; font-family: 宋体">对象都能被</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">所表示。因此，经常在转换过程中会出现语义丢失的情况。</span></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">技术要求高，学习曲线较长。</span></span></p>
<p style="text-indent: 25pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">每一个</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的产品，都有丰富的工具，能够根据</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的定义（如</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">文件）方便地生成客户端的程序；能够将一般的服务程序，很容易就包装成</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">服务。因此，各个</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的产品都声称自己的平台容易使用，根本不需要了解</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">，也不需要了解什么</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">，</span><span style="font-size: 10pt; font-family: Times">UDDI</span><span style="font-size: 10pt; font-family: 宋体">，</span><span style="font-size: 10pt; font-family: Times">SOAP</span><span style="font-size: 10pt; font-family: 宋体">就能使用发布</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">。特别是一个朋友告诉我，他在什么都不了解的情况下，用</span><span style="font-size: 10pt; font-family: Times">.NET</span><span style="font-size: 10pt; font-family: 宋体">花了</span><span style="font-size: 10pt; font-family: Times">15</span><span style="font-size: 10pt; font-family: 宋体">分钟就发布了一个</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">！</span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times"> <br />
&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: 宋体">千万不要醉心于这种简便，这对于简单的</span><span style="font-size: 10pt; font-family: Times">Demo</span><span style="font-size: 10pt; font-family: 宋体">也许是对的，可是对于真正意义上严肃的应用，一定要了解</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的各个方面，设计整体结构和解决方案，还要根据具体的应用调整性能。所有这些都需要对</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">知识的全面掌握。</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">什么应用适合</span><span style="font-size: 10pt; font-family: Times">Web ServicesWeb Services</span><span style="font-size: 10pt; font-family: 宋体">这么多的缺点是不是让你很泄气？其实，已经有很多成功的</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的应用和越来越多的开发商的加盟，证明</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">一定会成为新一代</span><span style="font-size: 10pt; font-family: Times">WEB</span><span style="font-size: 10pt; font-family: 宋体">信息通讯的主流。经过不断的发展，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">一定能克服自身的弱点，得到更广泛的应用。但就目前来说，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">比较适合用于下列形式的应用：</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">A. </span><span style="font-size: 10pt; font-family: 宋体">基于</span><span style="font-size: 10pt; font-family: Times">WAN</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: Times">Internet</span><span style="font-size: 10pt; font-family: 宋体">的应用</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">要在</span><span style="font-size: 10pt; font-family: Times">Internet</span><span style="font-size: 10pt; font-family: 宋体">上创建基于二进制协议的</span><span style="font-size: 10pt; font-family: Times">RMI/IIOP</span><span style="font-size: 10pt; font-family: 宋体">的应用，一般都会遇上一个大麻烦</span><span style="font-size: 10pt; font-family: Times">--</span><span style="font-size: 10pt; font-family: 宋体">防火墙。客户端浏览器极大可能在</span><span style="font-size: 10pt; font-family: Times">ISP</span><span style="font-size: 10pt; font-family: 宋体">防火墙后，大多数防火墙都只能允许和外部的</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">连接，因此想要</span><span style="font-size: 10pt; font-family: Times">ISP</span><span style="font-size: 10pt; font-family: 宋体">防火墙后的客户端能和防火墙外的</span><span style="font-size: 10pt; font-family: Times">RMI/IIOP</span><span style="font-size: 10pt; font-family: 宋体">的应用端口进行连接的话，就要改变</span><span style="font-size: 10pt; font-family: Times">ISP</span><span style="font-size: 10pt; font-family: 宋体">的安全策略，让客户端能够连接除了</span><span style="font-size: 10pt; font-family: Times">80</span><span style="font-size: 10pt; font-family: 宋体">以外的其他端口。可是当运行</span><span style="font-size: 10pt; font-family: Times">RMI/IIOP</span><span style="font-size: 10pt; font-family: 宋体">的应用的服务器为了安全也在防火墙之后的</span><span style="font-size: 10pt; font-family: Times">DMZ</span><span style="font-size: 10pt; font-family: 宋体">中的话，那这个连接就更加复杂了，要跨越两个防火墙。</span></span><span style="font-size: 9pt; font-family: Times"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">而</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">由于使用的是</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">协议，传递的是纯文本的</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">数据，因此拥有穿透防火墙的良好性能。</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">B</span><span style="font-size: 9pt; font-family: 宋体">． </span><span style="font-size: 10pt; font-family: 宋体">基于异构平台的应用</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">语言本身就是跨平台、跨语言的数据表示方法，在加上通用的</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">等协议，使得</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">天生就适用于基于异构平台的应用。如果你的客户端包含了各种不同的平台，例如，你希望你的服务即可以被</span><span style="font-size: 10pt; font-family: Times">JAVA</span><span style="font-size: 10pt; font-family: 宋体">程序所调用，又可以由</span><span style="font-size: 10pt; font-family: Times">VB</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: Times">COM</span><span style="font-size: 10pt; font-family: 宋体">程序所调用。你有两种选择：一种是为不同的平台提供相应的</span><span style="font-size: 10pt; font-family: Times">API</span><span style="font-size: 10pt; font-family: 宋体">，还要为不同的语言提供</span><span style="font-size: 10pt; font-family: Times">API</span><span style="font-size: 10pt; font-family: 宋体">；如果提供</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">，所有平台和语言都可以调用了！</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">C</span><span style="font-size: 9pt; font-family: 宋体">．</span><span style="font-size: 10pt; font-family: 宋体">需要强安全特性的应用</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">很多人都认为，安全性是</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的弱项。其实不然，经过不断的完善和各种新的协议的出台，</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">完全可以用于安全性很强的应用环境下。并且，由于</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">使用</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">协议进行传输，所以可以和容易就使用已经很成熟的基于</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">的各种安全技术。</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">Ｄ．</span><span style="font-size: 10pt; font-family: Times">EAI</span><span style="font-size: 10pt; font-family: 宋体">（企业应用集成）</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">这是目前</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">应用最看好的方向之一。大多数企业内部都有着各种各样的应用系统，它们是在不同的领导在任期间，由不同的软件开发商开发，因此运行在不同的平台和系统上，系统的开发语言也各不相同。由于现代企业信息自动化要求的提高，各个系统之间的互动和相互通讯便提到日程上。因此，保护原有投资，重用遗留系统是当前很多中大型企业的重要任务。</span></span><span style="font-size: 9pt; font-family: Times"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">由于遗留系统的运行平台是异构环境，因此企业应用集成的代价一般来说是很高的。但如果使用</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">作为应用集成的手段，将会大大降低集成的消耗。</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">与平台和语言无关的特性，以及各种平台和环境下的开发工具都是企业应用集成的利器。</span></span><span style="font-size: 9pt; font-family: Times"><br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">另外，在开发新的应用系统的时候，仍然需要考虑和其他系统的集成，需要考虑调用其他系统的功能，和被其他系统所调用。使用</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">作为系统与外部交流的接口，能够使新的系统和别的系统之间保持松耦合的关系，保持较高的可扩展性。</span></span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: Times">E</span><span style="font-size: 9pt; font-family: 宋体">．</span><span style="font-size: 10pt; font-family: 宋体">行业内部</span><span style="font-size: 10pt; font-family: Times">B2B</span><span style="font-size: 10pt; font-family: 宋体">应用</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">行业内部的应用是</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的另外一个方向。因为在一个行业中，商业业务是很相似的，因此在行业内部很容易形成服务的标准，使所有的业内企业共同遵守；但怎样实现服务和使用什么样的系统，决定权在于各个企业自己。例如，电信运营商之间的结算服务，银行之间的转帐服务等都可以形成行业标准，以</span><span style="font-size: 10pt; font-family: Times">WSDL</span><span style="font-size: 10pt; font-family: 宋体">的形式公布出来。各个企业之间可以选择不同的平台进行服务的实现。</span></span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">提高</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的性能要想提高</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">应用的性能，需要对整个系统做全盘的考虑。一般来说，有以下几点需要注意：</span></span></p>
<p style="margin-left: 41pt; text-indent: -21pt; text-align: left; tab-stops: list 41.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的颗粒度</span></span></p>
<p style="margin-left: 19.95pt; text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">选择</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的颗粒度是提高</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">应用的性能的主要手段。因为</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">使用的传输协议为</span><span style="font-size: 10pt; font-family: Times">HTTP</span><span style="font-size: 10pt; font-family: 宋体">或</span><span style="font-size: 10pt; font-family: Times">SMTP</span><span style="font-size: 10pt; font-family: 宋体">等，这些协议都是面向无状态的连接协议，每一个请求都要建立一个新的连接。因此</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">的调用不能象数据库</span><span style="font-size: 10pt; font-family: Times">JDBC</span><span style="font-size: 10pt; font-family: 宋体">（</span><span style="font-size: 10pt; font-family: Times">ODBC</span><span style="font-size: 10pt; font-family: 宋体">）接口一样可以进行精细而复杂的方法调用（例如，先获得</span><span style="font-size: 10pt; font-family: Times">Connection</span><span style="font-size: 10pt; font-family: 宋体">，再获得结果集，然后一行一行获取结果）。</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">比较适用于大颗粒度的应用，在一个调用中便获得所有的信息（比如说银行之间的转帐，在一次调用中就将包括金额和认证等所有的信息都传输过去）。</span></span></p>
<p style="margin-left: 41pt; text-indent: -21pt; text-align: left; tab-stops: list 41.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">谨慎使用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">接口</span></span></p>
<p style="margin-left: 19.95pt; text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">系统之间的接口可以使用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">，这样可以增加系统的灵活性；但不要使用</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">作为系统内部的接口，因为这不会带来任何好处，尽量使用二进制作为系统内部的接口，避免不必要的</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">文档的解析和效验；在处理</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">的时候，尽快将</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">转换成内部对象，</span><span style="font-size: 10pt; font-family: Times">XML</span><span style="font-size: 10pt; font-family: 宋体">的传递只会增加系统的开销。</span></span></p>
<p style="margin-left: 41pt; text-indent: -21pt; text-align: left; tab-stops: list 41.0pt" align="left"><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">最大可能性使用</span><span style="font-size: 10pt; font-family: Times">CACHE</span></span></p>
<p style="margin-left: 19.95pt; text-indent: 20pt; text-align: left" align="left"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">当有些信息是只读的，或者在一段时间内保持不变，就可以使用</span><span style="font-size: 10pt; font-family: Times">CACHE</span><span style="font-size: 10pt; font-family: 宋体">。无论是客户端的</span><span style="font-size: 10pt; font-family: Times">CACHE</span><span style="font-size: 10pt; font-family: 宋体">还是服务器端的</span><span style="font-size: 10pt; font-family: Times">CACHE</span><span style="font-size: 10pt; font-family: 宋体">，都能大大提高系统的性能</span></span></p>
<p style="text-indent: 20pt"><span style="font-family: 宋体"><span style="font-size: 10pt; font-family: 宋体">总结一旦</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">得到更加广泛的应用，使得各种服务可以动态查找和定位，这样就提供了不同设备之间各种各样的信息交互方式，将会大大改变商业运做的模式和信息交流的风格。</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 9pt; font-family: 宋体">　　　</span><span style="font-size: 10pt; font-family: 宋体">你可以使用别人已经成熟的功能来使自己提供更好的服务，例如</span><span style="font-size: 10pt; font-family: Times">google</span><span style="font-size: 10pt; font-family: 宋体">，它的搜索引擎可以通过</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">来访问。这就意味着在你的系统中可以方便的嵌入使用</span><span style="font-size: 10pt; font-family: Times">google</span><span style="font-size: 10pt; font-family: 宋体">的强大搜索功能，而不论你的系统是运行在什么平台上，使</span><span style="font-size: 10pt; font-family: Times">google</span><span style="font-size: 10pt; font-family: 宋体">的搜索引擎成为你系统的一部分，（请参考</span><em><u><span style="font-size: 10pt; color: blue; font-family: Arial">http://www.google.com/apis/</span></u></em><span style="font-size: 10pt; color: black; font-family: 宋体">）。站在别人的肩膀上，毕竟要看得远些！</span></span><span style="font-size: 9pt; font-family: 宋体"><br />
</span><span style="font-family: 宋体"><span style="font-size: 10pt; color: black; font-family: 宋体">面对</span><span style="font-size: 10pt; font-family: Times">Web Services</span><span style="font-size: 10pt; font-family: 宋体">，<span style="color: black">你现在可以不行动，但你一定要准备好！</span></span></span></p>
<img src ="http://www.blogjava.net/hyint/aggbug/256065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyint/" target="_blank">苦瓜</a> 2009-02-22 18:12 <a href="http://www.blogjava.net/hyint/articles/256065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire 入门</title><link>http://www.blogjava.net/hyint/articles/256060.html</link><dc:creator>苦瓜</dc:creator><author>苦瓜</author><pubDate>Sun, 22 Feb 2009 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/hyint/articles/256060.html</guid><wfw:comment>http://www.blogjava.net/hyint/comments/256060.html</wfw:comment><comments>http://www.blogjava.net/hyint/articles/256060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyint/comments/commentRss/256060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyint/services/trackbacks/256060.html</trackback:ping><description><![CDATA[<wbr style="line-height: 1.8em"><span style="font-size: 24pt; color: red">XFire 入门</span><br />
<span style="font-size: 18pt">1、轻松将 POJO 发布成 Web 服务</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java 社区一直试图将 POJO 的作用发挥到极致，降低 Java 应用实现的难度，最近的尝试是将 EJB3.0 建立在 POJO 之上；另一方面，SOA 是目前 Java 社区炙手可热的名词，非常多的企业都在努力应用和实施 SOA；XFire 为这两方面的需求提供了一种魔术般的解决方式，我们很快能够发现使用 XFire 创建和发布 Web 服务可以直接基于 POJO，将烦人的继承关系和一大堆其他可能的约束丢在一边。 <br />
<wbr style="line-height: 1.8em"><br />
<span style="font-size: 18pt">2、POJO、SOA概述 --------&nbsp; 被重新审视的POJO</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POJO（Plain Old Java Object，简单 Java 对象）是Java 社区中最早的成员（回想您学习 Java 时第一个兴奋的时刻，那个简单的 "Hello World！" 例子），也是最简单、最容易实现的方式。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然而现实中 Java &nbsp;的发展已经远远超越了 POJO 的范围，成为面向对象技术应用中最成功的编程语言，尤其是继承、多态的应用为我们造就了一大批开发框架（如 Struts）和标准（如 EJB），随之而来的就是实现的复杂化，我们必须面对一大堆继承关系的限制。比如说：要开发一个基于 Struts 的应用，我们必须了解 Struts 特定的继承关系如 ActionForm、ValidateActionForm；要开发一个 EJB 应用，我们必须继承 EJBObject、SessionEJB 等。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了抛开这些限制，降低 Java 应用实现的难度，Java 社区开始重新审视 POJO 的价值，试图将 POJO 的作用发挥到极致，最新的努力是 EJB3.0。Java 社区将 EJB3.0 设计为基于 POJO，而不是为他准备更多的继承关系等限制。 <br />
<wbr style="line-height: 1.8em"><br />
<span style="font-size: 18pt">3、让人爱恨交加的 SOA<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOA 已经成为了目前 Java 社区中炙手可热的名词，几乎所有的软件厂商都在讨论它，为他提供解决方案和产品支持，大部分的企业也已经在企业内部实施或者正在考虑实施 SOA。 <br />
然而 SOA 在企业内的实施却不是一项简单的任务，即使抛开新建系统直接基于 SOA 架构实施的因素，要把企业已有系统纳入 SOA 框架也不是一件容易的事情。企业必须在对当前架构深入了解的基础上，对已有系统进行大规模的改造才能满足新的要求。如何经济的从原有技术架构切换到 SOA 架构成为很多企业的难题。 <br />
<font style="display: inline-block; filter: glow(color=#CC0000,strength=3); color: #ffffff"></font><wbr style="line-height: 1.8em"><br />
4、XFire 概述<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFire 是 codeHaus 组织提供的一个开源框架，它构建了 POJO 和 SOA 之间的桥梁，主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务，这种处理方式不仅充分发挥了 POJO 的作用，简化了 Java 应用转化为 Web 服务的步骤和过程，也直接降低了 SOA 的实现难度，为企业转向 SOA 架构提供了一种简单可行的方式。<br />
&nbsp;<br />
XFire目前最新的版本是 1.2.2，目前支持的新特性包括：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.1&nbsp; 支持将 Web 服务绑定到 POJO、XMLBeans、JAXB1.1、JAXB2.0 和 Castor； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.2&nbsp;&nbsp; 支持基于 HTTP、JMS、XMPP 等多种协议访问 Web 服务；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.3&nbsp;&nbsp; 支持多种 Web 服务业界重要标准如 SOAP、WSDL、Web 服务寻址（WS-Addressing）、Web 服务安全（WS-Security）等； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.4&nbsp;&nbsp; 支持 JSR181，可以通过 JDK5 配置 Web 服务；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5&nbsp;&nbsp; 高性能的 SOAP 实现； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.6&nbsp;&nbsp; 服务器端、客户端代码辅助生成；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.7&nbsp;&nbsp; 对 Spring、Pico、Plexus 等项目的支持等。XFire安装包&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFire 框架目前的最新版本是 1.2.6，可以访问 xfire.codehaus.org 下载 XFire 框架的安装包，下载时请选择&#8220;全部二进制发布包（Binary Distribution in zip package）&#8221;，而不仅仅是&#8220;XFire jar 文件（Jar of all XFire modules）&#8221;。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载完成后，我们可以将下载的 .zip 文件解压缩到任意的文件夹中（后面的章节中使用 % XFIRE_HOME % 表示 XFire 框架的安装目录），解压缩后形成的文件目录结构如下：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.&nbsp; &nbsp;API（目录）：&nbsp; API目录是XFire 框架中所有类（class）对应的 API 文档，为开发者使用 XFire完成应用开发提供帮助。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; examples（目录）：examples 目录中包含了所有随 XFire二进制包发布的实例，包括这些实例的源代码和相关 Web 应用配置内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.&nbsp; lib（目录）：lib 目录中包含 XFire 运行所需要的外部支持类包（.jar文件），可以根据不同项目所需的 XFire 特性选择所需要的支持类包。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保守的方法是在 Web 项目中包含所有的外部支持类包（.jar文件）。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; manual（目录）：manual 目录中包含有 XFire 框架的帮助文档，开发者可以从这些帮助文档中学习更多运用 XFire 框架实现 SOA 的知识和<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 技巧。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp; modules（目录）：modules 目录中包含了 XFire 框架根据不同特性分别编译的二进制包文件。发布基于 XFire 框架的 Web 项目时，可以选<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 择使用该目录下的所有 .jar 文件，也可以选择 XFire-all-1.2.6.jar 文件。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f:&nbsp;&nbsp; XFire-all-1.2.6.jar： XFire框架的二进制包文件，包含了全部的模块（modules）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.&nbsp; LICENSE.txt ：LICENSE.txt文件中包含了XFire框架的授权协议。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h.&nbsp; NOTICE.txt 和 README.txt ：这两个文件中包含了 XFire 发布时代一些有用的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://java.sun.com/" target="_blank">java.sun.com</a><wbr> 网站上下载，如何安装 JDK 请参考 SUN 公司的相关技术文档和 JDK 的帮助文档。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://tomcat.apache.org/" target="_blank">tomcat.apache.org</a><wbr> 网站上下载，如何正确安装 TOMCAT 服务器请参考 TOMCAT 服务器的帮助文档。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://xml.apache.org/" target="_blank">xml.apache.org</a><wbr>，下载 xalan 项目的二进制包。 <br />
<font style="display: inline-block; filter: glow(color=#CC0000,strength=3); color: #ffffff"></font><wbr style="line-height: 1.8em"><br />
<a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/#code11" target="_blank">清单 1-1</a><wbr>。 <br />
<ol style="list-style-type: decimal"></ol>
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、创建 Web 应用目录和基本元素 中所创建的 &#8221;lib&#8221;目录下，将 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷贝到 1、创建 Web 应用目录和基本元素 中所创建的 lib 目录下。将 xalan 安装包中的所有 jar 文件和所需要的支持 jar 文件拷贝到相同的 lib 目录下。 <br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [注] 为了减少拷贝的 jar 文件的数目，开发者可以根据项目的需要选择需要拷贝的 jar 文件，而不是全部拷贝，如何根据需要选择拷贝合适的类包文件请访问 <a href="http://xfire.codehaus.org/Dependency+Guide" target="_blank">XFire 站点</a><wbr>。&nbsp; <br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.1、创建 Web 应用目录和基本元素 <wbr>&nbsp;中创建的 classes 目录下新建目录 &#8221;META-INF\xfire&#8221;； <br />
    <li style="margin: 25px">在步骤 a) 中新建的 &#8221;xfire&#8221;文件目录下创建新文件 services.xml，文件的默认内容如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/#code12" target="_blank">清单1-2</a><wbr> 。
    <ol style="list-style-type: decimal"></ol>
        <br />
        <font style="display: inline-block; filter: glow(color=#CC0000,strength=3); color: #ffffff">清单 1-2 WEB-INF\classes\META-INF\xfire\services.xml </font><wbr style="line-height: 1.8em"><br />
        <font style="display: inline-block; filter: glow(color=#CC0000,strength=3); color: #ffffff"></font><wbr style="line-height: 1.8em"><br />
        1、 &lt;beans xmlns="http://XFire.codehaus.org/config/1.0"&gt;2、 &lt;/beans&gt; <br />
        <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/#code13" target="_blank">清单 1-3</a><wbr>。 <br />
        <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/#h1" target="_blank">&#8221;1、创建Web服务接口 ---- HelloWorldService&#8221;</a><wbr> 中创建的 HelloWorldService 接口，并且为它声明的 &#8221;sayHello&#8221;方法提供具体实现： 返回字符串&#8221;Hello World!&#8221;。 &#8221;HelloWorldServiceImpl&#8221;类对应的 Java 文件代码如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/#code14" target="_blank">清单 1-4</a><wbr>。 <br />
        <a href="http://xfire.codehaus.org/services.xml+Reference" target="_blank">XFire 站点</a><wbr>。 <br />
        通过上面的三个步骤，我们已经将新创建的HelloWorldService发布成了Web服务，我们可以使用下面的步骤测试一下创建的Web服务是否能够正常运行： <br />
        </li>
        <ol style="list-style-type: decimal">
            <li style="margin: 25px">编译上面的步骤中创建的 Java 接口和类；
            <li style="margin: 25px">启动 TOMCAT 服务器。
            <li style="margin: 25px">等 TOMCAT 服务器完全启动后，打开浏览器，在地址栏中输入 <a href="http://localhost:8080/XFire/services/HelloWorldService?wsdl">http://localhost:8080/XFire/services/HelloWorldService?wsdl</a>。
            <li style="margin: 25px">其中 HelloWorldServcie 是配置文件中 service\name 元素所定义的内容，&#8221;wsdl&#8221;参数表示查看该 Web 服务的 WSDL（Web服务描述语言）文件。 <br />
            如果浏览器中出现如下图所示类似的内容，表示 Web 服务发布成功，我们可以编写客户端访问该 Web 服务从服务器获取返回字符串，本文下载资源中提供的下载文件中包含有可供参考的客户端类 org.vivianj.xfire.pojo.client.HelloWorldServiceClient.</li>
        </ol>
        <p style="margin: 25px">浏览器浏览的结果<br />
        <img style="width: 680px; height: 510px" height="510" alt="" src="http://www.blogjava.net/images/blogjava_net/hyint/fig001.jpg" width="680" border="0" /><br />
        <br />
        &nbsp;&nbsp;&nbsp; 如果浏览器中出现错误提示，请按照上面的步骤和说明检查已经完成的开发、配置过程是否完全正确。<br />
        <br />
        5.&nbsp; 结束语 <br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文中作者首先讲解了 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/hyint/aggbug/256060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyint/" target="_blank">苦瓜</a> 2009-02-22 17:46 <a href="http://www.blogjava.net/hyint/articles/256060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire 之简单开发Webservice</title><link>http://www.blogjava.net/hyint/articles/256058.html</link><dc:creator>苦瓜</dc:creator><author>苦瓜</author><pubDate>Sun, 22 Feb 2009 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/hyint/articles/256058.html</guid><wfw:comment>http://www.blogjava.net/hyint/comments/256058.html</wfw:comment><comments>http://www.blogjava.net/hyint/articles/256058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyint/comments/commentRss/256058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyint/services/trackbacks/256058.html</trackback:ping><description><![CDATA[<div id="blogDetailDiv" style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在一次偶然的机会，我接触XFire，在接触XFire之前，曾经用过Axis2，总感觉Axis2很麻烦，所以找了XFire。虽然XFire现在已经被CXF取代，但在现在已经开发的项目中，还是有不少使用XFire来实现Web Service的。今天来谈谈用XFire开发客户端。<br />
<br />
一、服务提供者告诉你interface，你可以使用如下三种方式来开发：<br />
YourService即是服务提供者告诉给你的一个interface(当然，也可以根据WSDL的定义，自己定义一个同样的interface)。<br />
1.&nbsp; 简单的方式<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectServiceFactory().create(YourService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />YourService&nbsp;service&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(YourService)<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XFireProxyFactory().create(serviceModel,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://your/remote/url</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
2.&nbsp; JSR 181注释的方式<br />
<br />
<wbr><!--img--><!--gmi--><wbr>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AnnotationServiceFactory().create(YourService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />YourService&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(YourService)</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XFireProxyFactory().create(serviceModel,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://your/remote/url</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<br />
<br />
3.&nbsp; 混合方式<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 89px; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AnnotationServiceFactory(<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Jsr181WebAnnotations(),<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;XFireFactory.newInstance().getXFire().getTransportManager(),<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AegisBindingProvider(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JaxbTypeRegistry())).create(YourService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
二，通过WSDL创建一个动态的客户端，如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.MalformedURLException;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.URL;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.codehaus.xfire.client.Client;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_148_511_Open_Image" onclick="this.style.display='none'; Codehighlighter1_148_511_Open_Text.style.display='none'; Codehighlighter1_148_511_Closed_Image.style.display='inline'; Codehighlighter1_148_511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_148_511_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_148_511_Closed_Text.style.display='none'; Codehighlighter1_148_511_Open_Image.style.display='inline'; Codehighlighter1_148_511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DynamicClientTest&nbsp;</span><span id="Codehighlighter1_148_511_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_148_511_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MalformedURLException,<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_244_509_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_509_Open_Text.style.display='none'; Codehighlighter1_244_509_Closed_Image.style.display='inline'; Codehighlighter1_244_509_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_509_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_509_Closed_Text.style.display='none'; Codehighlighter1_244_509_Open_Image.style.display='inline'; Codehighlighter1_244_509_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_244_509_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_509_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Client(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URL(<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/xfiretest/services/TestService?wsdl</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;client<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_450_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_450_462_Open_Text.style.display='none'; Codehighlighter1_450_462_Closed_Image.style.display='inline'; Codehighlighter1_450_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_450_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_450_462_Closed_Text.style.display='none'; Codehighlighter1_450_462_Open_Image.style.display='inline'; Codehighlighter1_450_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.invoke(</span><span style="color: #000000">"</span><span style="color: #000000">sayHello</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;</span><span id="Codehighlighter1_450_462_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_450_462_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Firends</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">);<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(results[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
三，使用ANT工具或命令行通过WSDL生成一个客户端：<br />
1，使用ANT生成客户端，ANT脚本如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">project&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">wsgen</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">wsgen</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;basedir</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">path&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">classpathId</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fileset&nbsp;dir</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">./WebRoot/WEB-INF/lib</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">include&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">*.jar</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">fileset</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">path</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">taskdef&nbsp;classpathref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">classpathId</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">wsgen</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;classname</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.codehaus.xfire.gen.WsGenTask</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">taskdef</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">target&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">wsgen</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;description</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">generate&nbsp;client</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">wsgen&nbsp;outputDirectory</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">./src/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;wsdl</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">abc.wsdl</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;binding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">xmlbeans</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.abc.p</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;overwrite</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">target</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">project</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
请注意，脚本中有一个参数binding，可以指定如下两种不同的方式：<br />
(1)&nbsp; jaxb(Java Architecture for XML Binding，<a href="https://jaxb.dev.java.net/" target="_blank"><font style="line-height: 1.8em" color="#1a8bc8">https://jaxb.dev.java.net/</font><wbr style="line-height: 1.8em"></a><wbr>)：使用此种方式时，会自动生成更多的Request和Resopnse类。<br />
(2)xmlbeans<br />
调用方式如下：<br />
<wbr><!--img--><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" border="0"  alt="" />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">AbcServiceClient&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AbcServiceClient();<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/xfireTest/services/TestService</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;client.getAbcPort(url).sayHello(</span><span style="color: #000000">"</span><span style="color: #000000">Robin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<!--gmi--><wbr><br />
2，使用命令生成客户端的命令如下：<br />
<wbr><!--img--><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" border="0"  alt="" />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">gpath</span><span style="color: #000000">=</span><span style="color: #000000">xfire</span><span style="color: #000000">-</span><span style="color: #000000">all</span><span style="color: #000000">-</span><span style="color: #000000">1.2</span><span style="color: #000000">-</span><span style="color: #000000">SNAPSHOT.jar:ant</span><span style="color: #000000">-</span><span style="color: #000000">1.6</span><span style="color: #000000">.</span><span style="color: #000000">5</span><span style="color: #000000">.jar:jaxb</span><span style="color: #000000">-</span><span style="color: #000000">api</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">.0EA3.jar:stax</span><span style="color: #000000">-</span><span style="color: #000000">api</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">.</span><span style="color: #000000">1</span><span style="color: #000000">.jar:jdom</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">.jar:jaxb</span><span style="color: #000000">-</span><span style="color: #000000">impl</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">.0EA3.jar\<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />:jaxb</span><span style="color: #000000">-</span><span style="color: #000000">xjc</span><span style="color: #000000">-</span><span style="color: #000000">2.0</span><span style="color: #000000">-</span><span style="color: #000000">ea3.jar:wstx</span><span style="color: #000000">-</span><span style="color: #000000">asl</span><span style="color: #000000">-</span><span style="color: #000000">2.9</span><span style="color: #000000">.</span><span style="color: #000000">3</span><span style="color: #000000">.jar:commons</span><span style="color: #000000">-</span><span style="color: #000000">logging</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">.</span><span style="color: #000000">4</span><span style="color: #000000">.jar:activation</span><span style="color: #000000">-</span><span style="color: #000000">1.1</span><span style="color: #000000">.jar:wsdl4j</span><span style="color: #000000">-</span><span style="color: #000000">1.5</span><span style="color: #000000">.</span><span style="color: #000000">2</span><span style="color: #000000">.jar:XmlSchema</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">.</span><span style="color: #000000">3</span><span style="color: #000000">.jar:xfire</span><span style="color: #000000">-</span><span style="color: #000000">jsr181</span><span style="color: #000000">-</span><span style="color: #000000">api</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">-</span><span style="color: #000000">M1.jar;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />java&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">cp&nbsp;$gpath&nbsp;org.codehaus.xfire.gen.WsGen&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">wsdl&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">localhost:8080/xfire/services/Bookservice?wsdl&nbsp;-o&nbsp;.&nbsp;-p&nbsp;pl.tomeks.client&nbsp;-overwrite&nbsp;true&nbsp;</span></div>
<!--gmi--><wbr></div>
<img src ="http://www.blogjava.net/hyint/aggbug/256058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyint/" target="_blank">苦瓜</a> 2009-02-22 17:23 <a href="http://www.blogjava.net/hyint/articles/256058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>