??xml version="1.0" encoding="utf-8" standalone="yes"?>色噜噜的亚洲男人的天堂,亚洲国产精品尤物yw在线,亚洲国产精品久久久久http://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.html路边的石?java路边的石?javaMon, 13 Aug 2007 06:17:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.htmlhttp://www.tkk7.com/romkk-shi/comments/136371.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136371.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136371.html

webservice的工作原?/span>

 

实际上,WebService的主要目标是跨^台的可互操作性。ؓ了达到这一目标Q?/span>WebService完全ZXMLQ可扩展标记语言Q?/span>XSDQ?/span>XMLSchemaQ等独立于^台、独立于软g供应商的标准Q是创徏可互操作的、分布式应用E序的新q_。由此可以看出,在以下四U情况下Q?/span>WebService会带来极大的好处?/span>

 

优势一Q跨防火墙的通信

如果应用E序有成千上万的用户Q而且分布在世界各圎ͼ那么客户端和服务器之间的通信是一个棘手的问题。因为客L和服务器之间通常会有防火墙或者代理服务器。在q种情况下,使用DCOM׃是那么简单,通常也不便于把客LE序发布到数量如此庞大的每一个用h中。传l的做法是,选择用浏览器作ؓ客户端,写下一大堆ASP面Q把应用E序的中间层暴露l最l用戗这样做的结果是开发难度大Q程序很隄护?/span>

 

举个例子Q在应用E序里加入一个新面Q必d建立好用L?/span>(Web)Qƈ在这个页面后面,包含相应商业逻辑的中间层lgQ还要再建立臛_一?/span>ASP面Q用来接受用戯入的信息Q调用中间层lgQ把l果格式化ؓHTML形式Q最后还要把“l果?#8221;送回览器。要是客L代码不再如此依赖?/span>HTML表单Q客L的编E就单多了?/span>

如果中间层组件换?/span>WebService的话Q就可以从用L面直接调用中间层lgQ从而省掉徏?/span>ASP面的那一步。要调用WebServiceQ可以直接?/span>MicrosoftSOAPToolkit?/span>.NETq样?/span>SOAP客户端,也可以用自己开发的SOAP客户端,然后把它和应用程序连接v来。不仅羃短了开发周期,q减了代码复杂度,q能够增强应用程序的可维护性。同Ӟ应用E序也不再需要在每次调用中间层组件时Q都跌{到相应的“l果?#8221;?/span>

从经验来看,在一个用L面和中间层有较多交互的应用程序中Q?/span>WebServiceq种l构Q可以节省花在用L面编E上20%的开发时间。另外,q样一个由WebServicel成的中间层Q完全可以在应用E序集成或其它场合下重用。最后,通过WebService把应用程序的逻辑和数?#8220;暴露”出来Q还可以让其它^C的客户重用这些应用程序?/span>

 

优势二:应用E序集成

允许在不同^C、以不同语言~写的各U程序以Z标准的方式相互通信。企业的应用程序开发者都知道Q企业里l常都要把用不同语言写成的、在不同q_上运行的各种E序集成hQ而这U集成将p很大的开发力量。应用程序经帔R要从q行?/span>IBML上的E序中获取数据;或者把数据发送到L?/span>UNIX应用E序中去。即使在同一个^CQ不同Y件厂商生产的各种软g也常帔R要集成v来。通过WebServiceQ应用程序可以用标准的方法把功能和数?#8220;暴露”出来Q供其它应用E序使用?/span>

例如Q有一个订单记录程序,用于从客戯得新订单Q包括客户信息、发货地址、数量、h格和付款方式{内容;q有一个订单执行程序,用于实际货物发送的理。这两个E序来自不同软g厂商。一份新订单q来之后Q订单记录程序需要通知订单执行E序发送货物。通过在订单执行程序上面增加一?/span>WebServiceQ订单执行程序可以把“AddOrder”函数“暴露”出来。这P每当有新订单到来Ӟ订单dE序可以调用这个函数来发送货物了?/span>

 

优势三:B2B的集?/span>

?/span>WebService集成应用E序Q可以公司内部的商务处理更加自动化。但当交易跨供应商和客戗突破公司的界限时会怎么样呢Q跨公司的商务交易集成通常叫做B2B集成?/span>

WebService?/span>B2B集成成功的关键。通过WebServiceQ公司可以把关键的商务应?#8220;暴露”l指定的供应商和客户。例如,把电子下单系l和电子发票pȝ“暴露”出来Q客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发。当Ӟqƈ不是一个新的概念,EDI(电子文档交换)早就是这样了。但是,WebService的实现要?/span>EDI单得多,而且WebServiceq行?/span>Internet上,在世界Q何地斚w可轻易实玎ͼ其运行成本就相对较低。不q,WebServiceq不?/span>EDI那样Q是文档交换?/span>B2B集成的完整解x案?/span>WebService只是B2B集成的一个关键部分,q需要许多其它的部分才能实现集成?/span>

?/span>WebService来实?/span>B2B集成的最大好处在于可以轻易实C操作性。只要把商务逻辑“暴露”出来Q成?/span>WebServiceQ就可以让Q何指定的合作伙伴调用q些商务逻辑Q而不他们的pȝ在什么^Cq行Q用什么开发语a。这样就大大减少了花?/span>B2B集成上的旉和成本,让许多原本无法承?/span>EDI的中企业也能实?/span>B2B集成?/span>

 

优势四:软g和数据重?/font>

软g重用是一个很大的主题Q重用的形式很多Q重用的E度有大有小。最基本的Ş式是源代码模块或者类一U的重用Q另一UŞ式是二进制Ş式的lg重用?/font>

?/span>WebService集成各种应用中的功能Qؓ用户提供一个统一的界?/span>

当前Q像表格控g或用L面控件这L可重用Y件组Ӟ在市Z都占有很大的份额。但q类软g的重用有一个很大的限制Q就是重用仅限于代码Q数据不能重用。原因在于,发布lg甚至源代码都比较ҎQ但要发布数据就没那么容易,除非是不会经常变化的静态数据?/font>

WebService在允讔R用代码的同时Q可以重用代码背后的数据。?/span>WebServiceQ再也不必像以前那样Q要先从W三方购买、安装Y件组Ӟ再从应用E序中调用这些组Ӟ只需要直接调用远端的WebService可以了。D个例子,要在应用E序中确认用戯入的地址Q只需把这个地址直接发送给相应?/span>WebServiceQ这?/span>WebService׃帮你查阅街道地址、城市、省区和邮政~码{信息,认q个地址是否在相应的邮政~码区域?/span>WebService的提供商可以按时间或使用ơ数来对q项服务q行收费。这L服务要通过lg重用来实现是不可能的Q那L话你必须下蝲q安装好包含街道地址、城市、省区和邮政~码{信息的数据库,而且q个数据库还是不能实时更新的?/span>

另一UY仉用的情况是,把好几个应用E序的功能集成v来。例如,要徏立一个局域网上的门户站点应用Q让用户既可以查询联邦快递包裹,查看股市行情Q又可以理自己的日E安排,q可以在U购买电q。现?/span>Web上有很多应用E序供应商,都在其应用中实现了这些功能。一旦他们把q些功能都通过WebService“暴露”出来Q就可以非常Ҏ地把所有这些功能都集成C的门L点中Qؓ用户提供一个统一的、友好的界面?/span>

来Q许多应用程序都会利?/span>WebServiceQ把当前Zlg的应用程序结构扩展ؓlg/WebService的؜合结构,可以在应用程序中使用W三方的WebService提供的功能,也可以把自己的应用程序功能通过WebService提供l别人。两U情况下Q都可以重用代码和代码背后的数据?/span>

从以上论q可以看出,WebService在通过Webq行互操作或q程调用的时候是最有用的。不q,也有一些情况,WebServiceҎ不能带来M好处?/span>

 

短处一Q单机应用程?/font>

目前Q企业和个hq用着很多桌面应用E序。其中一些只需要与本机上的其它E序通信。在q种情况下,最好就不要?/span>WebServiceQ只要用本地?/span>API可以了?/span>COM非常适合于在q种情况下工作,因ؓ它既又快。运行在同一台服务器上的服务器Y件也是这栗最好直接用COM或其它本地的API来进行应用程序间的调用。当?/span>WebService也能用在q些场合Q但那样不仅消耗太大,而且不会带来M好处?/span>

 

短处二:局域网的同构应用程?/font>

在许多应用中Q所有的E序都是?/span>VB?/span>VC开发的Q都?/span>Windowsq_下?/span>COMQ都q行在同一个局域网上。例如,有两个服务器应用E序需要相互通信Q或者有一?/span>Win32?/span>WinForm的客L序要q接局域网上另一个服务器的程序。在q些E序里,使用DCOM会比SOAP/HTTP有效得多。与此相cMQ如果一?/span>.NETE序要连接到局域网上的另一?/span>.NETE序Q应该?/span>.NETremoting。有的是,?/span>.NETremoting中,也可以指定?/span>SOAP/HTTP来进?/span>WebService调用。不q最好还是直接通过TCPq行RPC调用Q那样会有效得多?/span>

MQ只要从应用E序l构的角度看Q有别的Ҏ?/span>WebService更有效、更可行Q那׃要用WebService?/span>

?/span>Web Service定义为:通过 SOAP ?/span> Web上提供的软g服务Q?/span> WSDL 文gq行说明Qƈ通过 UDDI q行注册?/span>

 

 

Web Service架构Q?/span>Web Service是独立的、模块化的应用,能够通过因特|来描述、发布、定位以及调用。在Web Service的体pL构中包括三个角色Q服务提供?/span>(Service Provider)、服务请求?/span>(Service Requestor)、服务注册器(Service Registry)。角色间主要有三个操作:发布(Publish)、查?/span>(Find)、绑?/span>(Bind)?/span>

下图清楚的描qC三种角色Q以及角色之间的作用关系?/font>

Web Service协议标准

1、简单对象访问协议(SOAPQ?/span>

SOAP?/span>Simple Object Access Protocol的羃写,是一U基?/span>XML的不依赖传输协议的表C层协议Q用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在SOAP的下层,可以?/span>HTTPQ也可以?/span>SMTP/POP3Q还可以是ؓ一些应用而专门设计的Ҏ的通信协议?/span>

SOAP包括三个主要部分Q?/span>

SOAP装l构Q定义了一个整体框Ӟ以表C消息中包含什么内容,谁来处理q些内容以及q些内容是可选的或是必需的?/span>

SOAP~码规则Q定义了用以交换应用E序定义的数据类型的实例的一pd机制?/span>

SOAP RPC表示Q定义了一个用来表CE过E调用和应答的协定?/span>

2?/span>Web Service描述语言Q?/span>WSDLQ?/span>

WSDL?/span>Web Service Description Language的羃写,该语a网l服务定义成一个能交换消息的通信端点集,为分布式pȝ提供了帮助文档,同时也可作ؓ自动实现应用间通信的解x案?/span>

3、统一描述、发现和集成协议Q?/span>UDDIQ?/span>

UDDI是一套基?/span>Web的、分布式的、ؓWeb Service提供的、信息注册中心的实现标准规范Q同时也包含一l企业能将自n提供?/span>Web Service注册Q以使别的企业能够发现的讉K协议的实现标准?/span>

 

 

       通过xfire实现?/span>webservice。下面详l介l一?/span>xfire?/span>

XFire是一个免费的,开源的SOAP框架. 它不仅允怽L?/span>地实现这么一个环?/span>.而且q提供了很多先进的特?/span>.如果你的Web应用有一?/span>Javac?/span>, 现在你希望这个类变成Web服务,?/span>XFire完成q一工作你不必写一句代?/span>.仅需操作一下部|描q器,你就会得C?/span>Web服务.

一?/font>建立接口文gcom.resoft.recis.ws.ReCISService

public interface ReCISService {

       //hpȝ讄信息

       public AppInfo getAppInfo();

}

public class ReCISServiceImp implements ReCISService {

       public com.resoft.recis.ws.AppInfo getAppInfo() {

              // TODO Auto-generated method stub

              return com.resoft.recis.ws.AppInfo.getAppInfo();

       }

}

二?/font>已存在类com.resoft.recis.ws. AppInfo

public class AppInfo {

       double cardLeft;

       /** default constructor */

       public AppInfo() {

       }

       public double getCardLeft() {

              return cardLeft;

       }

       public void setCardLeft(double cardLeft) {

              this.cardLeft = cardLeft;

       }

       public static  AppInfo getAppInfo() {

              Session session = HibernateUtil.getSession();

              com.resoft.recis.biz.AppInfo dbappinfo = (com.resoft.recis.biz.AppInfo) Util

                            .getHQLResult(session, "from AppInfo");

              if (dbappinfo == null) {

                     return null;

              }           

              com.resoft.recis.ws.AppInfo appinfo = new com.resoft.recis.ws.AppInfo();

              appinfo.setOperid("");

              appinfo.setOrgcode("");

              appinfo.setCardHeight(dbappinfo.getCardHeight());

              appinfo.setCardLeft(dbappinfo.getCardLeft());

              appinfo.setCardTop(dbappinfo.getCardTop());

              appinfo.setCardWidth(dbappinfo.getCardWidth());

              HibernateUtil.closeSession();

              return appinfo;

       }

}

三?/span>Web.xml应用的部|描q?/span>

    <!?span>        xfire?/span>servlet配置文g -->

    <servlet>

       <servlet-name>XFireServlet</servlet-name>

       <display-name>XFire Servlet</display-name>

       <servlet-class>

           org.codehaus.xfire.transport.http.XFireConfigurableServlet

       </servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>XFireServlet</servlet-name>

       <url-pattern>/servlet/XFireServlet/*</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

       <servlet-name>XFireServlet</servlet-name>

       <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

四?/font>创徏services.xml文g

XFire本n是ZServlet的应?/span>,xfire使用services.xml文g来完?/span>Web服务配置?/span>q个文g位于src/META-INF/xfire目录?/span>,

src\META-INF\xfire

下面是基本的配置条目Q?/span>q个配置文g中配|了xfire的接口,实现与验印控件的交互?/span>

<beans xmlns="http://xfire.codehaus.org/config/1.0">

 <service>

    <name>ReCISService</name>   

    <namespace>http://resoft</namespace>

    <serviceClass>com.resoft.recis.ws.ReCISService</serviceClass>   <implementationClass>com.resoft.recis.ws.ReCISServiceImp</implementat          ionClass>

 </service>

</beans>

 

services.xml文g中的具体内容如下Q?/span>

<service>元素Q?/span>

?/span>Web服务的定义包含在<service>元素内?/span><service>元素下还有若q子元素?/span>

<name>子元素:

可以提供M有效?/span>xml名字,q个名字会被客户端程序和服务器上的其他组件?/span>.例如,当服务器h以后,你可以在览器上使用q个名称来查?/span>WSDL.

<namespace>子元素:

M有效?/span>xml名称都可?/span>, <namespace>作Z服务器的唯一标识变量使用.

<serviceClass>子元素:

包含Javacd用来指明Ҏ的签?/span>.在这个例子中?/span>ReCISService接口.如果JavacL有实CQ何接?/span>,那就填入cd.只需要这一个入口来他们{换成Web服务.

<implementationClass>子元素:

记录实现接口?/span>Javacd.q是一个可选元?/span>.如果前一个元?/span><serviceClass>填入的是接口,那么此处p填入相应的实现类?/span>.

五?/span>XFire和所有必要的库文?/span>

讉KXFire官方|站http://xfire.codehaus.org/ 下蝲xfire-distribution-1.2.5.zipq解压到本地文g夹中.参?/span>xfire-distribution-1.2.5\xfire-1.2.5\manual\Dependency Guide.html中介l拷贝相?/span>jar包到WEB-INF\libQ?/span>xfire-distribution-1.2.5需要的jar包如下:

 

  xfire-all-1.2.5.jar

?nbsp;activation-1.1.jar

commons-codec-1.3.jar

commons-httpclient-3.0.jar

commons-logging-1.0.4.jar

mail-1.4.jar

jaxen-1.1-beta-9.jar

jdom-1.0.jar

junit-3.8.1.jar

servlet-api-2.3.jar

spring-1.2.6.jar

stax-api-1.0.1.jar

wsdl4j-1.6.1.jar

wstx-asl-3.2.0.jar

xbean-2.2.0.jar

xbean-spring-2.8.jar

XmlSchema-1.1.jar

xfire-jsr181-api-1.0-M1.jar

六?/span>通过URL验证Web服务有效?/span>

首先,我们先来看看WSDL是否有效。在览器中输入URL地址?/span>http://127.0.0.1/test/services/ReCISService?wsdl 注意URL?/span>IP地址和端口号是否需要修攏V?/span>如果输入了有效的URL,会看到?/span><wsdl:definitions>为根l点?/span>xml文g。这个文件叫?/span>web服务?/span>WSDL.如果你看Cq个文gQ那么初步验证你?/span>Web服务有效?/span>

但是q个验证q不够。有时候情况会复杂一些,你可以看?/span>WSDLQ但是客L却无法访?/span>Web服务。因此要真正?/span>Web服务是否真的好Q就要用客户端程序对Web服务作一ơ真正的调用?/span>

七?/span>客户端验?/span>Web服务有效?/span>

建立下面试cL?/span>Web服务器的有效性?/span>

public class TestWebservice

{

    public static void main(String args[])

    {

        String serviceURL ="http://127.0.0.1/test/services/ReCISService";  

Service serviceModel = new ObjectServiceFactory().create(ReCISService.class,null,"http://resoft",null);

       

        XFireProxyFactory serviceFactory = new XFireProxyFactory();

       

        try

        {

            ReCISService service = (ReCISService) serviceFactory.create(serviceModel, serviceURL);

            Client client = Client.getInstance(service);

            System.out.println("begin");

            com.resoft.recis.ws.AppInfo ai=service.getAppInfo();

            System.out.println(ai.getCardHeight());

            System.out.println("end");

        }

        catch (MalformedURLException e)

        {

            e.printStackTrace();

        } catch (Exception e) {

           e.printStackTrace();

        }

    }

}



]]>
什么是Web ServiceQ?/title><link>http://www.tkk7.com/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.tkk7.com/romkk-shi/archive/2007/08/13/136370.html</guid><wfw:comment>http://www.tkk7.com/romkk-shi/comments/136370.html</wfw:comment><comments>http://www.tkk7.com/romkk-shi/archive/2007/08/13/136370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/romkk-shi/comments/commentRss/136370.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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">研究一下当前的应用E序开发,你会发现一个绝对的們֐Qh们开始偏爱基于浏览器的瘦客户应用E序。这当然不是因ؓ瘦客戯够提供更好的用户界面Q而是因ؓ它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因ؓ应用E序安装和配|的问题Q另一半是因ؓ客户和服务器之间通信的问题? <p style="TEXT-INDENT: 2em">传统的Windows富客户应用程序用DCOM来与服务器进行通信和调用远E对象。配|好DCOM使其在一个大型的|络中正常工作将是一个极富挑战性的工作Q同时也是许多IT工程师的噩梦。事实上Q许多IT工程师宁愿忍受浏览器所带来的功能限Ӟ也不愿在局域网上去q行一个DCOM。在我看来,l果是一个发布容易,但开发难度大而且用户界面极其受限的应用程序。极端的_是你花了更多的资金和时_却开发出从用L来功能更q应用E序。不信?问问你的会计师对新的Z览器的会计软g有什么想法:l大多数商用E序用户希望使用更加友好的Windows用户界面? <p style="TEXT-INDENT: 2em">关于客户端与服务器的通信问题Q一个完的解决Ҏ是用HTTP协议来通信。这是因ZQ何运行Web览器的机器都在使用HTTP协议。同Ӟ当前许多防火墙也配置为只允许HTTPq接? <p style="TEXT-INDENT: 2em">许多商用E序q面临另一个问题,那就是与其他E序的互操作性。如果所有的应用E序都是使用COM?NET语言写的Qƈ且都q行在Windowsq_上,那就天下太^了。然而,事实上大多数商业数据仍然在大型主Z以非关系文g(VSAM)的Ş式存放,q由COBOL语言~写的大型机E序讉K。而且Q目前还有很多商用程序l在使用C++、Java、Visual Basic和其他各U各L语言~写。现在,除了最单的E序之外Q所有的应用E序都需要与q行在其他异构^C的应用程序集成ƈq行数据交换。这Ld通常都是qD的ҎQ如文g传输和分析,消息队列Q还有仅适用于某些情늚的APIQ如IBM?高E序到程序交?APPC)"{来完成的。在以前Q没有一个应用程序通信标准Q是独立于^台、组建模型和~程语言的。只有通过Web ServiceQ客L和服务器才能够自q用HTTPq行通信Q不Z个程序的q_和编E语a是什么? <p style="TEXT-INDENT: 2em">什么是Web Service <p style="TEXT-INDENT: 2em">对这个问题,我们臛_有两U答案。从表面上看QWeb service 是一个应用程序,它向外界暴露Z个能够通过Webq行调用的API。这是_你能够用~程的方法通过Web来调用这个应用程序。我们把调用q个Web service 的应用程序叫做客戗例如,你想创徏一个Web service Q它的作用是q回当前的天气情c那么你可已建立一个ASP面Q它接受邮政~码作ؓ查询字符Ԍ然后q回一个由逗号隔开的字W串Q包含了当前的气温和天气。要调用q个ASP面Q客L需要发送下面的q个HTTP GEThQ? <p style="TEXT-INDENT: 2em">http://host.company.com/weather.asp?zipcode=20171 <p style="TEXT-INDENT: 2em">q回的数据就应该是这P <p style="TEXT-INDENT: 2em">21,? <p style="TEXT-INDENT: 2em">q个ASP面应该可以算作是Web service 了。因为它ZHTTP GEThQ暴露出了一个可以通过Web调用的API。当ӞWeb service q有更多的东ѝ? <p style="TEXT-INDENT: 2em">下面是对Web service 更精的解释Q?Web services是徏立可互操作的分布式应用程序的新^台。作Z个WindowsE序员,你可能已l用COM或DCOM建立q基于组件的分布式应用程序。COM是一个非常好的组件技术,但是我们也很Ҏ丑ևCOMq不能满求的情况? <p style="TEXT-INDENT: 2em">Web serviceq_是一套标准,它定义了应用E序如何在Web上实C操作性。你可以用Q何你喜欢的语aQ在M你喜Ƣ的q_上写Web service Q只要我们可以通过Web service标准对这些服务进行查询和讉K? <p style="TEXT-INDENT: 2em">新^? <p style="TEXT-INDENT: 2em">Web serviceq_需要一套协议来实现分布式应用程序的创徏。Q何^台都有它的数据表C方法和cdpȝ。要实现互操作性,Web serviceq_必须提供一套标准的cdpȝQ用于沟通不同^台、编E语a和组件模型中的不同类型系l。在传统的分布式pȝ中,Z界面(interface)的^台提供了一些方法来描述界面、方法和参数Q译注:如COM和COBAR中的IDL语言Q。同LQWeb serviceq_也必L供一U标准来描述Web serviceQ让客户可以得到_的信息来调用q个Web service。最后,我们q必L一U方法来对这个Web serviceq行q程调用。这U方法实际是一U远E过E调用协?RPC)。ؓ了达C操作性,q种RPC协议q必Mq_和编E语a无关。下面几个小节就要介l了l成Web serviceq_的这三个技术? <p style="TEXT-INDENT: 2em">XML和XSD <p style="TEXT-INDENT: 2em">可扩展的标记语言(XML)是Web serviceq_中表C数据的基本格式。除了易于徏立和易于分析外,XML主要的优点在于它既是q_无关的,又是厂商无关的。无x是比技术优性更重要的:软g厂商是不会选择一个由竞争Ҏ所发明的技术的? <p style="TEXT-INDENT: 2em">XML解决了数据表C的问题Q但它没有定义一套标准的数据cdQ更没有说怎么L展这套数据类型。例如,整Ş数到底代表什么?16位,32位,q是64位?q些l节对实C操作性都是很重要的。W3C制定的XML Schema(XSD)是专门解决q个问题的一套标准。它定义了一套标准的数据cdQƈl出了一U语a来扩展这套数据类型。Web serviceq_是用XSD来作为其数据cdpȝ的。当你用某种语言(如VB.NET或C#)来构造一个Web serviceӞZW合Web service标准Q所有你使用的数据类型都必须被{换ؓXSDcd。你用的工具可能已经自动帮你完成了这个{换,但你很可能会Ҏ你的需要修改一下{换过E。在W二章中Q我们将深入XSDQ学习怎样转换自定义的数据cd(例如c?到XSD的类型? <p style="TEXT-INDENT: 2em">SOAP <p style="TEXT-INDENT: 2em">Web service建好以后Q你或者其他h׃去调用它。简单对象访问协?SOAP)提供了标准的RPCҎ来调用Web service。实际上QSOAP在这里有点用词不当:它意味着下面的Web service是以对象的方式表C的Q但事实q不一定如此:你完全可以把你的Web service写成一pd的C函数Qƈ仍然使用SOAPq行调用。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来用SOAP。SOAP也是ZXML和XSD的,XML是SOAP的数据编码方式。第三章我们会讨论SOAPQƈl识SOAP消息的各U元素? <p style="TEXT-INDENT: 2em">WSDL <p style="TEXT-INDENT: 2em">你会怎样向别Zl你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚臛_能会口头上告诉需要用你的Web service的h。这些非正式的方法至都有一个严重的问题Q当E序员坐到电脑前Q想要用你的Web service的时候,他们的工?如Visual Studio)无法l他们提供Q何帮助,因ؓq些工具Ҏ׃了解你的Web <p style="TEXT-INDENT: 2em">service。解x法是Q用机器能阅ȝ方式提供一个正式的描述文档。Web service描述语言(WSDL)是q样一个基于XML的语aQ用于描qWeb service及其函数、参数和q回倹{因为是ZXML的,所以WSDL既是机器可阅ȝQ又是h可阅ȝQ这是一个很大的好处。一些最新的开发工h能根据你的Web service生成WSDL文档Q又能导入WSDL文档Q生成调用相应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.tkk7.com/romkk-shi/aggbug/136370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/romkk-shi/" target="_blank">路边的石?java</a> 2007-08-13 14:15 <a href="http://www.tkk7.com/romkk-shi/archive/2007/08/13/136370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么时候应该用Web Servicehttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.html路边的石?java路边的石?javaMon, 13 Aug 2007 06:10:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.htmlhttp://www.tkk7.com/romkk-shi/comments/136367.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136367.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136367.html 现在我将列D三种情况Q在q三U情况下Q你会发现使用Web service会带来极大的好处。此后,我还会DZ应该使用Web service的一些情c?

  跨越防火墙的通信

  如果你的应用E序有成千上万的用户Q而且他们都分布在世界各地Q那么客L和服务器之间的通信是一个棘手的问题。那是因为客L和服务器之间通常都会有防火墙或者代理服务器。在q种情况下,你想使用DCOM׃是那么简单了Q而且Q通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用h中。于是,你最l选择了用览器作为客LQ写下一堆ASP面Q把应用E序的中间层暴露l最l用戗结果呢?q气好的话,只是开发难度大了一些,q气不好的话Q就会得C个根本无法维护的应用E序?/p>

  惌一下你应该怎么在你的应用程序里面加入一个新的页?你必d建立好用L?Web面)Q以及在q个面后面Q包含相应商业逻辑的中间层lg。这q不够,你还要再建立臛_一个ASP面Q用来接受用戯入的信息Q调用中间层lgQ把l果格式化ؓHTML形式Q最后还要把"l果?送回览器。要是客L代码不再如此依赖于HTML表单Q客L的编E不q单多了吗?q有Q徏立ASP面的那一步可以省略掉?

  当然。如果你的中间层lg是Web service的话Q你完全可以从用L面直接调用中间层lgQ从而省掉徏立ASP面的那一步。要调用Web serviceQ你可以直接使用Microsoft SOAP Toolkit?NETq样的SOAP客户端,也可以用你自己开发的SOAP客户端,然后把它和你的应用程序连接v来。这样做Q不仅可以羃短开发周期,q可以减代码的复杂度,q增强整个应用程序的可维护性。同Ӟ你的应用E序也不再需要在每次调用中间层组件时Q都跌{到相应的"l果?了?/p>

  以我的经验来看,在一个用L面和中间层有较多交互的应用程序中Q用Web serviceq种l构Q可以轻杄节省花在用户界面~程上的20%的开发时间。这样做q有另一个好处,是你将得到一个由Web servicel成的中间层Q这一层是完全可以在应用程序集成或其他场合下被重用的。最后,通过Web service把你的应用程序的逻辑和数据暴露出来,q可以让其它q_上的客户重用你的应用E序?/p>

  应用E序集成

  企业U的应用E序开发者都知道Q企业里l常都要把用不同语言写成的在不同q_上运行的各种E序集成hQ而这U集成将p很大的开发的力量。你的应用程序经帔R需要从q行在古老的IBML上的E序中获取数?或者再把数据发送到L或UNIX应用E序中去。即使是在同一个^CQ不同的软g厂商生的各UY件也常常需要集成v来。通过Web serviceQ应用程序可以用标准的方法把功能和数据暴露出来,供其它的应用E序使用?/p>

  例如Q你有一个订单登录程序,用于d从客h的新订单Q包括客户信息、发货地址、数量、h格和付款方式{信息。同Ӟ你还有一个订单执行程序,用于实际货物发送的理。这两个E序是来自不同Y件厂商的。一份新订单q来之后Q订单登录程序需要通知订单执行E序发送货物。通过在订单执行程序上面增加一层Web serviceQ订单执行程序可以把"AddOrder"函数暴露出来。这P每当有新订单到来Ӟ订单dE序可以调用这个函数来发送货物了。进而通过Web service集成应用E序

  B2B的集?/strong>

  用Web service集成应用E序Q可以你公司内部的商务处理更加自动化。但当交易跨了你的供应商和客户Q突破了公司的界U时又会怎么样呢?跨公司的商务交易集成通常叫做B2B集成?/p>

  Web service是B2B集成成功的关键。通过Web serviceQ你的公司可以把关键的商务应用暴露给指定的供应商和客戗例如,把你的电子下单系l和电子发票pȝ暴露出来Q你的客户就可以以电子的方式向你发送购货订单,而你的供应商则可以以电子的方式把原料采购的发发送给你。当Ӟqƈ不是一个新的概?电子文档交换(EDI)早就是这样了。Web service和EDI之间的主要区别在于,Web service的实现要比EDI单得多,而且Web service是运行在Internet上的Q在世界M地方都可L实现Q这样其q行成本q对较低。不q,Web serviceq不像EDI那样Q是文档交换或B2B集成的一套完整的解决Ҏ。Web service只是B2B集成的一个关键部分,q需要许多其它的部分才能完成q个集成?/p>

  用Web service来实现B2B集成的最大好处在于可以轻易实C操作性。只要把你的商务逻辑暴露出来Q成为Web serviceQ你可以让M指定的合作伙伴轻杄调用你的商务逻辑Q而不他们的pȝ在什么^Cq行Q用的是什么开发语a。这样就大大减少了花在B2B集成的上的时间和成本。这L低成本让许多原本无法承受EDI的投资成本的中小企业也能实现B2B集成?/p>

  软g重用

  软g重用是一个很大的主题Q它有很多的形式和程度。最基本的Ş式是源代码模块或者类一U的重用。另一UŞ式是二进制Ş式的lg重用。当前,像表格控件或用户界面控gq样的可重用软glg在市Z都占有很大的份额。但q类软g的重用都有一个很严重的限?重用仅限于代码,而数据不能被重用。原因在于你可以很轻易的发布lg甚至源代码,但要发布数据没那么Ҏ了,除非那些数据都是不会l常变化的静态数据?/p>

  而Web service允许你在重用代码的同Ӟ重用代码后面的数据。用Web serviceQ你不再像以前那P要先从第三方购买、安装Y件组Ӟ再从你的应用E序中调用这些组件。你只需要直接调用远端的Web service可以了。D个例子,你想在你的应用程序中认用户输入的邮件地址Q那么,你只需把这个地址直接发送给相应的Web serviceQ这个Web service ׃帮你查阅街道地址、城市、省区和邮政~码{信息,认q个地址的确在相应的邮政~码区域。Web service 的提供商可以按时间或使用ơ数来对q项服务q行收费。这L服务要通过lg重用来实现是不现实的Q因为那L话你必须下蝲q安装好包含街道地址、城市、省区和邮政~码{信息的数据库,而且q个数据库还是不能实时更新的?/p>

  另一UY仉用的情况是把好几个应用程序的功能集成h。例如,你想要徏立一个局域网上的门户站点应用Q让用户既可以查询他们的联邦快递包裹,察看股市行情Q又可以理他们的日E安排,q可以在U购买电q。现在Web上有很多应用E序供应商,都在其应用中实现了上面的q些功能。一旦他们把q些功能都通过Web service 暴露出来Q你可以非常轻易地把所有这些功能都集成C的门L点中Qؓ用户提供一个统一的、友好的界面?/p>

  用Web service来集成各U应用中的功能,为用h供一个统一的界?/strong>

  许多应用E序都会利用Web serviceQ把当前Zlg的应用程序结构扩展ؓlg和Web service 的؜合结构。你也可以在应用E序中用第三方的Web service 提供的功能。你q可以把你自q应用E序的功能通过Web service 提供l别人。所有这些情况下Q你都可以重用代码和代码后面的数据。MQWeb service 是软g重用的一U非常有力的形式?/p>

  什么时候不应该使用Web Service

  一个对Web service的完整介l还应该包括什么时候不该用Web service。经q前面的介绍Q我们知道了Web service 在通过Webq行互操作或q程调用的时候是最有用的。不q,q有许多情况QWeb serviceҎ不能l你带来M好处?/p>

  单机应用E序

  目前Q我们还有很多桌面应用程序是供商用和个h使用的。其中一些只需要与q行在本Z的其他程序通信。在q种情况下,我们最好就不要再用Web service Q只要用本地的API可以了。COM非常适合于在q种情况下工作,因ؓ它既又快。运行在一台服务器上的服务器Y件也是这?最好直接用COM或其他本地的API来进行应用程序间的调用。当然Web service 也能用在q些情况下,但那样不仅消耗太大,而且不会l你带来M好处?/p>

  局域网上的同构应用E序

  在许多应用中Q你所有的E序都是用VB或VC开发的Q都在Windowsq_下用COMQ都q行在同一个局域网上。例如,你有两个服务器应用程序需要相互通信Q或者你有一个Win32或WinForm的客L序要q接到局域网上的另一个服务器E序。在q些E序里用DCOM会比SOAP/HTTP有效的多。类似的Q如果你的一?NETE序要连接到LAN上的另一?NETE序Q那么你应该使用.NET remoting。有的是,?NET remoting中,你也可以指定使用SOAP/HTTP来进行Web service 调用。不q最好还是直接通过TCPq行RPC调用Q那样会有效得多。MQ只要你从应用程序结构的角度看来Q有别的Ҏ比Web service 更有效,更可行,那就不要再用Web service?/p>

  ȝ

  Web service是创建可互操作的分布式应用程序的新^台。Web service 的主要目标是跨^台的可互操作性。ؓ了达到这一目标QWeb service 是完全基于XML、XSD{独立于q_、独立于软g供应商的标准的?/p>

  Web service在应用程序跨q_和跨|络q行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用Q以及通过Webq行客户端和服务器的通信的场合?/p>

  当然QWeb service也不是万能的Q你不能到处滥用Web service。在有些情况下,Web service 会降低应用程序的性能Q而不会带来Q何好处。例如,一台机器或一个局域网里面q行的同构应用程序就不应该用Web service q行通信?/p>

]]>
վ֩ģ壺 רһ·߶| ɫ߹ۿ| ޾ƷAMMëƬ| þþþav| ƵĻ| þѿٸ߳VƬػ| ˳Ƶۿ| þþþþþþþѾƷ | ѻɫƵ| ޾Ʒ㶮վ| һƷƵ߲| һƬ| ҰȫƵ| ۺպþóAV| aƬѿ| ޹˽ӰԺ| ƷƵ| պƷ3| ѿԻ40| Ƶ97Ӱ| avƬ߹ۿ| ƷѸ| AVר߹ۿ| ߾ƷƵ| ѨƬ߹ۿͬѧ| ۺϾþۺϼþ| ҰƵ| ƷþþþþӰ| պĻһҳ| ɫ뾫ƷƵ| ϵйƷƷ˿| һƵ| Ƶ1| þþƷ99Ʒɫ | AVרAV԰| ߹ۿƵ| ޱ뾫ƷAAAƬ| ӰԺһ| պ߲ȫ| ۲ӰԺѹۿ| av|