<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0

    共享 Web 服務

    developerWorks
    第?1?頁,共?11?頁 后一頁


    對本教程的評價

    幫助我們改進這些內容


    級別: 中級

    Nicholas Chase (ibmquestions@nicholaschase.com) Backstop Media

    2006 年 10 月 19 日

    面向服務的體系結構(Service-Oriented Architectures,SOA)當前強調的重點在 Web 服務上,但很容易被所傳播的各種信息搞得昏頭轉向。本系列教程將對主要 Web 服務規范進行全面說明,從簡單對象訪問協議(Simple Object Access Protocol,SOAP)一直介紹到 WS Business Process Execution Language (WS-BPEL)。在第 2 部分中,您將了解有關 Web 服務描述語言的內容,因為 Daily Moon Classified Department 需要使用 WSDL 來描述其 Web 服務,以便其他人能夠方便地從任何編程語言或平臺創建客戶機訪問此服務。

    開始之前

    本教程旨在幫助您了解 Web 服務描述語言 (Web Services Description Language)。本教程適合希望通過使用 WSDL 公開自己的服務供他人使用的開發人員,同時也適合擁有希望訪問的服務的 WSDL 而需要創建客戶機的開發人員。

    為了學習本教程,您應該具有 SOAP 的基本知識(可以通過閱讀本系列教程的第 1 部分了解 SOAP)和 XML 的基本知識。WSDL 與編程語言無關,但本教程最后的示例使用了 Java 和 Apache Axis2 項目。不過,其中的概念也適用于任何編程語言和環境。與此類似,本教程側重于通常實現的 WSDL 1.1,但即將推出的 WSDL 2.0 的概念也與此相同,本教程將對二者的基本差異進行說明。

    關于本系列

    本系列教程以假想的報社 Daily Moon 為例,為了提高在競爭激烈的環境中的工作效率,其員工將使用各種 Web 服務來創建工作流系統,我們將在此過程中講解各個 Web 服務基本概念。

    第 1 部分比較簡單,說明了 Web 服務背后的基本概念,并演示了如何使用 SOAP(后續教程討論的大部分內容的基礎規范)來將 Classifieds Department 連接到內容管理系統。

    在第 2 部分中,Classifieds Department 將開展進一步的工作:使用 Web 服務描述語言 (WSDL) 定義 Web 服務預期產生的消息,從而使團隊更方便地創建服務以及連接到服務的客戶機。

    在第 3 部分中,團隊希望準備一系列服務,并希望能方便地查找這些服務。與此對應,統一描述、發現和集成(Universal Description, Discovery and Integration,UDDI)提供了可用服務的可搜索注冊中心,以便使自己的服務為其他人所注意。

    第 4 部分和第 5 部分討論 WS-Security 和 WS-Policy,將詳細說明如何保證該報社的服務的安全,以及團隊為了訪問這些剛提供了安全保護的服務需要進行哪些更改。

    第 6 部分重點討論互操作性,因為必須從單個系統訪問來自幾個不同實現的服務。這一部分還將 WS-I 證書中涉及的要求和測試。

    最后,第 7 部分演示如何使用業務流程執行語言(Business Process Execution Language,WS-BPEL)來從各個服務創建復雜應用程序。

    接下來讓我們更為詳細地了解一下本教程中將討論的內容。





    回頁首


    關于本教程

    本系列的第 1 部分了解 Web 服務規范:SOAP 介紹了虛構的 Daily Moon 報社。具體來說,您了解了 Classifieds Department 所進行的工作。在該教程中,Classifieds Department 構建了一個客戶機來在表示內容管理系統的 Web 服務間發送 SOAP 消息。在本教程中,由于對所看到的結果印象深刻,Classifieds Department 決定構建自己的 Web 服務來接收和管理 classifieds 數據庫中的廣告。不過,為了允許其他人使用此服務,他們將需要創建 Web 服務描述語言 (WSDL) 文件。此文件將向構建客戶機提供說明,以便了解服務預期和返回的消息。

    在本教程中,您將了解以下內容:

    • WSDL 文件為何重要

    • 可以如何處理 WSDL 文件

    • XML 模式(出現在 WSDL 文件中)的基本知識

    • 如何設計 WSDL 文件的結構

    • WSDL 1.1 和 WSDL 2.0 的基本差異

    • 如何自動從表示服務的 Java 類自動生成 WSDL 文件

    • 如何從 WSDL 文件生成表示服務的 Java 類

    • 如何從 WSDL 文件生成 Web 服務客戶機

    Classifieds Department 將構建一個服務來接收新廣告、編輯和顯示現有廣告,還能結束一個主題,使其不再接受任何廣告。他們將同時使用請求/響應和單向消息傳遞。





    回頁首


    工具和先決條件

    本教程的大部分內容都是概念性的,但為了處理整個教程中的代碼,您將需要安裝以下軟件:

    Apache Geronimo 或其他應用服務器——團隊將在本教程中創建新 Web 服務,您將需要可在其上運行服務的應用程序。當然,由于 Web 服務應當可互操作,因此使用何種應用服務器并不重要。本教程演示了 Apache Geronimo 的用法,而此應用服務器也是 IBM 的 WebSphere Community Edition 的基礎。還可以使用 WebSphere Application Server 等其他應用服務器。您可以從以下網址下載 Apache Geronimo:http://geronimo.apache.org/downloads.html。有關安裝 Geronimo 的更多信息,請參見本系列的第一篇教程“了解 Web 服務規范,第 1 部分:SOAP”。

    Apache Axis2 的 0 .95 或更高版本——可以手動創建 SOAP 消息,也可以手動對其進行解釋,但手邊如果有一個可用實現就會方便得多。本教程將演示 Apache Axis2 的用法,其中包含了各種 SOAP 相關的 API,可極大地簡化您的工作。可以從以下網址下載 Apache Axis2:http://ws.apache.org/axis2/download.cgi。本教程使用的是 0.95 版,但應該也能使用更高版本。(請注意,在本系列教程的第 1 部分使用的是 0.94 版,但并未使用該版本對本部分的代碼進行測試。)

    Java 2 Standard Edition 的 1.4 或更高版本——所有這些工具都是基于 Java 的,本教程中將要構建的服務和客戶機也是如此。可以從以下網址下載 J2SE SDK:http://java.sun.com/j2se/1.5.0/download.jsp

    另外,還需要 Web 瀏覽器和文本編輯器,但我想您已經有了這兩個工具。如果愿意,還可以使用 Eclipse 之類的 IDE,但由于我們的重點是技術而不是工具,因此我將使用文本編輯器和命令行來編輯和編譯文件。





    回頁首

    概述

    在深入了解細節前,讓我們了解一下其總體概貌。

    Web 服務回顧

    相對于傳統編程方法而言,使用 Web 服務的主要優勢是互操作性。您可以創建一個分布式系統,讓分散在各個位置的計算機能夠進行通信,但在大多數情況下,您需要使用限制靈活性的專用中間件。也就是說,發送方和接收方都需要使用相同的軟件。

    Web 服務提供了基于文本(實際上是基于 XML)的方法來往返傳遞消息,這意味著應用程序不僅不依賴計算機,而且也不依賴于操作系統和編程語言。只要雙方遵循相同的 Web 服務標準,就不受各方運行何種軟件的影響。

    有多個用于傳輸此信息的標準,但本系列教程重點討論的是 SOAP,因為此標準非常靈活,而且能與更高級的標準結合使用。

    SOAP 知識鞏固

    SOAP 消息包括三個主要部分:Header、主體和有效負載(包含在主體中)。請看以下示例:


    清單 1. 示例 SOAP 消息
                        
        >SOAPenv:Envelope 
           xmlns:SOAPenv="http://schemas.xmlSOAP.org/SOAP/envelope/" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<
     >SOAPenv:Body<
      >req:getNumberOfArticles xmlns:req="http://daily-moon.com/CMS/"<
         >req:category<classifieds>/req:category<
      >/req:getNumberOfArticles<
     >/SOAPenv:Body<
    >/SOAPenv:Envelope<
    

    整個消息稱為信封,其內容由 Header 和主體組成。Header 包括有關消息本身的信息(如路由信息),或要由位于發送方和最終接收方之間可能對消息進行處理的“SOAP 中間層”或服務處理的信息。消息的主體中包含“有效負載”,其中包含傳遞給 Web 服務的實際數據。

    在本例中,有效負載為 getNumberOfArticles 元素及其內容。





    回頁首


    WSDL 的用途

    創建服務時,通常的原因都是因為希望其他人使用此服務。為了使用服務,需要知道向服務發送什么信息、服務將發送回什么信息以及在何處能找到此服務。當然,可以將這些放入字處理文檔中,但相比之下,如果此信息采用標準的、最好為人機均可讀的格式,則要有用得多。

    WSDL 就提供了這樣的標準格式。除了不會造成混淆不清外,其主要優勢是,由于 WSDL 是事實標準,且采用 XML 格式,因而可由計算機進行處理,便于自動創建客戶機(甚至自動創建服務的框架)。Classifieds Department 將要創建接受和管理 classified 廣告的服務,以允許其他人(如作業聚合網站)能更方便地使用此服務,他們同樣也將使用 WSDL 文件對其進行描述。





    回頁首


    本教程的任務

    在本教程中,您將逐步了解 Daily Moon Classifieds Department 的員工如何創建服務并將其公開給其他人使用,從而了解有關 WSDL 的知識。

    首先,Christine 將設計 XML 模式,其中定義可以在 SOAP 消息中出現的數據。接下來,Larry 形成實際 WSDL 文件的結構,以確定將往返傳遞何種信息。然后,Gene 拿到 WSDL 文件,以其為基礎設計表示服務的 Java 類,隨后,為了進一步確認,他使用 Axis2 從該 Java 類生成 WSDL 文件,以了解二者的差異。然后,Francis 得到此 WSDL 文件,使用其生成基本 Web 服務和訪問該服務的客戶機。

    現在讓我們開始吧。





    回頁首

    XML 模式簡要介紹

    Daily Moon 是一家相當小的報社,因此 Classifieds Department 無法承擔專用 DBA 帶來的相關支出。所以,Christine 總是將數據庫視為“自己的孩子”。了解了 WSDL 的規范后,她決定承擔起定義 SOAP 消息中可包含的數據的任務。

    驗證和選項

    在首次嘗試 Web 服務之后,員工已經熟悉了 XML,因此 Christine 下一步就要了解有關驗證的知識。

    XML 驗證是確保 XML 的結構和內容符合任何預先定義的要求的過程。最初的時候,這表示要符合文檔類型定義(Document Type Definition,DTD);DTD 是從 XML 的前身 SGML 語言保留下來的結構。DTD 并不是很難,但存在一些主要的缺點,缺乏靈活性、缺乏 XML 命名空間支持以及其他問題,因此 XML 社區轉而采用其他類型的 XML 模式。

    請注意,此處所說的“模式”不是特指的。在這里,我使用的是該術語的一般用法,即文檔的具體結構,而不是記錄此結構的任何語言。這些 XML 模式的最常見支持是 W3C XML Schema 語言,經常將此語言簡稱為 XML Schema。(注意首字母大寫。)

    Christine 知道將使用 XML Schema 構建其 WSDL 1.1 文檔,但注意到 WSDL 2.0 還特別支持其他模式,如 RELAX NG 和 Schematron,可以在此處使用這些模式。





    回頁首


    實例文檔

    Christine 首先從一個與進出系統的預期數據近似的示例文檔著手。她以數個現有廣告為基礎創建了以下 XML:


    清單 2. 實例文檔
                        
    Listing 2: the instance document
    <?xml version="1.0"?>
    <ClassifiedList>
    
       <ClassifiedAd adId="1138">
          <content>Vintage 1963 T-Bird.  Less than 300 miles.  
    Driven by my daughter until I took it away.  Serious inquires
    only. 555-3264 after 7 PM.</content>
          <endDate>4/15/2007</endDate>
          <startDate>4/1/2007</startDate>
       </ClassifiedAd>
    
       <ClassifiedAd adId="2187">
          <content>30 ft ladder, only used once.  Willing to let
    go for half its worth. Has slight dent near the middle.  
    Harder than a human head. $150 OBO.</content>
          <endDate>4/30/2007</endDate>
          <startDate>4/10/2007</startDate>
       </ClassifiedAd>
    
    </ClassifiedList>
    

    此文檔稱為“實例文檔”,代表 XML 模式所定義的數據。在本例中,它包括兩個作為 ClassifiedList 元素子項的 ClassifiedAd 元素。每個 ClassifiedAd 都包含一個 adId 屬性(此屬性與數據庫內的主鍵對應)、廣告內容以及廣告的開始和結束日期。

    她將此文檔命名為 classifieds.xml





    回頁首


    基本模式

    Christie 下一步將創建基本模式文檔,以便對系統進行測試。實際模式本身也是一個 XML 文檔,因此她創建了基礎文件 classifieds.xsd 和一個 schema 元素,如清單 3 中所示:


    清單 3. Schema 元素
                        
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    </xsd:schema>
    

    此元素將作為 Christine 創建的所有定義的父項。





    回頁首


    驗證文檔

    測試系統的下一步是形成一個簡單的 Java 應用程序,以根據模式驗證實例文檔。該類所需要進行的工作就是指定驗證并對文檔進行解析,如清單 4 中所示。


    清單 4. ValidateWithSchema 類
                        
    import java.io.File;
    import java.io.IOException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;
     
    public class ValidateWithSchema {
     
        public static void main(String args[]) {
    
            DocumentBuilderFactory dbf = 
                            DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
    
            dbf.setAttribute(
              "http://java.sun.com/xml/jaxp/properties/schemaLanguage", 
              "http://www.w3.org/2001/XMLSchema");
            dbf.setAttribute(
              "http://java.sun.com/xml/jaxp/properties/schemaSource",
              "classifieds.xsd");
    
            Document doc = null;
            try{        
               DocumentBuilder parser = dbf.newDocumentBuilder();
               doc = parser.parse("classifieds.xml");
            } catch (Exception e){
               e.printStackTrace();
            }
        }
    }
    

    實際進行解析的方法并不十分重要;在本例中,Christine 將使用 DOM 解析器構建應用程序。首先,構建一個工廠,然后指定其創建的所有解析器都應為“驗證解析器”。(并不會使用所有解析器進行驗證。有些僅驗證文檔是否“形式良好”,而不會驗證其實際結構。)

    接下來,指定要使用的模式語言以及模式文檔本身。在本例中,Christine 使用的是本地文件,但也可以使用任何可作為 URL 引用的文件。

    Christine 保存文件,并對其進行編譯,運行該文件后,她得到了以下輸出,如清單 5 中所示。


    清單 5. 運行空白模式
                        
    Warning: validation was turned on but an org.xml.sax.ErrorHandler 
    was not set, which is probably not what is desired.  Parser will 
    use a default ErrorHandler to print the first 10 errors.  Please call
    the 'setErrorHandler' method to fix this.
    
    Error: URI=file:///E:/WSDLFiles/classifieds.xml Line=2: cvc-elt.1: 
    Cannot find the declaration of element 'ClassifiedList'.
    

    Warning 并不重要;Christine 僅希望知道文件是否有效,因此她并不需要任何特定的錯誤處理功能。Error 很重要,因為這意味著分析器在實際查看模式和驗證實例文檔。

    接下來她需要添加實際的定義。





    回頁首


    創建簡單的元素

    定義最初的數個元素非常簡單。content, endDatestartDate 元素包含簡單的字符串,如清單 6 中所示。


    清單 6. 添加簡單的元素
                        
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
       <xsd:element type="xsd:string" name="content" />
       <xsd:element type="xsd:string" name="endDate" />
       <xsd:element type="xsd:string" name="startDate" />
    
    </xsd:schema>
    

    在本例中,Christine 定義了三個僅包含文本的元素(與其他元素相對)作為內容。同樣,它們都不具有任何屬性。XML Schema 推薦標準定義了一系列可用于定義內容的不同類型。例如,可以指定 endDatestartDate 值必須為 datetime 類型的值。





    回頁首


    創建更為復雜的元素

    當然,如果所有元素都這樣簡單,您可能根本不需要模式了。Christine 將繼續定義 ClassifiedList 元素(請參見清單 7)。


    清單 7. 定義 ClassifiedList 元素
                        
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    <xsd:element name="ClassifiedList">
       <xsd:complexType>
    
          <xsd:sequence>
             <xsd:element name="ClassifiedAd" maxOccurs="unbounded"
                                           type="ClassifiedAdType"/>
          </xsd:sequence>
    
       </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="ClassifiedAdType">
       <xsd:sequence>
           <xsd:element type="xsd:string" name="content" />
           <xsd:element type="xsd:string" name="endDate" />
           <xsd:element type="xsd:string" name="startDate" />
       </xsd:sequence>
    </xsd:complexType>
    
    </xsd:schema>
    

    首先看最下面,Christine 創建了 ClassifiedAdType complexType。這種元素類型按順序包含以下內容:一個 content 元素、一個 endDate 元素和一個 startDate 元素。回到最上面,她定義 ClassifiedList 元素包含一個元素,而此元素還包含一系列元素。不過,在本例中,它包含零個或更多 ClassifiedAdType 類型的元素,所有這些元素均命名為 ClassifiedAd

    到目前為止,僅通過這兩個定義,她就已覆蓋了文檔結構的大部分。現在需要做的就是為 adId 屬性添加定義。





    回頁首


    添加屬性

    屬性在 complexType 元素中定義,如清單 8 中所示。


    清單 8. 添加屬性,不過她還可以創建限制性更多的類型。
                        
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    <xsd:element name="ClassifiedList">
       <xsd:complexType>
          <xsd:sequence>
             <xsd:element name="ClassifiedAd" maxOccurs="unbounded"
     type="ClassifiedAdType"/>
          </xsd:sequence>
       </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="ClassifiedAdType">
       <xsd:sequence>
           <xsd:element type="xsd:string" name="content" />
           <xsd:element type="xsd:string" name="endDate" />
           <xsd:element type="xsd:string" name="startDate" />
       </xsd:sequence>
       <xsd:attribute name="adId" type="xsd:integer" />
    </xsd:complexType>
    
    </xsd:schema>
    

    在本例中,Christine 將 adId 屬性的內容限制為整數。不過,她還可以創建限制更多的類型。





    回頁首


    使用 simpleTypes

    XML Schema 提供了強大的功能,用以處理您的文檔可能包含的實際內容。例如,Christine 可以指定 adId 屬性一定只能包含大于或等于 1000 的整數(請參見清單 9)。


    清單 9. 限制值
                        
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    ...
    
    <xsd:complexType name="ClassifiedAdType">
       <xsd:sequence>
           <xsd:element type="xsd:string" name="content" />
           <xsd:element type="xsd:string" name="endDate" />
           <xsd:element type="xsd:string" name="startDate" />
       </xsd:sequence>
       <xsd:attribute name="adId" type="thousandOrGreater" />
    </xsd:complexType>
    
    <xsd:simpleType name="thousandOrGreater">
      <xsd:restriction base="xsd:integer">
          <xsd:minInclusive value="1000"/>
      </xsd:restriction>
    </xsd:simpleType>
    
    </xsd:schema>
    

    這個定義并不涉及任何元素,因此 Christine 使用了 simpleType 而不是 complexType。她為定義為整數的基本類型創建了一個 restriction(一種對數據類型的限制)。她為該 restriction 添加了一個“facet”,指定最小值為 1000。XML Schema 定義了大量的此類 facet 以供使用。創建了此類型后,她就可以在屬性定義中對其進行引用了。因為已經定義了數據,Christine 隨后將此模式交給 Larry,供他用于構建實際的 WSDL。





    回頁首

    posted on 2006-12-29 19:04 SIMONE 閱讀(1415) 評論(0)  編輯  收藏 所屬分類: AXISJAVA
    主站蜘蛛池模板: 亚洲精品一二三区| 亚洲日韩乱码久久久久久| 国产美女无遮挡免费网站| 国产成人在线免费观看| 国产成人精品日本亚洲11| 黄色毛片免费在线观看| 很黄很污的网站免费| 无码专区永久免费AV网站| 国产免费人视频在线观看免费| 亚洲av无码专区在线播放| 国产精品久久亚洲不卡动漫 | 亚洲高清免费视频| 免费观看激色视频网站(性色) | 国产禁女女网站免费看| 亚洲成a人片在线观看天堂无码| 一级全免费视频播放| 国产一精品一AV一免费孕妇| 亚洲人成色777777在线观看| 久久精品国产亚洲av麻豆蜜芽 | 18女人腿打开无遮掩免费| 亚洲熟女乱综合一区二区| 亚洲免费人成视频观看| 国内精品久久久久影院免费| 亚洲福利在线视频| 国产精品高清免费网站 | 久久久www成人免费毛片| 亚洲妇女无套内射精| 久久99亚洲综合精品首页| 亚洲AV无码一区二区三区电影 | 歪歪漫画在线观看官网免费阅读| 亚洲国产乱码最新视频| 亚洲精品高清在线| 亚洲熟女综合一区二区三区| 亚欧人成精品免费观看| 亚洲日韩看片无码电影| 手机在线看永久av片免费| 亚洲AV无码资源在线观看| 久久久久国产成人精品亚洲午夜 | 亚洲日韩中文无码久久| 日本免费网站视频www区| 日韩亚洲综合精品国产|