青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181, 文章 - 2, 評論 - 85, 引用 - 0
數據加載中……

IBM WebSphere 開發(fā)者技術期刊: 使用服務組件體系結構構建 SOA 解決方案——第 1 部分-----太棒了,出現了另一個編程模型?

隨著 IBM? WebSphere Integration Developer 和 WebSphere Process Server 的發(fā)布,出現了一種用于構建面向服務的體系結構 (SOA) 的新編程范式,稱為服務組件體系結構,它是為在 SOA 中構建和組裝業(yè)務解決方案而專門設計的一個新編程模型,旨在集成和組合服務。

摘自 IBM WebSphere 開發(fā)者技術期刊

引言

您可能認為,這太棒了,又出現了一個編程模型,但事實并非如此。Web 服務怎么樣了?Enterprise JavaBeans 發(fā)生了什么?服務組件體系結構 (SCA) 并非要替換任何現有的編程模型或者與其抗衡。相反,SCA 向您提供一個以與技術無關的方式定義接口、實現和引用的模型,從而使您能夠將這些元素綁定到所選擇的某一技術的特定實現。

例如,我們可以用 Java 定義我們的接口,將我們的實現作為 BPEL 流程加以應用,或者將接口作為一個 WSDL 文檔,而且我們的實現可以是一個 Java? 類。圖 1 演示了如何在 IBM WebSphere Process Server 中使用 SCA。


圖 1. WebSphere Process Server 中的 SCA
圖 1. WebSphere Process Server 中的 SCA

使用 WebSphere Process Server,集成開發(fā)人員可以擁有各種不同的現成實現技術,并且可以采用開放標準(如通過 Java 或者 WSDL)來公開接口。此外,SCA 還提供了一個客戶機編程模型,通過該模型,客戶機可以訪問服務組件。這使得開發(fā)人員可以繼續(xù)使用他們熟悉的各種技術(如 Enterprise JavaBeans? (EJB))進行開發(fā),并且使用 SCA 將這些組件連接在一起。

SCA 的另一個主要部分是它還定義了一個標準模型,用于定義組件之間的依賴項。因此,通過使用引用連接 SCA 組件,可以定義依賴項。


圖 2. 定義組件之間的依賴項
圖 2. 定義組件之間的依賴項

最后,SCA 定義了一個標準的部署模型,用于將組件打包到服務模塊。可以定義 SCA 組件以及與其相關聯的依賴項,并且將它們打包到部署單元。


圖 3. 與依賴項一起打包的組件
圖 3. 與依賴項一起打包的組件

SCA 模塊并非只是另一種類型的包。在 WebSphere Process Server 中,SCA 服務模塊等同于一個 J2EE EAR 文件和許多其他 J2EE 子模塊。J2EE 元素(如 WAR 文件)可以與 SCA 模塊一起打包。非 SCA 構件(JSP 以及其他構件)也可以同 SCA 服務模塊打包在一起,這使得它們可以使用一種稱為獨立引用的特殊類型的引用,來通過 SCA 客戶機編程模型調用 SCA 服務。


圖 4. 用于非 SCA 構件的獨立引用
圖 4. 用于非 SCA 構件的獨立引用

SCA 與集成有著緊密的聯系;我們將上述引用作為一種定義 SCA 組件之間的依賴項的方式進行了描述。例如,我們可以定義對同一個模塊內的另一個 SCA 組件的引用。當使用引用調用同一個模塊內的服務組件時,數據通過引用進行傳遞。SCA 定義了調用組件或其他 SCA 服務(位于其他 SCA 模塊內)的方式。

用于模塊到模塊和模塊到外部服務調用的這兩種機制稱為導入導出

導入和導出是從模塊的角度表述的。模塊是一組執(zhí)行特定業(yè)務功能的自包含 (self-contained) 組件。

當模塊需要向另一個實體(外部服務或其他模塊)提供功能來調用業(yè)務功能時,它將導出該功能。導出使得可以通過多種不同的傳輸協議來使用此服務。導出與模塊內的某個特定組件相關聯。

當模塊需要利用另一個實體(外部服務或模塊)的功能時,模塊將導入該功能。導入還提供了通過多種傳輸協議與服務提供者交互的功能。

圖 5 闡釋了這些概念。


圖 5. SCA 導入和導出
圖 5. SCA 導入和導出

導入和導出是抽象概念。它們需要綁定到某一特定技術。WebSphere Process Server V6.0 中提供的綁定類型有:

  • SCA(用于 SCA 模塊到模塊)
  • Web 服務
  • JMS
  • 無狀態(tài)會話 Bean。

當通過導入和導出調用 SCA 組件時,參數通過值進行傳遞。


圖 6. SCA 導入和導出
圖 6. SCA 導入和導出

連接 SCA 組件的網絡將大部分基礎結構級別的代碼抽象出來。例如,我們可以將網絡定義為同步或異步,將操作定義為單向或請求-響應,我們也可以定義組件之間的事務行為。SCA 為您處理基礎結構方面的細節(jié)。我們將在這一系列文章中對這些細節(jié)進行更詳細的描述。

導入和導出還可以綁定到其他技術,例如 JMS、Enterprise JavaBean 或者 Web 服務。這樣,Web 服務客戶機就可以調用 SCA 模塊,而 SCA 模塊就可以使用 SCA 編程模型調用現有的 Enterprise JavaBean。


圖 7. 使用其他技術的導入和導出
圖 7. 使用其他技術的導入和導出

我們將在本系列的后續(xù)文章中討論導入和導出。

數據方面的情況如何?

SCA 向我們提供了一個用于定義業(yè)務服務的通用模型。服務數據對象 (SDO) 提供了一種用通用模型來表示數據的方法。可以將 SCA 組件組合在一起,并且通過傳遞 SDO 來以一種中立的方式相互交換數據。SDO 體系結構中的基本概念是數據對象,它是用于存放基元類型的數據和/或其他數據對象的數據結構。數據對象還存放對元數據的引用,元數據提供有關包含在數據對象中的數據的信息。

在 SDO 編程模型中,數據對象是以 commonj.sdo.DataObject Java 接口定義表示的。該接口包含方法定義,通過方法定義,客戶機可以獲取和設置與數據對象相關聯的屬性。SDO 體系結構中的另一個重要概念是數據圖,它是封裝一組數據對象的結構。對于包含在數據圖中的頂層數據對象,可以從根數據對象開始遍歷引用來到達所有子數據對象。數據圖中的另一個重要功能是更改摘要,用于記錄關于在處理過程中已經更改的圖中的數據對象和屬性的信息。(有關 SDO 的詳細信息,請參閱參考資料。)

WebSphere Process Server 通過業(yè)務對象實現 SDO 規(guī)范。SCA 組件可以通過傳遞業(yè)務對象來交換數據,如圖 8 所示。


圖 8. WebSphere Process Server 業(yè)務對象
圖 8. WebSphere Process Server 業(yè)務對象

與 SDO 包裝在數據圖中一樣,業(yè)務圖用于包裝頂層業(yè)務對象,并且提供用來補充包含在圖中的數據的附加信息。具體來說,業(yè)務圖包括圖中數據的更改摘要(類似于 SDO 更改摘要信息)、事件摘要和謂詞信息(用于 EIS 系統之間的數據同步)。業(yè)務圖與 SDO 體系結構中的數據圖的概念非常相似。然而,新增信息的事件摘要和謂詞部分沒有包含在 SDO 數據圖概念中。







SCA 101

既然我們已經概括地介紹了 SCA,就可以通過一個示例來討論某些具體細節(jié)。在構建示例的過程中,我們將對 IBM WebSphere Integration Developer 進行概述,您可以使用該工具來以可見的方式構建和集成 SCA 組件。

概述

為了演示 SCA 和業(yè)務對象的各個方面,我們將討論與一個業(yè)務案例有關的這些概念。與所有開發(fā)工作一樣,開發(fā)周期必須從需求開始。該場景中的需求包括創(chuàng)建信用審批服務,該服務將接收關于申請者 (CreditApplication) 的信息,并通過信用等級 (CreditRating) 進行響應。

SCA 中最簡單的部分是服務組件。如前所述,服務組件是由一個接口和一個實現構成的。用來“編碼”這些構件的技術可以有所不同;在 WebSphere Process Server 中,接口可以是 Java 或者 WSDL。Java 接口可以是 Plain Old Java Interface (POJI),如下所示:


清單 1
												
																		
public interface CreditRequest
{

	public DataObject calulateCreditScore(DataObject creditApp)
			throws ServiceBusinessException;

}
												
										

如果您使用 Java 實現,則可以創(chuàng)建一個簡單的 POJO。下面是一個用作 SCA 實現的 POJO 的示例:


清單 2
												
																		
public class CreditApprovalImpl implements CreditRequest {
	
	public DataObject calulateCreditScore(DataObject creditApp) {
		
		ServiceManager serviceManager = new ServiceManager();

		BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");

		DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");

		
		creditRating.setString("customerId", creditApp.getString("customerId"));
		
		creditRating.setInt("creditScore", 750);
		creditRating.setDouble("creditLimit", 10000d);
				
		return creditRating;
	}

}
												
										

在這個實現類中,我們使用 CreditApplication 輸入創(chuàng)建一個簡單的 CreditRating 業(yè)務對象,然后我們將該業(yè)務對象返回到調用程序。

服務組件是在服務組件定義語言(Service Component Definition Language,SCDL)文件中定義的。使用 SCDL 創(chuàng)建的組件文件與 EJB 部署描述符有些類似,這是因為它定義了接口、實現和 SCA 組件的多個服務質量需求。上述 Java 類的 SCDL 文件如下所示:


清單 3
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:ns1="http://CreditApproval/CreditRequest" 
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" 
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" 
displayName="CreditApproval" name="CreditApproval">
  <interfaces>
    <interface xsi:type="java:JavaInterface" interface="CreditRequest " >
      <method name="calulateCreditScore"/>
    </interface>
  </interfaces>
  <implementation xsi:type="java:JavaImplementation" class=" CreditApprovalImpl"/>
</scdl:component>
												
										

類似地,我們可以使用 WSDL 表示接口,如下所示:


清單 4
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:bons1="http://CreditApproval" 
xmlns:tns="http://CreditApproval/CreditRequest" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditRequest" 
targetNamespace="http://CreditApproval/CreditRequest">
  <wsdl:types>
    <xsd:schema targetNamespace="http://CreditApproval/CreditRequest" 
	xmlns:bons1="http://CreditApproval" 
	xmlns:tns="http://CreditApproval/CreditRequest" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="http://CreditApproval" 
schemaLocation="xsd-includes/http.CreditApproval.xsd"/>
      <xsd:element name="calulateCreditScore">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="CreditApp" nillable="true" 
type="bons1:CreditApp"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="calulateCreditScoreResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="CreditRating" nillable="true" 
type="bons1:CreditRating"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>
    <wsdl:message name="calulateCreditScoreRequestMsg">
    <wsdl:part element="tns:calulateCreditScore" 
name="calulateCreditScoreParameters"/>
  </wsdl:message>
    <wsdl:message name="calulateCreditScoreResponseMsg">
    <wsdl:part element="tns:calulateCreditScoreResponse" 
name="calulateCreditScoreResult"/>
  </wsdl:message>
    <wsdl:portType name="CreditRequest">
    <wsdl:operation name="calulateCreditScore">
      <wsdl:input message="tns:calulateCreditScoreRequestMsg" 
name="calulateCreditScoreRequest"/>
      <wsdl:output message="tns:calulateCreditScoreResponseMsg" 
name="calulateCreditScoreResponse"/>
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>
												
										

實現類可能與之相同(唯一不同的是,它顯然沒有實現任何 Java 接口,因為它定義為 WSDL)。

我們的 SCDL 文件可以將接口綁定到 WSDL 文檔:


清單 5
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:ns1="http://CreditApproval/CreditRequest" 
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" 
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" 
displayName="CreditApproval" name="CreditApproval">
  <interfaces>
    <interface xsi:type="wsdl:WSDLPortType" portType="ns1:CreditRequest">
      <method name="calulateCreditScore"/>
    </interface>
  </interfaces>
  <implementation xsi:type="java:JavaImplementation" class="CreditApprovalImpl"/>
</scdl:component>
												
										

SCDL 用于描述 SCA 的組成部分,如模塊、引用、導入和導出。您將在本系列中看到它們的示例。SCDL 定義是由多個文件組成的。例如,我們將接口和實現的 SCDL 存儲在一個名為 CreditApproval.component 的文件中。引用可以包含在 CreditApproval.component 文件(內聯)中,也可以包含在 Module 根目錄下的一個單獨的 sca.references 文件中。所有獨立引用都將放置在 sca.references 文件中,如下所示。如前所述,同一個 SCA 模塊內的非 SCA 構件 (JSP) 可以使用獨立引用調用 SCA 組件。


清單 6
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<scdl:references xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0">
  <reference name="CreditRequestPartner">
    <interface xsi:type="java:JavaInterface" interface="approval.credit.credit.request.CreditRequest">
      <method name="calulateCreditScore"/>
    </interface>
    <wire target="CreditApproval"/>
  </reference>
</scdl:references>
												
										

在我們的示例中,我們將定義的第三個文件是 sca.module。該 SCDL 文件包含模塊的定義:


清單 7
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApproval"/>
												
										

雖然我們?yōu)榻M件定義了一個 WSDL 接口,但是請注意,我們能夠將另一個 Java 接口添加到獨立引用,并將其連接到我們的目標組件。通過這種方式,Java 客戶機可以使用一個簡單的 POJI 調用 SCA 組件。WebSphere Integration Developer 將提供在 Java 接口和 WSDL 接口之間轉換調用的選項。在創(chuàng)建了第一個 SCA 組件后,您將很快看到這樣一個示例。

在這一系列文章中,我們將看到 SCDL 如何定義其他 SCA 構件(如服務引用、導入和導出)的示例。WebSphere Integration Developer 使用上述 SCDL 文件的命名約定,實際情況就是如此。在我們的示例中,在構建第一個 SCA 組件時,您將使用 WebSphere Integration Developer。然而,SCA 應用程序也可以使用記事本進行構建。

WebSphere Integration Developer 和 WebSphere Process Server

在本文中,您將使用 WebSphere Integration Developer 和 WebSphere Process Server 來構建并運行 SCA 組件。

WebSphere Integration Developer 用于開發(fā)運行于 WebSphere Process Server V6 上的應用程序。WebSphere Integration Developer 基于 Eclipse 3.0 平臺,它為集成項目提供了基于角色的開發(fā)。您可以將 WebSphere Integration Developer 和 IBM WebSphere Business Modeler V6 與 IBM Rational? Application Developer V6 或 IBM Rational Software Architect V6 一起作為集成開發(fā)平臺。J2EE 開發(fā)人員、業(yè)務分析人員或集成開發(fā)人員可以使用基于其獨特角色的工具透視圖,這樣每個開發(fā)人員都可以將注意力集中在這些角色所需的編輯器和工具上,從而大大提高了工作效率。

WebSphere Process Server 是一個基于 WebSphere Application Server V6 的綜合集成平臺。WebSphere Process Server 用于在面向服務的體系結構中執(zhí)行基于組件的業(yè)務集成應用程序。由于它基于 WebSphere Application Server 提供的 J2EE 1.4 基礎結構和平臺服務,因此 WebSphere Process Server 包括諸如業(yè)務流程自動化之類的功能。

有關 WebSphere Integration Developer 和 WebSphere Process Server 的詳細信息,請參閱參考資料







構建第一個 SCA 項目

現在,您可以構建第一個 SCA 項目了。在本例中,您將構建一個簡單的信用審批組件。該組件接收一個具有 ID 和名稱的數據對象,然后返回另一個包含信用分數和信用額度的數據對象。下載本文所附的 zip 文件,并將其解壓縮到硬盤上。本指導假設您將 zip 文件解壓縮到 C: 盤上。

WebSphere Integration Developer V6.0 是一個靈活的開發(fā)環(huán)境,它為自底向上或自頂向下開發(fā) SCA 應用程序提供了工具和向導。

為了創(chuàng)建信用審批服務,我們將研究自頂向下開發(fā)的各個方面。自頂向下開發(fā)過程的一般步驟大致如下:

  1. 創(chuàng)建 SCA 模塊。
  2. 創(chuàng)建業(yè)務對象。
  3. 定義服務接口。
  4. 生成組件并提供實現。
  5. 對 SCA 組件進行單元測試。
  6. 提供獨立引用。
  7. 使用簡單的 JSP 客戶機測試服務。

創(chuàng)建 SCA 模塊

首先,您需要創(chuàng)建一個 SCA 模塊。如前所述,SCA 模塊是 SCA 組件的打包構造。

  1. 在 WebSphere Integration Developer 中打開一個空白工作區(qū)。(圖 9)


    圖 9. 在 WebSphere Integration Developer 中打開一個空白工作區(qū)
    圖 9. 在 WebSphere Integration Developer 中打開一個空白工作區(qū)
  2. 關閉 Welcome 屏幕。

  3. 接下來,您需要創(chuàng)建一個新模塊。

    1. 在 WebSphere Integration Developer 工作臺中,打開業(yè)務集成透視圖。找到 Business Integration 視圖。

    2. 在 Business Integration 視圖內單擊鼠標右鍵,然后選擇 New => Module。(圖 10)


      圖 10. 創(chuàng)建新模塊
      圖 10. 創(chuàng)建新模塊
    3. New Module 向導應該出現(圖 11)。將該模塊命名為 CreditApprovalSCAModule


      圖 11. 創(chuàng)建新模塊
      圖 11. 創(chuàng)建新模塊
    4. 現在,Business Integration 視圖中應該顯示一個新項目。SCA 模塊是作為 SCDL 文件描述的。Business Integration 視圖向您展示了 SCA 模塊的邏輯視圖。如前所述,您可以打開 Physical Resource 視圖,來查看包含在 SCA 模塊中的物理資源。SCA 模塊的 SCDL 包含在名為 sca.module 的文件中。如果您使用文本編輯器打開該文件,應該看到以下內容:


清單 8
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApprovalSCAModule"/>

												
										

創(chuàng)建業(yè)務對象

對于創(chuàng)建接口或業(yè)務對象,沒有預先定義的任務順序;只需要在創(chuàng)建接口時簡單地創(chuàng)建業(yè)務對象即可。這里我們選擇在 Business Integration 視圖中創(chuàng)建業(yè)務對象。

在創(chuàng)建業(yè)務對象時,實際上您正在創(chuàng)建 XML 模式。業(yè)務對象作為標準的 XML 模式進行存儲。應用程序可以使用 SDO 編程模型和 XPath 訪問數據。

通過業(yè)務對象編輯器,我們可以創(chuàng)建信用審批服務將使用的業(yè)務對象定義。我們的服務需要兩個業(yè)務對象。

CreditApplication:包含計算信用等級所需的信用申請者的有關信息。信用應用程序業(yè)務對象 (CreditApplication) 包含三個屬性:

  • Customer Id:客戶的唯一標識符
  • First Name:客戶的名字
  • Last Name:客戶的姓氏

CreditRating:包含信用等級信息,如信用分數和信用額度。信用等級業(yè)務對象 (CreditRating) 包含三個屬性:

  • Credit Score:客戶基于先前歷史記錄的信用分數
  • Credit Limit:客戶可借貸的總金額。

  1. 我們首先創(chuàng)建請求業(yè)務對象,它用作 SCA 組件的輸入參數。

    1. 請確保 CreditApprovalSCAModule 已展開。右鍵單擊 Data Types,然后選擇 New => Business Object。(圖 12)


      圖 12. 創(chuàng)建新業(yè)務對象
      圖 12. 創(chuàng)建新業(yè)務對象
    2. 將業(yè)務對象命名為 CreditApplication,如圖 13 所示。


      圖 13. 定義業(yè)務對象
      圖 13. 定義業(yè)務對象
    3. 該業(yè)務對象應該在業(yè)務對象編輯器中打開。現在,Data Types 菜單下應該有 CreditApplication。(圖 14)


      圖 14. 業(yè)務集成菜單
      圖 14. 業(yè)務集成菜單
  2. 現在,我們將定義 CreditApplication 業(yè)務對象的屬性。

    1. 您可以通過選擇 Add Attribute 圖標添加屬性,如圖 15 所示。


      圖 15. Add Attribute 圖標
      圖 15. Add Attribute 圖標
    2. 輸入 customerId 作為屬性名稱,并接受缺省的 String 類型。(要更改類型,您只需選擇類型字段,并從下拉框中選擇類型。您需要為響應對象進行此操作。)


      圖 16. 定義屬性
      圖 16. 定義屬性
    3. 再添加兩個 String 屬性,并將其命名為 firstNamelastName。這兩個屬性應該是字符串類型,如下所示。


      圖 17. 定義屬性
      圖 17. 定義屬性
    4. 該業(yè)務對象是使用標準的 XML 模式類型定義的。您可以使用 XML 編輯器打開該業(yè)務對象,以便進行查看。(通過右鍵單擊業(yè)務對象并選擇 Open with => 和您選擇的編輯器,您可以在文本編輯器中打開該業(yè)務對象。)

    5. 保存并關閉業(yè)務對象編輯器。


      圖 18. 定義的業(yè)務對象
      圖 18. 定義的業(yè)務對象
    6. XML 模式應該類似于下面的代碼示例。


      清單 9
      																				
      																														
      <?xml version="1.0" encoding="UTF-8"?>
      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://CreditApprovalSCAModule">
        <xsd:complexType name="CreditApplication">
          <xsd:sequence>
            <xsd:element minOccurs="0" name="customerId" type="xsd:string"/>
            <xsd:element minOccurs="0" name="firstName" type="xsd:string"/>
            <xsd:element minOccurs="0" name="lastName" type="xsd:string"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:schema>
      																				
      																		

  3. 現在,我們要創(chuàng)建第二個業(yè)務對象來表示響應。

    1. 按照上面同樣的步驟,創(chuàng)建另一個業(yè)務對象。該業(yè)務對象有三個字段:

      • 字符串類型的 customerId
      • 整數類型的 creditScore
      • 雙精度類型的 creditLimit
    2. 如前所述,您可以通過選擇類型列更改類型,如圖 19 所示。


      圖 19. 更改屬性類型
      圖 19. 更改屬性類型
    3. 保存并關閉業(yè)務對象編輯器

現在,您已經創(chuàng)建了兩個業(yè)務對象。

定義服務接口

現在,您可以創(chuàng)建 SCA 接口了。此外,信用審批服務是一個請求-響應服務,它接收信用應用程序并同時返回信用等級。服務接口定義服務客戶機和服務提供者之間的交互。

有多種創(chuàng)建接口的方式。如果您選擇 Java 接口,可以使用 WebSphere Integration Developer 中的 Java Eclipse 工具來進行創(chuàng)建。在我們的示例中,我們將在業(yè)務集成透視圖中創(chuàng)建 WSDL 接口。您可以使用 Assembly Editor 創(chuàng)建,也可以使用業(yè)務集成視圖創(chuàng)建。我們將使用后者。(稍后,我們將使用 Assembly Editor 創(chuàng)建實現。)

  1. 首先,我們將使用 Business Integration 視圖菜單創(chuàng)建接口。

    1. 右鍵單擊 Interfaces 菜單項,然后選擇 New => Interfaces,如圖 20 所示。


      圖 20. 創(chuàng)建新接口
      圖 20. 創(chuàng)建新接口
    2. 在 New Interface 菜單中,輸入名稱 CreditApproval。(請記住出于演示的目的,在我們的示例中,我們使用的是缺省包和文件夾。您可以選擇一個文件夾,輕松地按功能對不同的接口進行分組。)


      圖 21. 創(chuàng)建新接口
      圖 21. 創(chuàng)建新接口
  2. CreditApproval 接口是一個簡單的 WSDL 文件。WebSphere Integration Developer 附帶了一個簡單的 WSDL 編輯器,可以用來構建接口。

    1. 在創(chuàng)建接口時,接口編輯器應該已經打開。如果接口編輯器尚未打開,可以在業(yè)務集成視圖中雙擊接口,以將接口編輯器打開。

    2. 首先,我們要創(chuàng)建一個簡單的請求-響應操作。(您還可以創(chuàng)建用于異步調用的單向操作,但是現在,我們只創(chuàng)建簡單的同步請求。)單擊 Add Request Response Operation 圖標,如圖 22 所示。


      圖 22. Add Request Response Operation 圖標
      圖 22. Add Request Response Operation 圖標
    3. 將在編輯器中創(chuàng)建一個操作。將該操作命名為 calculateCreditRating。(圖 23)


      圖 23. 定義操作
      圖 23. 定義操作
    4. 現在我們需要定義參數。請記住,我們創(chuàng)建了兩個業(yè)務對象,一個用于輸入,另一個用于輸出。在創(chuàng)建操作后,選擇 Add Input 圖標,如圖 24 所示。


      圖 24. Add Input 圖標
      圖 24. Add Input 圖標
    5. 將輸入命名為 CreditApplication

    6. 選擇 Type 列并找到 CreditApplicaiton 業(yè)務對象。您可以看到,業(yè)務對象現在是一個有效類型,可以用于構建接口,如圖 25 所示。(在這里你可以選擇創(chuàng)建新業(yè)務對象。)


      圖 25. 新業(yè)務對象現在是一個有效類型
      圖 25. 新業(yè)務對象現在是一個有效類型
    7. 接下來,選擇 Add Output 圖標,如圖 26 所示。


      圖 26. Add Output 圖標
      圖 26. Add Output 圖標
    8. 選擇 CreditRating 作為類型,類似于選擇輸入的類型。


      圖 27. 定義輸出
      圖 27. 定義輸出
    9. 保存并關閉接口編輯器。

    10. 如果您希望檢查 WSDL 文件,可以在 Physical Resources 視圖中右鍵單擊 CreditApproval.wsdl 文件,然后使用文本編輯器打開該文件。(圖 28)


      圖 28. 查看 WSDL 文件
      圖 28. 查看 WSDL 文件

      WSDL 文件應該類似于下面的代碼示例。


      清單 10
      																				
      																														
      <?xml version="1.0" encoding="UTF-8"?>
      <wsdl:definitions xmlns:bons1="http://CreditApprovalSCAModule" 
      xmlns:tns="http://CreditApprovalSCAModule/CreditApproval" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      name="CreditApproval" targetNamespace="http://CreditApprovalSCAModule/CreditApproval">
        <wsdl:types>
          <xsd:schema targetNamespace="http://CreditApprovalSCAModule/CreditApproval" 
      xmlns:bons1="http://CreditApprovalSCAModule" 
      xmlns:tns="http://CreditApprovalSCAModule/CreditApproval" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:import namespace="http://CreditApprovalSCAModule" 
      schemaLocation="xsd-includes/http.CreditApprovalSCAModule.xsd"/>
            <xsd:element name="calculateCreditRating">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="CreditApplication" nillable="true" 
      type="bons1:CreditApplication"/>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
            <xsd:element name="calculateCreditRatingResponse">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="CreditRating" nillable="true" 
      type="bons1:CreditRating"/>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
          </xsd:schema>
        </wsdl:types>
          <wsdl:message name="calculateCreditRatingRequestMsg">
          <wsdl:part element="tns:calculateCreditRating" 
      name="calculateCreditRatingParameters"/>
        </wsdl:message>
          <wsdl:message name="calculateCreditRatingResponseMsg">
          <wsdl:part element="tns:calculateCreditRatingResponse" 
      name="calculateCreditRatingResult"/>
        </wsdl:message>
          <wsdl:portType name="CreditApproval">
          <wsdl:operation name="calculateCreditRating">
            <wsdl:input message="tns:calculateCreditRatingRequestMsg" 
      name="calculateCreditRatingRequest"/>
            <wsdl:output message="tns:calculateCreditRatingResponseMsg" 
      name="calculateCreditRatingResponse"/>
          </wsdl:operation>
        </wsdl:portType>
      </wsdl:definitions>
      
      																				
      																		

生成組件并提供實現

現在,我們可以創(chuàng)建 SCA 實現了。此時,我們已經創(chuàng)建了標準的接口和業(yè)務對象。現在我們要定義 SCA 組件。您將使用 SCA Assembly Editor 來完成此操作。

  1. 首先,我們要定義 SCA 組件。

    1. 通過雙擊 CreditApprovalSCAModule 菜單項,打開 SCA Assembly Editor,如圖 29 所示。


      圖 29. 打開 SCA Assembly Editor
      圖 29. 打開 SCA Assembly Editor
    2. SCA Assembly Editor 有一個面板,可以用于創(chuàng)建 SCA 構件。您也可以從各種視圖中拖動某些構件。只需將 CreditApproval 接口拖至 Assembly Editor,如圖 30 所示。(或者,您也可以從面板拖動 Java 組件,然后將其與接口相關聯。)


      圖 30. 將接口拖至 Assembly Editor
      圖 30. 將接口拖至 Assembly Editor
    3. 將出現一個文本框。選擇 Component with No Implementation Type,如圖 31 所示。


      圖 31. 組件創(chuàng)建文本框
      圖 31. 組件創(chuàng)建文本框
    4. 現在,您應該在 Assembly Editor 上看到一個名為 Component1 的 SCA 組件。(圖 32)


      圖 32. SCA 組件圖標
      圖 32. SCA 組件圖標
    5. 通過選擇組件并鍵入名稱,您可以更改名稱;或者可以使用屬性編輯器更改名稱,如圖 33 所示。將顯示名稱更改為 CreditApproval。名稱字段應該自動更改。


      圖 33. 更改組件名稱
      圖 33. 更改組件名稱
  2. 現在,我們的 SCA 組件具有接口,但沒有實現。現在我們要使用 Assembly Editor 生成實現。

    1. 通過在 Assembly Editor 中右鍵單擊組件并選擇 Generate Implementation => Java,生成一個框架實現。(圖 34)


      圖 34. 生成框架實現
      圖 34. 生成框架實現
    2. 新 Java 實現應該在 Java 編輯器中打開;您將看到 calculateCreditRating。下載文件中提供了簡單的代碼段,位置為 C:\SCA_ArticleSeries\Part1\CodeSnippet1.txt。方法如下所示。


      清單 11
      																				
      																														
      public DataObject calculateCreditRating(DataObject creditApplication) {
      //	Create and return a credit rating object.
      	System.out.println("********* credit approval service invoked ******");
      	ServiceManager serviceManager = new ServiceManager();
      
      	BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");
      
      	System.out.println("********* BOFactory created ******");
      	DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");
      
      	System.out.println("********* credit rating object created ******");
      	creditRating.setString("customerId", creditApplication.getString("customerId"));
      		
      	creditRating.setInt("creditScore", 750);
      	creditRating.setDouble("creditLimit", 10000d);
      	System.out.println("********* returning credit rating object ******");
      		
      	return creditRating;
      
      }
      																				
      																		

  3. 這些代碼使用 SCA 服務管理器查找業(yè)務對象工廠 (Business Object Factory),后者用于從 XML 模式中創(chuàng)建業(yè)務對象。出于演示的目的,我們創(chuàng)建響應數據對象,并返回硬編碼的數據。

  4. 如果您粘貼代碼,則可能出現一些編譯錯誤。通過右鍵單擊編輯器并選擇 Source => Organize Imports,您可以更正這些錯誤,如圖 35 所示。


    圖 35. 更正錯誤
    圖 35. 更正錯誤
  5. 保存并關閉 Java 文件,但是 Assembly Editor 保持打開狀態(tài)。

對 SCA 組件進行單元測試

WebSphere Integration Developer 提供了使用單元測試工具對組件進行單元測試的功能。根據 SCA 實現的類型,您可以在 J2SE 環(huán)境中測試 SCA 組件,通過該環(huán)境,可以在沒有完整的應用程序服務器的情況下測試組件;當然,這在很大程度上取決于您具有的組件的類型。可以在 J2SE 環(huán)境中輕松地對 Java 實現進行測試,但是由 BPEL 流程實現的 SCA 組件需要 BPEL 引擎(如 WebSphere Process Server)。在我們的示例中,我們將使用測試組件功能來測試 SCA 組件。

要啟動測試組件功能,請執(zhí)行以下步驟:

  1. 在 SCA Assembly Editor 中右鍵單擊 CreditApproval 組件,然后選擇 Test Component。(圖 36)


    圖 36. 啟動測試組件功能
    圖 36. 啟動測試組件功能
  2. 這將啟動測試組件編輯器。在該工具的右側,輸入測試數據,如圖 37 所示,然后單擊 Continue


    圖 37. 輸入測試數據
    圖 37. 輸入測試數據
  3. 將顯示可用的運行時列表。選擇 Eclipse 1.4 JVM,然后單擊 Finish。(圖 38)


    圖 38. 運行時部署位置
    圖 38. 運行時部署位置
  4. 要開始測試,請選擇 Return 項,如圖 39 所示。監(jiān)視 Events 窗口以查看流程。


    圖 39. Events 窗口
    圖 39. Events 窗口
  5. 您將在右側看到結果。(圖 40)


    圖 40. 單元測試結果
    圖 40. 單元測試結果

創(chuàng)建 SCA 客戶機 Web 應用程序并在 WebSphere Process Server 中進行測試

  1. 要讓打包在同一 SCA 部署中的非 SCA 組件調用 SCA 組件,我們需要創(chuàng)建獨立引用:

    1. 在 SCA Assembly Editor 中,請選擇面板中 Import 圖標旁邊的 arrow。這將打開一個更小的子菜單。選擇 Standalone references 圖標,并將其拖至 Assembly Editor 中的任何位置,如圖 41 所示。


      圖 41. 創(chuàng)建獨立引用
      圖 41. 創(chuàng)建獨立引用
    2. 單擊 Stand-alone References 框的內部(而非文本),并將其拖至 Credit Approval 組件,如圖 42 所示。


      圖 42. 創(chuàng)建匹配引用
      圖 42. 創(chuàng)建匹配引用
    3. 單擊 OK,創(chuàng)建匹配引用。(圖 43)


      圖 43. 創(chuàng)建匹配引用
      圖 43. 創(chuàng)建匹配引用
    4. 下一文本框將向您提供生成 Java 接口的選項。請記住,您創(chuàng)建了 WSDL 接口。然而,WebSphere Integration Developer 要生成等效的 Java 接口,以使 Java 客戶機使用 SCA API 交互。選擇 Yes。(圖 44)


      圖 44. 接口轉換驗證
      圖 44. 接口轉換驗證
  2. 有了獨立引用后,現在我們可以在同一模塊的非 SCA 組件中調用 SCA 組件。請記住,SCA 模塊是由 EAR 文件實現的,因此您可以將其他 J2EE 組件添加到 SCA 模塊。在我們的示例中,我們要導入具有 JSP 文件的現有 WAR 文件。WAR 文件將是基礎 EAR 文件的一部分。

    1. 選擇 File => Import,調出 Import 向導。選擇 WAR file,然后單擊 Next。(圖 45)


      圖 45. 從非 SCA 組件中調用 SCA 組件
      圖 45. 從非 SCA 組件中調用 SCA 組件
    2. 選擇 C:\SCA_ArticleSeries\Part1\CreditApprovalClient.war。取消選擇 Add module to an EAR Project


      圖 46. 導入 WAR 文件
      圖 46. 導入 WAR 文件
    3. 選擇 Yes,以轉到 Web 透視圖。(圖 47)


      圖 47. 轉到 Web 透視圖
      圖 47. 轉到 Web 透視圖
    4. 打開 JSP 文件,以檢查代碼。您將在 Dynamic Web Projects 目錄下找到該文件,如圖 48 所示。JSP 稱為 creditApprovalClient.jsp。


      圖 48. Dynamic Web Projects 目錄
      圖 48. Dynamic Web Projects 目錄
    5. 我們使用簡單的 JSP 接收輸入并使用 SCA API 調用 SCA 組件。(請記住,為了使用 MVC,該 JSP 遵循最佳實踐)。

  3. SCA 具有 Dependency Editor,通過該編輯器,可以將不同的包添加到 SCA 模塊:

    1. 通過右鍵單擊 CreditApprovalSCAModule 并選擇 Open Dependency Editor,打開 Dependency Editor。(圖 49)


      圖 49. 打開 Dependency Editor
      圖 49. 打開 Dependency Editor
    2. 展開 J2EE 部分,然后單擊 Add 按鈕。(圖 50)


      圖 50. 配置依賴項
      圖 50. 配置依賴項
    3. 選擇 CreditApprovalClient Web 項目,如圖 51 所示。


      圖 51. 選擇 Web 項目
      圖 51. 選擇 Web 項目
    4. 請確保未選中 On Build Path。(Build Path 將該組件添加到 SCA 模塊的類路徑。在我們的示例中,我們需要使 WAR 文件依賴于 SCA 模塊。)保存 Dependency Editor。這使得 WAR 文件成為 EAR 文件的一部分。


      圖 52. 設置依賴項
      圖 52. 設置依賴項
    5. 要讓 Web 項目知道 SCA Java 接口,可以右鍵單擊 Web 項目并選擇 Properties

    6. 轉到 Java JAR Dependencies 并選擇 CreditApprovalSCAModuleEJBClient.jar,它是在下面生成的 EJB 客戶機 JAR 文件。(圖 53)


      圖 53. 設置依賴項
      圖 53. 設置依賴項
    7. 關閉編輯器。此時,您可以選擇執(zhí)行整體構建。這可能沒有必要,但我們總是喜歡在部署前進行整體構建。如果您有自動構建,可以進行清理,如圖 54 所示。


      圖 54. 用于自動構建的清理
      圖 54. 用于自動構建的清理
  4. 現在,我們可以在 WebSphere Process Server 上部署并測試我們的 SCA 組件和 Web 客戶機了。請記住,我們的 SCA 模塊是由 J2EE 應用程序實現的。您可以轉到 J2EE 透視圖來查看構件。請記住,它們是生成的構件。(我們以后將在這一系列文章中進行介紹。)


    圖 55. J2EE 透視圖
    圖 55. J2EE 透視圖
    1. 轉到 Business Integration 透視圖底部的 Servers 視圖。右鍵單擊 WebSphere Process Server,然后選擇 Start,如圖 56 所示。


      圖 56. 啟動 WebSphere Process Server
      圖 56. 啟動 WebSphere Process Server
    2. 等待服務器啟動。檢查控制臺并等待圖 57 中所示的消息。


      圖 57. WebSphere Process Server 啟動消息
      圖 57. WebSphere Process Server 啟動消息
    3. 再次右鍵單擊服務器并選擇 Add and remove projects。(圖 58)


      圖 58. 添加和刪除項目
      圖 58. 添加和刪除項目
    4. 選擇 CreditApprovalSCAModuleAdd,然后選擇 Add,如圖 59 所示。這會將其移到右側的 Configured projects 框中。


      圖 59. 在服務器上配置項目
      圖 59. 在服務器配置項目
    5. 監(jiān)視右下角的進度,等待部署應用程序。(圖 60)


      圖 60. 項目部署監(jiān)視器
      圖 60. 項目部署監(jiān)視器
    6. 在控制臺驗證 CreditApporvalSCAModuleApp 已經啟動。(圖 61)


      圖 61. 管理控制臺消息
      圖 61. 管理控制臺消息
    7. 轉到 Web 透視圖。右鍵單擊 JSP,然后選擇 Run => Run on Server,如圖 62 所示。


      圖 62. 運行應用程序
      圖 62. 運行應用程序
    8. 選擇現有的 WebSphere Process Server,接著選擇 Set server as project default,然后單擊 Finish。(圖 63)


      圖 63. 設置服務器
      圖 63. 設置服務器
    9. 當應用程序執(zhí)行時,輸入圖 64 中所示的應用程序測試數據。


      圖 64. 輸入 SCA 應用程序測試數據
      圖 64. 輸入 SCA 應用程序測試數據
    10. 您應該獲得圖 65 所示的結果。


      圖 65. SCA 應用程序測試結果
      圖 65. SCA 應用程序測試結果
    11. 關閉瀏覽器并停止服務器。

祝賀您!您已經創(chuàng)建并測試了第一個 SCA 組件!







結束語

服務組件體系結構 (SCA) 是面向服務的體系結構 (SOA) 中的一個主要變化。SCA 向我們提供了 SOA 的編程模型,并將在今后作為集成的基礎。請繼續(xù)關注本系列的后續(xù)文章,我們將研究特定 SCA 功能的細節(jié)以及它們可給您的應用程序帶來的好處。

posted on 2006-04-17 04:10 wsdfsdf 閱讀(253) 評論(0)  編輯 收藏 引用 所屬分類: 技術文章

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品国产| 久久久蜜桃一区二区人| 国产精品久久久久久久久借妻 | 免费短视频成人日韩| 久久久久久久久久久久久女国产乱 | 欧美大香线蕉线伊人久久国产精品| 久久久国产一区二区三区| 久久视频一区| 欧美日韩另类综合| 国产精品免费一区二区三区在线观看 | 99在线精品观看| 亚洲永久在线观看| 久久这里有精品视频| 亚洲黄色三级| 亚洲一区久久久| 另类av一区二区| 国产精品白丝jk黑袜喷水| 狠狠久久婷婷| 亚洲一级在线观看| 欧美jizzhd精品欧美巨大免费| 91久久国产自产拍夜夜嗨| 亚洲欧美中文日韩在线| 欧美成人一区二免费视频软件| 国产精品日韩欧美一区二区| 91久久国产精品91久久性色| 久久国产精品第一页| 亚洲精品久久久久久久久| 欧美在线观看视频一区二区三区 | 国产在线日韩| 亚洲欧美久久久| 欧美激情视频在线播放| 一本色道久久综合亚洲精品婷婷| 午夜日韩电影| 亚洲综合成人在线| 久久电影一区| 亚洲人久久久| 欧美亚洲综合在线| 欧美日韩无遮挡| 一区二区三区在线不卡| 亚洲在线观看视频| 亚洲黄色在线视频| 久久久久久久高潮| 国产精品综合av一区二区国产馆| aa级大片欧美| 亚洲高清视频中文字幕| 久久精品男女| 国产一区二区三区在线免费观看 | 久久久久99精品国产片| 日韩视频在线永久播放| 美日韩精品视频免费看| 一区免费视频| 蜜臀va亚洲va欧美va天堂| 欧美一级在线播放| 国产午夜精品久久久| 午夜精彩国产免费不卡不顿大片| 91久久精品国产| 欧美激情1区2区3区| 亚洲人成人99网站| 亚洲大片精品永久免费| 美女性感视频久久久| 91久久视频| 亚洲欧洲免费视频| 欧美日韩精品免费观看视一区二区| 亚洲人永久免费| 亚洲欧洲日产国产网站| 欧美精品aa| 亚洲午夜精品久久久久久app| 日韩午夜电影av| 欧美午夜欧美| 久久精品国产一区二区三| 欧美一区激情| 亚洲激情国产| 中文在线一区| 国外成人在线| 亚洲黄色影院| 国产精品久久99| 久久精品成人| 久久尤物电影视频在线观看| 亚洲人成绝费网站色www| 日韩视频专区| 国产一区二区三区四区五区美女 | 99热精品在线观看| 亚洲精品日本| 亚洲精品人人| 国产精品v亚洲精品v日韩精品| 亚洲一二三级电影| 欧美一级艳片视频免费观看| 亚洲福利视频二区| 99精品国产在热久久婷婷| 国产色视频一区| 亚洲福利av| 国产精品香蕉在线观看| 欧美电影打屁股sp| 国产精品分类| 亚洲国产精品成人久久综合一区| 欧美日韩在线播放三区四区| 久久激情视频免费观看| 欧美成人午夜视频| 欧美在线免费观看| 欧美精品999| 男女激情视频一区| 国产精品成人v| 欧美激情视频在线播放 | 日韩一级精品| 伊人久久亚洲美女图片| 一区二区三区欧美视频| 在线观看视频欧美| 亚洲综合另类| 一本色道久久加勒比88综合| 久久精品综合| 久久av一区二区三区漫画| 欧美精品九九| 欧美国产亚洲另类动漫| 国产人成一区二区三区影院| 一区二区免费在线播放| 亚洲人体大胆视频| 久久久之久亚州精品露出| 欧美一区精品| 国产精品毛片| 中国亚洲黄色| 亚洲尤物视频在线| 欧美午夜大胆人体| 日韩亚洲视频| 在线中文字幕日韩| 欧美日韩国产免费| 亚洲高清自拍| 亚洲激情精品| 欧美福利一区二区| 亚洲国产精品欧美一二99| 亚洲高清色综合| 欧美成人精品h版在线观看| 蘑菇福利视频一区播放| 在线成人www免费观看视频| 久久精品国亚洲| 麻豆精品传媒视频| 亚洲第一色在线| 蜜桃久久av一区| 亚洲激情在线激情| 一区二区高清在线| 欧美亚洲不卡| 欧美一区二区黄| 久久综合色婷婷| 亚洲国语精品自产拍在线观看| 欧美激情在线| 亚洲国产欧美一区二区三区久久 | 国产日韩欧美不卡| 欧美一区二区视频在线观看| 快she精品国产999| 亚洲激精日韩激精欧美精品| 欧美屁股在线| 亚洲综合首页| 免费高清在线一区| 亚洲精品久久久久| 欧美视频在线视频| 欧美一区二区三区久久精品| 久久综合久久88| 一片黄亚洲嫩模| 国产日产亚洲精品系列| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲国产cao| 亚洲欧美自拍偷拍| 亚洲国产欧美不卡在线观看| 欧美日韩国产一中文字不卡| 亚洲一区二区免费| 乱中年女人伦av一区二区| 亚洲美女啪啪| 国产欧美一区二区三区在线看蜜臀 | 亚洲视频图片小说| 国产日韩视频| 欧美国产在线观看| 午夜国产精品视频免费体验区| 欧美不卡一卡二卡免费版| 一个色综合导航| 激情久久久久久久久久久久久久久久| 欧美成人精品一区二区| 亚洲欧美日韩国产一区| 欧美成人r级一区二区三区| 一区二区三区四区五区精品视频| 国产日韩av高清| 欧美日韩播放| 久久久久久一区二区三区| 一区二区三区精品久久久| 免费的成人av| 久久gogo国模啪啪人体图| 亚洲免费av网站| 伊人色综合久久天天| 国产麻豆成人精品| 欧美日韩国产不卡| 乱中年女人伦av一区二区| 午夜精品美女自拍福到在线 | 欧美.www| 欧美中文在线视频| 亚洲一区二区三区午夜| 亚洲人成7777| 在线观看一区视频| 国产午夜精品一区二区三区欧美| 欧美日韩综合网| 欧美日韩不卡| 欧美激情网站在线观看| 久久一区二区三区超碰国产精品|