版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
英文原文地址:
http://www.onjava.com/pub/a/onjava/2005/05/25/j2ee-services.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43674_J2EE.html
關(guān)鍵詞: J2EE Service
如今,web services 是一門流行的實(shí)現(xiàn)面向服務(wù)應(yīng)用的技術(shù)。J2EE已經(jīng)成為一個(gè)流行的用來部署web services 應(yīng)用的平臺。并且,J2EE1.4制定了在Java平臺上建立和部署web services應(yīng)用的標(biāo)準(zhǔn)。
在我的上一篇文章中,我從一個(gè)Java開發(fā)者的角度介紹了面向服務(wù)架構(gòu)。在這篇文章中,我將說明如何在實(shí)現(xiàn)了J2EE1.4規(guī)范的應(yīng)用服務(wù)器之間,比如Oracle application Server 10g,使用J2EE1.4建立可互操作的,輕便靈活的服務(wù)。
Web Services 架構(gòu)
在深入研究J2EE平臺上web services的開發(fā)和部署的細(xì)節(jié)之前,讓我們先簡要的查看一下web service的架構(gòu)。
Web services 有很多種定義,但是簡而言之,web services 是能夠通過網(wǎng)絡(luò)被發(fā)布,發(fā)現(xiàn)和調(diào)用的獨(dú)立的,自我描述的組件。如圖1所示,一個(gè)web service可能會執(zhí)行一個(gè)簡單的功能,比如核算銀行存款記錄,也可能會是一個(gè)橫跨多個(gè)商業(yè)過程的復(fù)雜的任務(wù)。

圖1. 一個(gè)web service 是如何工作的
有兩種與web services 交互的方法:RPC類型和文檔類型。最初,RPC類型的web services在工業(yè)界很流行,但是最近幾年它已經(jīng)被文檔類型的web services所超越,后者被認(rèn)為是在web services中交換信息的首選方法。
RPC類型的web services提出將數(shù)據(jù)交換模擬成遠(yuǎn)程過程調(diào)用(RPC)。這在商業(yè)應(yīng)用中是很常見的。對于遠(yuǎn)程調(diào)用和其返回值,讓相互交換的消息都遵照一個(gè)明確定義的準(zhǔn)則。與之相反,文檔類型的web services模擬xml文檔的交換,交換模式由發(fā)送和接收應(yīng)用程序共同定義。文檔類型的服務(wù)更能適應(yīng)需要交換商業(yè)或其他類型文檔的應(yīng)用程序,而且不同于RPC類型的web services,發(fā)送方不需要期望或等待一個(gè)即時(shí)的響應(yīng)。
大多數(shù)開發(fā)者一定會同意:web services是一種有效的實(shí)現(xiàn)SOA的技術(shù),因?yàn)樗峁┝瞬煌脚_之間的互操作性,以及依賴于XML,SOAP和HTTP等的輕量級的技術(shù)。
平臺獨(dú)立性和技術(shù)實(shí)現(xiàn)性是web services普及的主要原因。客戶端不必了解相關(guān)技術(shù)的實(shí)現(xiàn),而只需簡單地通過網(wǎng)絡(luò)調(diào)用服務(wù)就可以了。例如,即使你使用Java/J2EE 技術(shù)創(chuàng)建了一個(gè)服務(wù)并且部署在一個(gè)J2EE服務(wù)器上,比如Oracle Application Server Container for J2EE(OC4J),客戶端也可以使用微軟的.NET架構(gòu)創(chuàng)建。
既然我們已經(jīng)對web services有了基本的了解,就讓我們關(guān)注一下構(gòu)成web service的基本元素吧。
Web Services是由什么構(gòu)成的?
Web Services 定義語言(WSDL;發(fā)音為“wizdle”)文檔是一個(gè)web service的核心。WSDL描述了服務(wù),而且也是web service保證遵守的“契約”。WSDL提供了對于一個(gè)web service的完整的描述,包括端口,操作和相關(guān)的消息類型。
這里是WSDL文檔的一個(gè)簡單的例子,它描述了一個(gè)Hello World web service:
<definitions 
 name="HelloService" 
 targetNamespace="http://oracle.j2ee.ws/ejb/Hello"
 xmlns="http://schemas.xmlsoap.org/wsdl/" 
 xmlns:tns="http://oracle.j2ee.ws/ejb/Hello" 
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
 xmlns:ns1="http://oracle.j2ee.ws/ejb/Hello/types" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
 <types> 
  <schema elementFormDefault="qualified" 
  targetNamespace="http://oracle.j2ee.ws/ejb/Hello/types" 
   xmlns="http://www.w3.org/2001/XMLSchema" 
   xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:tns="http://oracle.j2ee.ws/ejb/Hello/types" 
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <complexType name="sayHello"> 
    <message name="HelloServiceInf_sayHello"> 
      <part name="parameters"
        element="ns1:sayHelloElement"/> 
    </message> 
    <message name="HelloServiceInf_sayHelloResponse"> 
      <part name="parameters" 
        element="ns1:sayHelloResponseElement"/> 
    </message> 
    <portType name="HelloServiceInf">
      <Operation name="sayHello"> 
        <input message="tns:HelloServiceInf_sayHello"/> 
        <output message="tns:HelloServiceInf_sayHelloResponse"/>
      </operation> 
    </portType> 
    <sequence> 
      <element name="String_1" nillable="true" type="string"/> 
    </sequence> 
  </complexType> 
  <complexType name="sayHelloResponse"> 
    <sequence> 
    <element name="result" nillable="true" type="string"/> 
    </sequence> 
  </complexType> 
  <element name="sayHelloElement" type="tns:sayHello"/> 
  <element name="sayHelloResponseElement" 
    type="tns:sayHelloResponse"/> 
  </schema>
 </types> 
 <binding name="HttpSoap11Binding" type="tns:HelloServiceInf"> 
 <soap:binding style="document" 
      transport="http://schemas.xmlsoap.org/soap/http"/> 
 <operation name="sayHello">
   <soap:operation 
      soapAction="http://oracle.j2ee.ws/ejb/Hello:sayHello"/> 
   <input> 
     <soap:body use="literal" parts="parameters"/> 
   </input>
   <output> 
     <soap:body use="literal" parts="parameters"/> 
   </output> 
 </operation> 
 </binding> 
 <service name="HelloService"> 
   <port name="HttpSoap11" binding="tns:HttpSoap11Binding"> 
     <soap:address location="REPLACE_WITH_ACTUAL_URL"/> 
   </port>
</service>
</definitions>
如果你觀察這個(gè)WSDL,你會注意到它有一個(gè)對于HelloService web service的完整的描述,包括端口,操作和消息類型。WSDL是web service和它的客戶之間的合約,并且它能夠幫助自動生成客戶代理。
Web services平臺的另外兩項(xiàng)關(guān)鍵技術(shù)是SOAP,被用來調(diào)用web service的協(xié)議,和UDDI,它提供了用來定位web services 的注冊器。
對于這些技術(shù)的支持已經(jīng)完全被集成到J2EE平臺中了。讓我們關(guān)注一下J2EE對于web services的支持。
使用J2EE作為Web Services的平臺
J2EE 1.4為使用常規(guī)Java類或企業(yè)級Java Beans來創(chuàng)建和部署web services提供了一個(gè)全面的平臺。以下表格給出了J2EE 1.4中包括的web service APIs的細(xì)節(jié)。
 點(diǎn)擊查看大圖
定義在Java Community PRocess的JSR 101之下的JAX-RPC,提供了創(chuàng)建和訪問web services的Java API,因此它是使用J2EE平臺創(chuàng)建和部署web services的“心臟和靈魂”。通過向應(yīng)用程序開發(fā)者隱藏XML類型和Java類型映射的復(fù)雜性,以及處理XML和SOAP消息的底層細(xì)節(jié),它提供了一個(gè)簡單的,健壯的創(chuàng)建web services應(yīng)用的平臺。為了引入一個(gè)方法調(diào)用范式,它提供了兩種編程模式:服務(wù)器端模式,使用Java類或無狀態(tài)EJB開發(fā)web service 端點(diǎn),和客戶端模式,創(chuàng)建作為本地對象訪問web services的Java客戶端。JAX-RPC 1.1要求使用SOAP 1.1,并且實(shí)現(xiàn)與使用其他技術(shù)創(chuàng)建的web services之間的互操作性,比如微軟的.NET。實(shí)現(xiàn)了J2EE1.4規(guī)范的應(yīng)用服務(wù)器,比如OC4J 10.1.3和SUN的Java System Application Sever,提供了對于JAX-RPC的支持。
JAX-RPC的叫法有點(diǎn)用詞不當(dāng),因?yàn)樗戎С諶PC類型的web services,也支持文檔類型的web services。
Web Services部署模型
在J2EE 1.4之前,所有J2EE商家都使用他們私有的部署模型支持web services。J2EE 1.4為Java Web Services定義了部署模型。它為J2EE平臺上的web services制定了開發(fā),部署以及服務(wù)發(fā)布和使用的標(biāo)準(zhǔn)。
在這篇文章的后續(xù)部分,我將討論基于Java的web services的部署和使用的細(xì)節(jié)。
有了J2EE 1.4對web services的支持,讓我們學(xué)習(xí)使用J2EE平臺來建造web service的方法。
使用J2EE創(chuàng)建一個(gè)Web Service
把web service創(chuàng)建成一個(gè)輕便的和可互操作的分布式組件不是一項(xiàng)瑣碎的任務(wù)。如之前討論的,你既可以把常規(guī)Java類,也可以把無狀態(tài)EJB部署成web services。常規(guī)Java類被打包在一個(gè)web模塊中,而EJB web services被打包在標(biāo)準(zhǔn)的ejb-jar模塊中。
在這兩種部署選擇中,你會使用哪一個(gè)呢?
Java 類對無狀態(tài)EJB:永無止境的爭論
你會選擇常規(guī)Java類還是EJB作為你創(chuàng)建web service的技術(shù)可能是一個(gè)長期的爭論。Java類比EJB更容易開發(fā),它是純的Java對象,并且它不具有EJB帶來的“額外輜重”。但是,EJB提供了幾個(gè)很好的特點(diǎn),比如被聲明的事務(wù)和安全性,因此它使開發(fā)者將精力集中于建立商業(yè)邏輯,而不需要擔(dān)心基礎(chǔ)服務(wù)架構(gòu)。EJB 3.0大大簡化了設(shè)計(jì)模型,在它的規(guī)范中,EJB看起來就像常規(guī)Java類。
打包要求
無論你決定使用常規(guī)Java類還是EJB,你都必須把一些定義文件打包到你的WAR或ejb-jar中,這樣你才能將你的組件作為Java web service展示出來。下面是分別基于EJB和Java類的web service的打包結(jié)構(gòu):
基于EJB 的web service的ejb-jar:
/meta-inf/
    ejb-jar.xml    
    webservices.xml    
          oracle-webservices.xml    
    mapping-file.xml   
          wsdl/ wsdl 文件 
ejb classes (包括端點(diǎn)和bean類)
常規(guī)Java web service的web 應(yīng)用(.war)
/web-inf/
    web.xml 
    webservices.xml    
    oracle-webservices.xml    
    mapping-file.xml    
    wsdl/        the wsdl 文件     
    /classes/(包括端點(diǎn)和bean類)
    /lib/
讓我們討論每一個(gè)部署時(shí)的定義文件和描述符:
wsdl:如前所描述。
端點(diǎn)接口:web service端點(diǎn)必須實(shí)現(xiàn)java.rmi.Remote接口,并且在端點(diǎn)接口中的每一個(gè)方法都必須拋出java.rmi.RemoteException異常。這個(gè)端點(diǎn)需要注冊到模塊(ejb-jar.xml或web.xml)的標(biāo)準(zhǔn)部署描述符中。你的部署描述符(比如,ejb-jar.xml)需要包括如下條目:
<service-endpoint>
          oracle.ejb21.ws.HelloServiceInf
</service-endpoint>
如下是一個(gè)Hello World web service的端點(diǎn)的代碼:
public interface HelloServiceInf
                 extends java.rmi.Remote {
java.lang.String sayHello(java.lang.String name)
                    throws java.rmi.RemoteException;
}
web service部署描述符:J2EE平臺需要一個(gè)名叫webservices.xml的部署描述符。它指定了部署到J2EE應(yīng)用服務(wù)器所需的全部web service描述符,以及它們與容器資源和服務(wù)的依賴關(guān)系。同時(shí),它還指定了:WSDL的位置;mapping.xml,它包含了Java到WSDL的映射;和Hello World web service的服務(wù)端點(diǎn)接口。在Resources章節(jié)中給出了一個(gè)與示例代碼打包在一起的webservices.xml的例子。
商家規(guī)范部署描述符:一些實(shí)現(xiàn)規(guī)范參考,比如上下文根目錄和端點(diǎn)地址,不能在web service部署描述符中指定。取而代之,你應(yīng)該在商家規(guī)范部署描述符中指定它們。例如,如果你正使用OC4J,你將需要在WAR或ejb-jar中打包一個(gè)oracle-webservices.xml文件來定義那些屬性。
java-wsdl映射:這個(gè)文件定義了WSDL和Java類間的映射。映射文件沒有標(biāo)準(zhǔn)的名字;web services部署描述符決定了它的名字。
在把你的組件部署為web service之前,你必須把所有的定義文件打包到WAR或ejb-jar模塊中。有很多開發(fā)工具,比如Oracle JDeveloper,通過完成平凡的任務(wù),比如生成部署描述符,映射文件等,簡化了web service的開發(fā)。此外,大多數(shù)應(yīng)用服務(wù)器都提供了web services裝配工具,它們能夠滿足J2EE web service的打包要求。
除了理解組成一個(gè)web service的組件和相關(guān)的打包要求外,還有一些在你開發(fā)web service時(shí)必須解決的架構(gòu)問題。
構(gòu)建服務(wù)的途徑
創(chuàng)建一個(gè)web service時(shí)的主要挑戰(zhàn)是為服務(wù)確定合適的粒度。你可以新建一個(gè)服務(wù),也可以展示一個(gè)由Java類或EJB創(chuàng)建的已經(jīng)存在的組件并把它發(fā)布為一個(gè)服務(wù)。當(dāng)創(chuàng)建服務(wù)的時(shí)候,你可以使用自頂向下方法或自底向上方法:
自底向上方法:這個(gè)方法允許把一個(gè)現(xiàn)有的Java類或EJB發(fā)布為web service。這是很流行的創(chuàng)建服務(wù)的方法,因?yàn)樗鼓悴槐刂貙憫?yīng)用程序,而是重用你現(xiàn)有的商業(yè)邏輯。如果你使用這種方法,你必須為你的web service實(shí)現(xiàn)添加一個(gè)web service端點(diǎn)接口,同時(shí)創(chuàng)建一個(gè)WSDL,它同其他部署描述符一樣用來描述web service。由應(yīng)用服務(wù)器提供的工具,比如Oracle Application Server的web service裝配工具,通過生成WSDL,webservices.xml等描述符以及web services組件的映射文件使您的開發(fā)生活更加簡單――這把開發(fā)者從手工創(chuàng)造那些文件的痛苦中解放了出來。
自頂向下方法:這是創(chuàng)建服務(wù)的“純粹”的方法,它更適合于當(dāng)你根據(jù)草稿創(chuàng)建服務(wù)的時(shí)候。你從使用WSDL來描述服務(wù)開始,而不是直接跳入到實(shí)現(xiàn)。這個(gè)方法比自底向上方法更優(yōu)越,因?yàn)樵陂_發(fā)web service的同時(shí),由于對操作,信息和對WSDL的控制的仔細(xì)考慮,使得服務(wù)更容易使用,更可維護(hù)和更可互操作。一些J2EE廠商提供了工具使這種方法變得更容易,例如,Oracle Application Server的web services裝配器能夠生成接口,部署描述符以及你用來創(chuàng)建應(yīng)用程序的類框架。
互操作問題
顯然,你的web services在本質(zhì)上的可互操作性是必要的。J2EE 1.4要求與Basic Profile 1.0(由Web Services:Interoperability(WS-I)機(jī)構(gòu)指定)保持一致。當(dāng)創(chuàng)建web services時(shí),你必須在將它們部署到產(chǎn)品中之前測試它們的互操作性。
除了設(shè)計(jì)方法和服務(wù)互操作的需要,你可以遵循一些最優(yōu)方法來使你的web service效用最大化。
最優(yōu)方法
最佳實(shí)踐
這里有一些開發(fā)web services的最優(yōu)方法:
避免在你的應(yīng)用程序中過度使用web services。檢查你是否真的需要把你的應(yīng)用程序發(fā)布為web service。
服務(wù)的模塊性是很重要的。使用一個(gè)粗粒度的web service;例如:一個(gè)會話把你的商業(yè)邏輯封裝為web service。
確定你設(shè)計(jì)了你的web service,以使它制造最少的網(wǎng)絡(luò)通信量。
遵循WS-I基礎(chǔ)框架。使用JAX-RPC數(shù)據(jù)類型作為調(diào)用你的web service的方法的參數(shù),這樣可以使它具有與異類web services的互操作性。如果互操作性對于你的應(yīng)用程序來說很重要,那么請避免使用Collection,HashMap和List之類的數(shù)據(jù)類型作為你的web service的參數(shù)。
許多對于J2EE應(yīng)用的傳統(tǒng)最優(yōu)方法也同樣適用于web services。比如,避免把一個(gè)包含長時(shí)間事務(wù)的組件發(fā)布為web service。
權(quán)衡你的web service的安全需求和性能,因?yàn)榘踩孕枰叩拈_銷。一個(gè)端到端安全的web service所需的性能開銷是很高的。
J2EE藍(lán)圖應(yīng)用軟件Java Adventure Builder提供了一個(gè)很優(yōu)秀的用來創(chuàng)建基于Java 的web services 應(yīng)用的工具。
一旦一個(gè)web service完成了設(shè)計(jì),開發(fā)和部署,那么能與之提供的服務(wù)相交互的客戶端組件也會被隨之創(chuàng)建。
調(diào)用 Web Services
一個(gè)web service的客戶端可以是如下的任意一種:靜態(tài)樁,動態(tài)代理或者動態(tài)調(diào)用接口(DII)。
創(chuàng)建一個(gè)web service客戶端可能跟創(chuàng)建一個(gè)簡單的web service一樣復(fù)雜。幸運(yùn)的是,J2EE 1.4為開發(fā)者簡化了這一過程,你可以通過任何J2EE組件(即web客戶端或EJB組件)來使用web services。
通過如下過程,你可以像使用JNDI訪問其他任何資源一樣來調(diào)用web service:
在你的組件的部署描述符中定義一個(gè)service-ref元素。例如,如果你從一個(gè)web模塊來訪問HelloWorldService web service,那么該模塊的web.xml文件應(yīng)該包含如下:
<service-ref>        
<service-ref-name>service/HelloWorldService</service-ref-name>
<service-interface>oracle.ws.HelloWorldService</service-interface>
<wsdl-file>META-INF/HelloWorldService.wsdl</wsdl-file>
<service-qname>urn:oracle-ws</service-qname>
</service-ref>
為了使你的應(yīng)用程序能夠找到web service,你必須在你的商家規(guī)范部署描述符中指定web service 的位置。例如,如果你使用OC4J從你的網(wǎng)絡(luò)模塊來查詢web service,你的商家規(guī)范網(wǎng)絡(luò)描述符orion-web.xml必須包含如下內(nèi)容:
<service-ref-mapping name="service/HelloWorldService">
    <port-info>
      <wsdl-port namespaceURI="urn: HelloWorldService" 
                         localpart="HelloWorldServicePort"/>
    <stub-property>
         <name>javax.xml.rpc.service.endpoint.address</name>
         <value>http://localhost:8888/hello/HelloWorldInf</value>
    </stub-property>
   </port-info>
</service-ref-mapping>
在你的服務(wù)器中進(jìn)行部署之前,你必須把端點(diǎn)接口和類文件打包到你的應(yīng)用程序中。你可以通過JNDI查找來使用web service:
InitialContext ctx= new InitialContext();
HelloServiceInf hs = (HelloServiceInf)
             ctx.lookup("java:comp/env/service/HelloWorldService");
HelloWorld hello= hs.getHelloWorldServicePort();
String myhello = hs.sayHello("Debu Panda") ;
Java Web Services 的未來
正在形成的Web Services標(biāo)準(zhǔn)的推廣
Web services平臺已經(jīng)成長為具有可靠性,安全性,事務(wù)性,易管理性,政策性等特性的平臺。在web services領(lǐng)域有相當(dāng)一部分已經(jīng)出現(xiàn)或正在出現(xiàn)的標(biāo)準(zhǔn)。為了設(shè)計(jì)一套全新的Java API來推廣那些正在形成的標(biāo)準(zhǔn),在Java Community Process中有一些JSR正在完成中,下表列出了其中的一些JSR:

除了那些正在進(jìn)化的標(biāo)準(zhǔn),我們現(xiàn)在來領(lǐng)略一下下一代J2EE平臺的主要版本對于web services的支持。
使用J2EE 5.0簡化SOA的開發(fā)
使用J2EE創(chuàng)建面向服務(wù)的應(yīng)用程序確實(shí)很困難,因此通過使用由JSR 181定義的Web Services 元數(shù)據(jù)注解,J2EE 5.0將使開發(fā)更簡單。EJB 3.0和Web Services元數(shù)據(jù)具有相似的目標(biāo),就是向開發(fā)者提供親和力。
為了在J2EE 1.4中開發(fā)一個(gè)簡單的Java web service,你需要幾個(gè)web service定義文件:WSDL,映射文件和幾個(gè)冗長的標(biāo)準(zhǔn)以及私有的web services部署描述符。Web Services元數(shù)據(jù)規(guī)范使用一種類似于EJB 3.0的缺省配置方法來使開發(fā)更簡便。Web Services元數(shù)據(jù)注解處理器(或web services 裝配工具)會為你生成這些文件,因此你只需要關(guān)心類的實(shí)現(xiàn)。
當(dāng)你使用Web Services元數(shù)據(jù)開發(fā)時(shí),這是一個(gè)看起來如此簡單的Java web service:
package oracle.jr181.demo; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
@WebService(name = "HelloWorldService", 
      targetNamespace = "http://hello/targetNamespace" ) 
public class HelloWorldService {        
@WebMethod public String sayhello(String name ) { 
     return "Hello” +name+ “ from jws";
    }   
}
  
正如我之前提到的,EJB 3.0使用常規(guī)Java類簡化了EJB的開發(fā)。通過利用EJB 3.0和Web Services元數(shù)據(jù),開發(fā)基于EJB的web services將會變得越來越簡單。當(dāng)使用EJB 3.0和web services元數(shù)據(jù)時(shí),這是一個(gè)看起來如此簡單的HelloWorld EJB web service。你不必?fù)?dān)心創(chuàng)建WSDL,部署描述符等等,應(yīng)用服務(wù)器會在部署過程中生成這些定義文件。
package oracle.ejb30.ws;
import javax.ejb.Remote;
import javax.jws.WebService;
@WebService  
public interface HelloServiceInf extends java.rmi.Remote{
@WebMethod java.lang.String sayHello(java.lang.String name) 
                              throws java.rmi.RemoteException;
}
如下是EJB 3.0中 HelloWorld EJB的實(shí)現(xiàn)類:
package oracle.ejb30.ws;
import java.rmi.RemoteException;
import javax.ejb.Stateless;
@Stateless(name="HelloServiceEJB")
public class HelloServiceBean implements HelloServiceInf {
public String sayHello(String name) {
 return("Hello "+name +" from first EJB3.0 Web Service");
 }
}
以上例子清楚的表明了通過使用web services元數(shù)據(jù)和EJB 3.0,服務(wù)開發(fā)正在變得越來越簡單。
總結(jié)
在這篇文章中,你學(xué)習(xí)了使用J2EE平臺創(chuàng)建web services的基礎(chǔ)知識。現(xiàn)在,你可以在你最喜歡的實(shí)現(xiàn)了J2EE規(guī)范的應(yīng)用服務(wù)中,比如Oracle Application Server 10g,Sun Java System Application Server等,開始創(chuàng)建和部署你的web services了。
資源
本文中使用的web service例子
“如何從一個(gè)現(xiàn)有的Java類開發(fā)一個(gè)Web Service”(.zip):[下載文件]
“如何從一個(gè)WSDL文檔開發(fā)一個(gè)Web Service”(.zip):[下載文件]
“面向服務(wù)架構(gòu):Web Services之外” by Ted Farrell
“面向服務(wù)架構(gòu):部分1 & 2” by Samudra Gupta
“面向服務(wù)架構(gòu)是什么?” by Hao He
OTN Web Services技術(shù)中心
Debu Panda是Oracle Application Server開發(fā)小組的一個(gè)主要產(chǎn)品經(jīng)理。進(jìn)入討論組討論。
                     (出處:http://m.survivalescaperooms.com)