天天看點

Web Service開發實戰

Web Service開發       開發Web Service的兩種方法:

  • 建立WSDL檔案, 從WSDL檔案生成代碼.(本文的方式)
  • 從POJO(Plain Old Java Object)開始,注釋POJO,通過注釋自動建立WSDL檔案,同時生成相關代碼.(<<Web Service Eclipse CXF內建.doc>>中描述的就是從POJO開始開發的方法.)

實戰服務設計

  • 圖書訂單Service

      服務的輸入圖書訂單(BookOrder)

      服務的輸出(BookOrderResponse).

  • 圖書訂單(BookOrder)的資訊:

      accountName              帳号名

      accountNumber            帳号

      shipAddress              發貨位址

      billAddress              帳單位址

      book                     圖書訂單

      total                    總價

      圖書的資訊book包括:

            Title              書名

            Quantity           訂單數目

            wholesale-price    批發價

      發貨位址和帳單位址類型的基礎類型為Address包括:

            Name               位址名稱

            Street             街道(可以多行)

            City               城市

            Country            國家

     派生的位址類别UKAddress還包括:

            Postcode           郵政編碼

     派生的位址類别USAddress還包括:

            State             州

            Zip               郵政編碼

     限制的位址BriefUSAddress隻包括下面資訊(限制于USAddress):

            Name              名字

            Street            街道

            Zip               郵政編碼

  • 服務的輸出

      圖書訂單傳回(BookOrderResponse)的資訊:

            Return             傳回的狀态(成功或者失敗)

            Returninfo         傳回的資訊(可以多行)

圖書訂單服務的WSDL

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions name="cxfstp04Service" targetNamespace="http://www.example.org/cxfstp04/" xmlns:ns1="http://www.example.org/cxfstp04/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

<wsdl:types>

<xsd:schema targetNamespace="http://www.example.org/cxfstp04/">

    <xsd:element name="BookOrder" type="ns1:BookOrder"/>

    <xsd:element name="BookOrderResponse" type="ns1:BookOrderResponse"/>

      <xsd:complexType name="Address">

         <xsd:sequence>

            <xsd:element name="name" type="xsd:string"></xsd:element>

            <xsd:element name="street" type="xsd:string"

                maxOccurs="unbounded">

            </xsd:element>

            <xsd:element name="city" type="xsd:string"></xsd:element>

            <xsd:element name="country" type="xsd:string"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

      <xsd:complexType name="Book">

         <xsd:sequence>

            <xsd:element name="title" type="xsd:string"></xsd:element>

            <xsd:element name="quantity" type="xsd:unsignedShort"></xsd:element>

            <xsd:element name="wholesale-price" type="xsd:float"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

      <xsd:complexType name="UKAddress">

              <xsd:complexContent>

                 <xsd:extension base="ns1:Address">

                     <xsd:sequence>

                        <xsd:element name="postcode"

                            type="xsd:string">

                        </xsd:element>

                     </xsd:sequence>

                 </xsd:extension>

              </xsd:complexContent>

      </xsd:complexType>

      <xsd:complexType name="USAddress">

              <xsd:complexContent>

                 <xsd:extension base="ns1:Address">

                     <xsd:sequence>

                        <xsd:element name="state"

                            type="xsd:string">

                        </xsd:element>

                        <xsd:element name="zip"

                            type="xsd:string">

                        </xsd:element>

                     </xsd:sequence>

                 </xsd:extension>

              </xsd:complexContent>

      </xsd:complexType>

      <xsd:complexType name="BriefUSAddress">

        <xsd:complexContent>

            <xsd:restriction base="ns1:USAddress">

                <xsd:sequence>

                   <xsd:element name="name" type="xsd:string">

                   </xsd:element>

                   <xsd:element name="street" type="xsd:string">

                   </xsd:element>

                   <xsd:element name="zip" type="xsd:string">

                   </xsd:element>

                </xsd:sequence>

            </xsd:restriction>

         </xsd:complexContent>

      </xsd:complexType>

      <xsd:simpleType name="Total">

         <xsd:restriction base="xsd:float">

            <xsd:maxExclusive value="100000"></xsd:maxExclusive>

            <xsd:minExclusive value="0"></xsd:minExclusive>

            <xsd:pattern value="[0-9]+\.[0-9]{2}"></xsd:pattern>

         </xsd:restriction>

      </xsd:simpleType>

      <xsd:complexType name="BookOrder">

              <xsd:sequence>

                 <xsd:element name="accountName" type="xsd:string"></xsd:element>

                 <xsd:element name="accountNumber"

                     type="xsd:unsignedShort">

                 </xsd:element>

                 <xsd:element name="shipAddress"

                     type="ns1:Address">

                 </xsd:element>

                 <xsd:element name="billAddress"

                     type="ns1:Address">

                 </xsd:element>

                 <xsd:element name="book" type="ns1:Book"></xsd:element>

                 <xsd:element name="total" type="ns1:Total"></xsd:element>

              </xsd:sequence>

              <xsd:attribute name="orderDate" type="xsd:date"></xsd:attribute>

        </xsd:complexType>

    <xsd:complexType name="BookOrderResponse">

       <xsd:sequence>

           <xsd:element minOccurs="0" name="return" type="xsd:string"/>

           <xsd:element name="returninfo" type="xsd:string" maxOccurs="unbounded"/>

       </xsd:sequence>

    </xsd:complexType>

</xsd:schema>

</wsdl:types>

<wsdl:message name="BookOrderResponse">

    <wsdl:part name="result" element="ns1:BookOrderResponse">

    </wsdl:part>

</wsdl:message>

<wsdl:message name="BookOrder">

    <wsdl:part name="parameters" element="ns1:BookOrder">

</wsdl:part>

</wsdl:message>

<wsdl:portType name="OrderBook">

    <wsdl

Web Service開發實戰

peration name="OrderBookOper">

      <wsdl:input name="BookOrder" message="ns1:BookOrder">

      </wsdl:input>

      <wsdl

Web Service開發實戰

utput name="BookOrderResponse" message="ns1:BookOrderResponse">

      </wsdl

Web Service開發實戰

utput>

    </wsdl:operation>

</wsdl:portType>

<wsdl:binding name="cxfstp04ServiceBinding" type="ns1:OrderBook">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="OrderBookOper">

      <soap:operation soapAction="" style="document"/>

      <wsdl:input name="BookOrder">

        <soap:body use="literal"/>

      </wsdl:input>

      <wsdl:output name="BookOrderResponse">

        <soap:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

</wsdl:binding>

<wsdl:service name="cxfstp04Service">

    <wsdl:port name="OrderBookPort" binding="ns1:cxfstp04ServiceBinding">

      <soap:address location="http://localhost:9090/OrderBook"/>

    </wsdl:port>

</wsdl:service>

</wsdl:definitions>

Eclipse WSDL設計

Web Service開發實戰
Web Service開發實戰
Web Service開發實戰

圖書訂單服務Schema描述

WSDL定義

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions name="cxfstp04Service" targetNamespace="http://www.example.org/cxfstp04/" xmlns:ns1="http://www.example.org/cxfstp04/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

<wsdl:types>

<xsd:schema targetNamespace="http://www.example.org/cxfstp04/">

    <xsd:element name="BookOrder" type="ns1:BookOrder"/>

    <xsd:element name="BookOrderResponse" type="ns1:BookOrderResponse"/>

</xsd:schema>

位址類型Address(通用類型),包括的元素:
  • 名字name
  • 街道street(街道出現次數沒有限制)
  • 城市city
  • 國家country

<xsd:complexType name="Address">

         <xsd:sequence>

            <xsd:element name="name" type="xsd:string"></xsd:element>

            <xsd:element name="street" type="xsd:string"

                maxOccurs="unbounded">

            </xsd:element>

            <xsd:element name="city" type="xsd:string"></xsd:element>

            <xsd:element name="country" type="xsd:string"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

美國位址類型(派生于Address),添加下面的元素:
  • 州state
  • 郵編zip
是以USAddress 類型一共包含6個元素(name, street, city, state, country和zip).

  <xsd:complexType name="USAddress">

              <xsd:complexContent>

                 <xsd:extension base="ns1:Address">

                     <xsd:sequence>

                        <xsd:element name="state"

                            type="xsd:string">

                        </xsd:element>

                        <xsd:element name="zip"

                            type="xsd:string">

                        </xsd:element>

                     </xsd:sequence>

                 </xsd:extension>

              </xsd:complexContent>

      </xsd:complexType>

簡略美國位址類型(限制于USAddress),包括的元素:
  • 名字name
  • 街道street
  • 郵編zip
BriefUSAddress将簡化美國位址類型,隻包括name,street和zip這三個元素

<xsd:complexType name="BriefUSAddress">

        <xsd:complexContent>

            <xsd:restriction base="ns1:USAddress">

                <xsd:sequence>

                   <xsd:element name="name" type="xsd:string">

                   </xsd:element>

                   <xsd:element name="street" type="xsd:string">

                   </xsd:element>

                   <xsd:element name="zip" type="xsd:string">

                   </xsd:element>

                </xsd:sequence>

            </xsd:restriction>

         </xsd:complexContent>

      </xsd:complexType>

英國位址:(派生于Address),添加下面的元素:
  • 郵編postcode
是以UKAddress類型一共包含5個元素(name, street, city, state, and postcode).

<xsd:complexType name="UKAddress">

              <xsd:complexContent>

                 <xsd:extension base="ns1:Address">

                     <xsd:sequence>

                        <xsd:element name="postcode"

                            type="xsd:string">

                        </xsd:element>

                     </xsd:sequence>

                 </xsd:extension>

              </xsd:complexContent>

      </xsd:complexType>

書:包括元素:
  • 标題title
  • 數量quantity
  • 批發價格

  <xsd:complexType name="Book">

         <xsd:sequence>

            <xsd:element name="title" type="xsd:string"></xsd:element>

            <xsd:element name="quantity" type="xsd:unsignedShort"></xsd:element>

            <xsd:element name="wholesale-price" type="xsd:float"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

總價(簡單類型)
  • 基于xsd:float
  • 值大于0小于100000
  • 格式#####.##

<xsd:simpleType name="Total">

         <xsd:restriction base="xsd:float">

            <xsd:maxExclusive value="100000"></xsd:maxExclusive>

            <xsd:minExclusive value="0"></xsd:minExclusive>

            <xsd:pattern value="[0-9]+\.[0-9]{2}"></xsd:pattern>

         </xsd:restriction>

</xsd:simpleType>

訂單,包括元素
  • 帳号名accountName
  • 帳号accountNumber
  • 郵寄位址shipAddress
  • Billing位址billAddress
  • 書book
  • 總價total
其中郵寄位址和Billing位址将采用多态的方式,在執行個體的時候确定具體的類型

   <xsd:complexType name="BookOrder">

              <xsd:sequence>

                 <xsd:element name="accountName" type="xsd:string"></xsd:element>

                 <xsd:element name="accountNumber"

                     type="xsd:unsignedShort">

                 </xsd:element>

                 <xsd:element name="shipAddress"

                     type="ns1:Address">

                 </xsd:element>

                 <xsd:element name="billAddress"

                     type="ns1:Address">

                 </xsd:element>

                 <xsd:element name="book" type="ns1:Book"></xsd:element>

                 <xsd:element name="total" type="ns1:Total"></xsd:element>

              </xsd:sequence>

              <xsd:attribute name="orderDate" type="xsd:date"></xsd:attribute>

        </xsd:complexType>

訂單傳回,包括元素
  • 傳回結果(成功或者失敗)
  • 傳回資訊(沒有限制字元串,模拟多個傳回資訊)

    <xsd:complexType name="BookOrderResponse">

       <xsd:sequence>

           <xsd:element minOccurs="0" name="return" type="xsd:string"/>

           <xsd:element name="returninfo" type="xsd:string" maxOccurs="unbounded"/>

       </xsd:sequence>

    </xsd:complexType>

圖書訂單服務執行個體

輸入
  • xsi:type 屬于XML schema-instance命名空間,告訴解析器根據派生後的類型validate元素
  • 定義了一些屬性,包括xsi:schemaLocation和xsi:type,這裡的xsi:schemaLocation的含義:幫助XML處理程式确定XML文檔執行個體使用的實際實體模式文檔的位置,意思是:用po2.xsd來驗證http://www.Monson-Haefel.com/jwsbook這個命名空間

        <ns2:BookOrder xmlns:ns2="http://www.example.org/cxfstp04/" orderDate="2007-09-08Z">

         <accountName>Amazon.com</accountName>

         <accountNumber>923</accountNumber>

         <shipAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:UKAddress">

            <name>Amazon.co.uk</name>

            <street>line1: Ridgmont Road</street>

            <street>line2: Ridgmont Road</street>

            <city>Bedford</city>

            <country>United Kingdom</country>

            <postcode>MK43 0ZA</postcode>

         </shipAddress>

         <billAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:BriefUSAddress">

            <name>Amazon.com</name>

            <street>line1: 1516 2nd Ave</street>

            <street>line2: 1516 2nd Ave</street>

            <street>line3: 1516 2nd Ave</street>

            <zip>90952</zip>

         </billAddress>

         <book>

            <title>Java Web Services</title>

            <quantity>300</quantity>

            <wholesale-price>24.99</wholesale-price>

         </book>

         <total>8997.0</total>

      </ns2:BookOrder>

轉載于:https://www.cnblogs.com/Thomson-Blog/articles/1334967.html