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

隨筆 - 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>
            亚洲午夜小视频| 美女精品网站| 欧美精品v国产精品v日韩精品| 免费观看日韩av| 国产一区白浆| 亚洲一区日韩在线| 欧美国产亚洲精品久久久8v| 国产一区在线播放| 日韩一区二区精品| 洋洋av久久久久久久一区| 久久久午夜电影| 欧美在线视频观看| 亚洲一区亚洲二区| 亚洲激情成人| 国产主播精品| 久久青草欧美一区二区三区| 亚洲最新视频在线| 一区二区三区四区精品| 最新高清无码专区| 欧美日韩国产小视频在线观看| 亚洲国产精品一区二区久| 久久永久免费| 中国亚洲黄色| 激情综合久久| 欧美刺激性大交免费视频| 久久久人成影片一区二区三区观看 | 亚洲欧洲日韩女同| 欧美日韩国产综合视频在线观看中文| 欧美一级网站| 国产精品理论片在线观看| 新狼窝色av性久久久久久| 欧美日韩a区| 一区二区三区高清在线观看| 国产综合在线视频| 亚洲精品免费在线| 亚洲高清免费在线| 久久国产主播精品| 男人的天堂成人在线| 亚洲毛片在线看| 激情久久综合| 欧美午夜精品一区| 夜夜精品视频| 亚洲免费观看高清完整版在线观看熊 | 久久久久久穴| 久久福利精品| 新狼窝色av性久久久久久| 黄色亚洲免费| 欧美成人午夜| 久久蜜桃资源一区二区老牛 | 国产综合欧美| 亚洲欧美日韩一区二区三区在线观看| 久久久青草婷婷精品综合日韩| 国产精品永久免费| 欧美日韩免费观看一区=区三区| 亚洲精品视频在线看| 性色av一区二区三区| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲欧美日韩一区在线| 国产真实精品久久二三区| 国产精品久久一区主播| 麻豆成人在线| 亚洲一区二区三区精品视频| 久久成人免费电影| 日韩一二三在线视频播| 亚洲在线播放电影| 最近中文字幕日韩精品 | 亚洲电影免费| 久久综合影音| 日韩小视频在线观看| 国产精品99久久久久久白浆小说 | 国产精品美女视频网站| 欧美在线国产| 欧美日韩激情网| 欧美成人日韩| 久久野战av| 一区在线视频| 免费在线国产精品| 99亚洲一区二区| 欧美国产综合一区二区| 欧美多人爱爱视频网站| 国产精品高清在线观看| a4yy欧美一区二区三区| 亚洲永久精品国产| 亚洲黄色性网站| 性亚洲最疯狂xxxx高清| 欧美成人精品在线播放| 91久久精品国产91性色tv| 麻豆精品视频在线观看| 欧美三级在线视频| 欧美激情一区| 午夜精品国产精品大乳美女| 欧美阿v一级看视频| 欧美日韩亚洲一区二区三区在线| 久久久九九九九| 国产精品国产自产拍高清av| 麻豆久久婷婷| 日韩亚洲国产欧美| 欧美电影在线观看完整版| 欧美一区二区三区男人的天堂| 美国成人直播| 亚洲精品在线一区二区| 久久国产精品一区二区三区| 亚洲欧美精品在线观看| 欧美成年人网站| 欧美不卡一卡二卡免费版| 国产伦精品一区二区三区| 一区二区日韩精品| 日韩午夜剧场| 欧美高清视频www夜色资源网| 久久亚洲电影| 亚洲高清在线观看| 欧美一级专区免费大片| 久久久久久久久岛国免费| 国产一区视频网站| 久久xxxx| 一区二区三区视频在线播放| 亚洲欧美卡通另类91av | 亚洲福利久久| 最新亚洲视频| 国产色产综合产在线视频| 亚洲午夜视频在线观看| 亚洲第一网站| 欧美激情综合五月色丁香| 亚洲高清一二三区| 国产精品一区二区三区免费观看| 性伦欧美刺激片在线观看| 亚洲电影免费观看高清| 亚洲欧美一区二区三区久久| 免费看成人av| 中文精品视频一区二区在线观看| 欧美欧美天天天天操| 午夜亚洲性色福利视频| 久久国产精品亚洲77777| 99精品热6080yy久久| 欧美电影免费| 久久免费国产| 亚洲视频碰碰| 亚洲一区二区三区视频播放| 亚洲天堂男人| 日韩视频免费在线观看| 亚洲福利av| 久久资源av| 99视频+国产日韩欧美| 欧美在线一二三四区| 亚洲国产精品久久人人爱蜜臀 | 国产精品白丝av嫩草影院 | 在线一区二区三区做爰视频网站| 久久婷婷综合激情| 女同性一区二区三区人了人一| 国内成人精品视频| 久久亚洲综合网| 亚洲国产精品va在线看黑人动漫| 亚洲高清视频一区| 欧美日韩无遮挡| 99视频一区二区| 一本色道久久99精品综合| 亚洲欧美另类中文字幕| 亚洲欧美视频在线| 一区二区视频欧美| 久久久精彩视频| 欧美不卡视频| 日韩西西人体444www| 欧美激情综合网| 亚洲午夜激情网站| 久久久久久欧美| 亚洲精品美女久久久久| 欧美日韩妖精视频| 新67194成人永久网站| 免费久久99精品国产| 亚洲国产专区校园欧美| 欧美日韩视频第一区| 羞羞答答国产精品www一本| 奶水喷射视频一区| 亚洲视频在线免费观看| 国产午夜亚洲精品不卡| 亚洲自拍偷拍色片视频| 国产一区二区在线观看免费| 亚洲一区在线看| 久久午夜激情| 一区二区动漫| 韩国av一区二区三区| 欧美精品免费看| 亚洲一卡久久| 欧美国产日韩二区| 午夜日韩av| 99av国产精品欲麻豆| 国产精品美女午夜av| 欧美精品三级日韩久久| 亚洲欧美国产另类| 亚洲国产精品日韩| 在线一区二区三区四区| 欧美日韩欧美一区二区| 久久久久一区| 午夜在线观看免费一区| 欧美韩日一区二区| 久久美女性网| 裸体歌舞表演一区二区| 久久久久久久综合| 亚洲一区日韩在线| 国外成人在线视频网站|