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

隨筆 - 181, 文章 - 2, 評(píng)論 - 85, 引用 - 0
數(shù)據(jù)加載中……

用于實(shí)現(xiàn) Web 服務(wù)的 SOA 編程模型,第 2 部分: 使用服務(wù)數(shù)據(jù)對(duì)象簡(jiǎn)化的數(shù)據(jù)訪問(wèn)

利用服務(wù)數(shù)據(jù)對(duì)象簡(jiǎn)化面向服務(wù)的軟件中的數(shù)據(jù)訪問(wèn)和表示。SDO 用統(tǒng)一的抽象代替各種各樣的數(shù)據(jù)訪問(wèn)模型來(lái)創(chuàng)建、檢索、更新和刪除供服務(wù)實(shí)現(xiàn)使用的業(yè)務(wù)數(shù)據(jù)。這是我們有關(guān)用于 IBM? 面向服務(wù)的體系結(jié)構(gòu) (SOA) 的編程模型系列文章的第二篇。

服務(wù)對(duì)象數(shù)據(jù)

服務(wù)對(duì)象數(shù)據(jù)(Service Data Object,SDO)使用統(tǒng)一的抽象代替了各種各樣的數(shù)據(jù)訪問(wèn)模型來(lái)創(chuàng)建、檢索、更新和刪除供服務(wù)實(shí)現(xiàn)使用的業(yè)務(wù)數(shù)據(jù)。SDO(請(qǐng)參閱參考資料部分中的 Service Data Objects 2.0 和 Next-Generation Data Programming: Service Data Objects)是 IBM 面向服務(wù)的體系結(jié)構(gòu) (SOA) 的基礎(chǔ)概念。SDO 將開發(fā)人員從如何訪問(wèn)特定的后端數(shù)據(jù)源的技術(shù)細(xì)節(jié)中解放出來(lái),提高了他們的工作效率,這樣他們就可以主要專注于業(yè)務(wù)邏輯(請(qǐng)參閱參考資料部分中的 Integrating relational data into Web applications、Next-generation data programming in the Java? environment 以及 Using Service Data Objects with Enterprise Information Integration technology)。SDO 是與 BEA Systems, Inc. 聯(lián)合制訂的規(guī)范,并且在 IBM 系列產(chǎn)品中得到了廣泛的使用,包括 WebSphere? Application Server 和 Rational? Studio 工具。Java? 數(shù)據(jù)庫(kù)連接(Java? DataBase Connectivity),通常稱為 JDBC,是執(zhí)行結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Langauge,SQL)語(yǔ)句的 Java 接口。目前,用于 JDBC、Web 服務(wù)描述語(yǔ)言(Web Services Description Language,WSDL)定義的服務(wù)、企業(yè) JavaBean(Enterprise JavaBean,EJB)等等由 Java 編寫的服務(wù)實(shí)現(xiàn)的編程模型都是相似的,但卻又有一些讓人討厭的不同。

SDO 定義了一種單一的、統(tǒng)一的方法來(lái)訪問(wèn)和操作來(lái)自異構(gòu)數(shù)據(jù)源的數(shù)據(jù),包括關(guān)系型數(shù)據(jù)庫(kù)、可擴(kuò)展標(biāo)記語(yǔ)言(eXtensible Markup Language,XML)數(shù)據(jù)源、Web 服務(wù)以及企業(yè)信息系統(tǒng) (EIS)。它們是基于數(shù)據(jù)圖(data graph)的概念。數(shù)據(jù)圖就是一組可以從數(shù)據(jù)源中分離出來(lái)的樹形結(jié)構(gòu)的對(duì)象。SDO 可以在整個(gè)應(yīng)用程序體系結(jié)構(gòu)中使用。

應(yīng)用程序體系結(jié)構(gòu)的領(lǐng)域 如何使用 SDO
SOA
  • SDO 是服務(wù)的輸入和輸出。
數(shù)據(jù)訪問(wèn)
  • SDO 訪問(wèn)關(guān)系型、XML、EJB、Java 數(shù)據(jù)對(duì)象(Java Data Object,JDO)和 Hibernate 數(shù)據(jù)源。
  • SDO 是數(shù)據(jù)傳輸對(duì)象(Data Transfer Object,DTO)——也被稱為值對(duì)象(Value Object)。
Web 服務(wù)
  • SDO 表示網(wǎng)絡(luò)上的 XML。
消息傳遞
  • SDO 表示消息。
XML 使用 SDO 的情況:
  • 支持 XML 的應(yīng)用程序。
  • 訪問(wèn) XML 文件、文檔、資源和消息。
連接器/適配器(EIS,CICS)
  • SDO 表示數(shù)據(jù)記錄。
EJB
  • SDO 是 DTO(也被稱作值對(duì)象)。
  • Java 2 企業(yè)版(Java 2 Enterprise Edition,J2EE)設(shè)計(jì)模式。
ADO.NET
  • ADO DataSet 是 SDO 數(shù)據(jù)圖的子集。
企業(yè)服務(wù)總線(Enterprise Service Bus,ESB)
  • SDO 是服務(wù)的輸入和輸出。
跨語(yǔ)言編程模型
  • 完整的應(yīng)用程序可能橫跨層和語(yǔ)言。
  • 用于很多種語(yǔ)言技能集的相同的編程模型。
模型驅(qū)動(dòng)的體系結(jié)構(gòu)(Model-driven architecture,MDA)
  • SDO 模型(類型(Type)和屬性(Property))是通過(guò)統(tǒng)一建模語(yǔ)言(Unified Modelling Language,UML)類和組件定義的。
  • SDO 應(yīng)用程序遵循 UML 順序 (Sequence)、流 (Flow)、狀態(tài) (State) 和協(xié)作 (Collaboration)。
Java
  • SDO 是帶有 POJO 接口的智能的“傳統(tǒng) Java 對(duì)象(plain old Java object,POJO)”。

在 SOA 中,應(yīng)用程序并不直接地連接數(shù)據(jù)源。它訪問(wèn)一個(gè)叫做數(shù)據(jù)訪問(wèn)服務(wù)(data access service,DAS)的中介并接收響應(yīng)中的數(shù)據(jù)圖。DAS 是為特定數(shù)據(jù)源種類處理技術(shù)細(xì)節(jié)的服務(wù)。它為客戶機(jī)將數(shù)據(jù)轉(zhuǎn)換成 SDO 圖。客戶機(jī)應(yīng)用程序與數(shù)據(jù)圖進(jìn)行交互來(lái)獲得數(shù)據(jù)和改變數(shù)據(jù)。為了將更新應(yīng)用于原始的數(shù)據(jù)源,應(yīng)用程序?qū)⒏逻^(guò)的圖發(fā)送回 DAS,而 DAS 又與數(shù)據(jù)源交互。通常,運(yùn)行時(shí)提供 DAS 的實(shí)現(xiàn),而應(yīng)用程序開發(fā)工具提供對(duì)數(shù)據(jù)圖的支持。

SDO 通過(guò)封裝數(shù)據(jù)訪問(wèn)的細(xì)節(jié)將業(yè)務(wù)應(yīng)用程序與技術(shù)改變相隔離,從而避開了技術(shù)改變產(chǎn)生的影響——重新編寫應(yīng)用程序以便跟上改變的技術(shù)(請(qǐng)參閱參考資料部分中的 Wikipedia)。例如,考慮一個(gè)設(shè)計(jì)用來(lái)從數(shù)據(jù)庫(kù)中讀取產(chǎn)品描述并將其作為網(wǎng)頁(yè)顯示的 Java Web 應(yīng)用程序。為了訪問(wèn)數(shù)據(jù)庫(kù)中的產(chǎn)品描述,應(yīng)用程序很可能使用 JDBC。假設(shè)不久后應(yīng)用程序拓?fù)浒l(fā)生了改變,在應(yīng)用程序和數(shù)據(jù)庫(kù)之間放置了 Web 服務(wù)?,F(xiàn)在,應(yīng)用程序不能再使用 JDBC 訪問(wèn)數(shù)據(jù),而是需要重做大量的工作來(lái)替換 Web 服務(wù)應(yīng)用編程接口 (API),例如文檔對(duì)象模型(Document Object Model,DOM)或者基于 XML 的遠(yuǎn)程過(guò)程調(diào)用的 Java API(Java APIs for XML-Based Remote Procedure Call,JAX-RPC)。SDO 避免了這個(gè)問(wèn)題;使用 SDO 編寫的應(yīng)用程序不必改變。

另外,SDO 提供了支持元數(shù)據(jù) API 的應(yīng)用程序、工具和框架來(lái)以統(tǒng)一的方式自省數(shù)據(jù)模型,而不管它的來(lái)源。DAS 將后端元數(shù)據(jù)轉(zhuǎn)換成標(biāo)準(zhǔn)的 SDO 格式。

SDO 類型可以由 Java 接口、XML Schema、關(guān)系型表和列、EJB、COBOL 記錄、消息或者 UML 來(lái)定義(請(qǐng)參閱參考資料部分中的 Catalog of OMG Modeling and Metadata Specifications);實(shí)現(xiàn)人員可以選擇自己喜歡的系統(tǒng)類型。簡(jiǎn)單 Java 和 XML 數(shù)據(jù)類型是有效的 SDO 數(shù)據(jù)類型,這為 Java 實(shí)現(xiàn)人員簡(jiǎn)化了一步。SDO 支持動(dòng)態(tài)的和靜態(tài)的數(shù)據(jù)訪問(wèn)模型,兩者也可以一起使用。我們將更詳細(xì)地考慮這些內(nèi)容:

  • 動(dòng)態(tài)模型(缺省值)允許編程人員通過(guò)名稱(字符串)獲得和設(shè)置數(shù)據(jù)圖中的數(shù)據(jù)元素。當(dāng) SDO 的類型在編譯階段未知時(shí),或者當(dāng)程序部署完以后可能要添加新的屬性時(shí),這特別有用??蛻魴C(jī)應(yīng)用程序或服務(wù)查詢 SDO 來(lái)了解它的結(jié)構(gòu),然后按名稱讀取和更新任何元素。例如,可以編寫一個(gè)泛型 SDO 訪問(wèn)函數(shù)并用特定于元素的元數(shù)據(jù)填充它來(lái)訪問(wèn)單獨(dú)的 SDO。SDO 同樣也使用 XML 路徑語(yǔ)言( XML Path Language,XPath)表達(dá)式的子集來(lái)支持快速遍歷許多 DataObject,例如 customer[1]/address/zip,以便快速訪問(wèn) customer DataObejct 的 zip 代碼。
  • 靜態(tài)模型使用命名和類型化 Java 接口。每個(gè)數(shù)據(jù)元素有自己的“getter”和“setter”方法。工具從 SDO 類型和屬性生成靜態(tài)接口。

SDO 對(duì)于數(shù)據(jù)表示非常重要,即使沒(méi)有典型的數(shù)據(jù)源也如此。這種用法的例子包括使用 Web 服務(wù)交換的 XML 消息、Java 消息服務(wù) (JMS) 消息、XML 文件等等。







示例

下面的例子——定義了包含客戶數(shù)據(jù)的數(shù)據(jù)對(duì)象——說(shuō)明了使用 Java 或 XML 來(lái)定義和使用 SDO 是多么的容易。示例 1(使用 XML)是 SDO 類型的基礎(chǔ)。


示例 1. 使用 XML 的 SDO 類型定義
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
                xmlns:tns="http://www.myvalue.com"
		targetNamespace="http://www.myvalue.com">
	<element name="customer" type="Customer"/>
	<complexType name="Customer">
		<sequence>
			<element name="customerID" type="string"/>
			<element name="firstName" type="string"/>
			<element name="lastName" type="string"/>
			<element name="stockSymbol" type="string"/>
			<element name="stockQuantity" type="int"/>
		</sequence>
	</complexType>
</schema>

												
										

示例 2 中,由前面的 XML 所生成的 Java 接口說(shuō)明了如何使用靜態(tài)接口。


示例 2. 使用 Java 的 SDO 類型定義
												
																		
public interface Customer {
	String getCustomerID();
	void setCustomerID(String customerID);
	String getFirstName();
	void setFirstName(String firstName);
	String getLastName();
	void setLastName(String lastName);	
        String getStockSymbol();
	void setStockSymbol(String stockSymbol);
	int getStockQuantity();
	void setStockQuantity(int stockQuantity);
}

												
										

一旦 SDO 類型定義好,就可以通過(guò)將類型定義傳遞給 SDO 數(shù)據(jù)工廠 (data factory) 來(lái)將其實(shí)例化(為數(shù)據(jù)對(duì)象分配存儲(chǔ)空間)。這個(gè)工廠僅僅是運(yùn)行時(shí)的一個(gè)組件,它的功能就是根據(jù) SDO 類型定義實(shí)例化 SDO 數(shù)據(jù)對(duì)象。

示例 3 示例 4 分別展示了如何通過(guò)傳遞 XML Schema 名稱空間和復(fù)雜的類型名稱(在示例 1 中定義的)或者 Java 接口類(在示例 2 中定義的)作為參數(shù)來(lái)創(chuàng)建 SDO。


示例 3. 使用 XML Schema 名稱空間和復(fù)雜的類型名稱參數(shù)創(chuàng)建 SDO
												
																		
DataObject customer = DataFactory.INSTANCE.create("http://www.myvalue.com", "Customer");

												
										



示例 4. 使用具有 Java 接口類參數(shù)的 SDO DataFactory 創(chuàng)建 SDO
												
																		
Customer customer = (Customer) DataFactory.INSTANCE.create(Customer.class);

												
										

在 SDO 實(shí)例化之后,實(shí)現(xiàn)就可以訪問(wèn)它了。示例 5示例 6 中的代碼示例分別展示了對(duì) Customer SDO 的動(dòng)態(tài)和靜態(tài)訪問(wèn)。


示例 5. 動(dòng)態(tài)訪問(wèn) SDO
												
																		
DataObject customer = ... ;
customer.setString("customerID", customerID);
...
customer.setInt("stockQuantity", 100);
String customerID = customer.getString("customerID");
...
int stockQuantity = customer.getInt("stockQuantity");

												
										



示例 6. 靜態(tài)訪問(wèn) SDO
												
																		
Customer customer = ... ;
customer.setCustomerID(customerID);
...
customer.setStockQuantity(100);
String customerID = customer.getCustomerID();
...
int stockQuantity = customer.getStockQuantity();

												
										

我們使用訪問(wèn) XML 文件服務(wù)和關(guān)系數(shù)據(jù)庫(kù)的例子來(lái)進(jìn)一步說(shuō)明由 SDO 推動(dòng)的編程模型的簡(jiǎn)單性。請(qǐng)注意,盡管技術(shù)之間存在差異,但是這些應(yīng)用程序是如此的相似。應(yīng)用程序開發(fā)人員能夠?qū)W⒂跇I(yè)務(wù)邏輯,而讓服務(wù)去處理更新持久數(shù)據(jù)存儲(chǔ)的實(shí)現(xiàn)細(xì)節(jié)。

示例 7. XML 文件服務(wù)

這個(gè)簡(jiǎn)單的例子將數(shù)據(jù)從 XML 文件加載到 SDO 數(shù)據(jù)圖,打印并更新數(shù)據(jù),然后將它寫回文件。(業(yè)務(wù)目標(biāo)是將“quot;Adam”改為“Kevin”。)

根據(jù)根 XML 元素和一個(gè)多值的 customer 屬性定義將要作為根 customers 數(shù)據(jù)對(duì)象讀入的 XML 文件。在 XML 文件中 Customers 為每個(gè) customer 元素包含一個(gè)數(shù)據(jù)對(duì)象。每個(gè) customer 具有兩個(gè)屬性:SNfirstName。
																				
																						<customers xmlns="http://customers.com">
	<customer SN="1" firstName="Adam" />
	<customer SN="2" firstName="Baker" />
</customers>

																				
																		

讀取文件數(shù)據(jù)。
																				
																						DataObject root = xmlService.load(InputStream);

																				
																		

遍歷 customer 數(shù)據(jù)對(duì)象列表并打印出每個(gè)名 (first name)。
																				
																						Iterator i = root.getList("customer").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("firstName");
	System.out.println(name);
}

																				
																		

將第一個(gè)客戶數(shù)據(jù)對(duì)象的 firstName 屬性設(shè)為 Kevin。中間件更新變更摘要(這里并沒(méi)有顯示出來(lái))來(lái)指示改變了的數(shù)據(jù)。
																				
																						DataObject customer1 = root.getDataObject("customer[1]");
customer1.setString("firstName", "Kevin");  // or

root.setString("customer[1]/firstName", "Kevin");


																				
																		

將數(shù)據(jù)對(duì)象寫入文件。
																				
																						xmlService.save(OutputStream, root);

																				
																		

結(jié)果是更新的 XML 文檔。
																				
																						<customers xmlns="http://customers.com">
  <customer SN="1" firstName="Kevin" />
  <customer SN="2" firstName="Baker" />
</customers>

																				
																		

示例 8. 訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)

雖然復(fù)雜的關(guān)系數(shù)據(jù)庫(kù)到 SDO 的映射是可行的,但是這個(gè)例子使用的是一個(gè)非常簡(jiǎn)單的映射:每個(gè)數(shù)據(jù)庫(kù)表都是一個(gè) SDO 類型,表的每行是 SDO 數(shù)據(jù)對(duì)象,而每列是 SDO 屬性。應(yīng)用程序邏輯是相同的:通過(guò)執(zhí)行預(yù)先定義好的查詢從數(shù)據(jù)庫(kù)中讀取、打印并更新數(shù)據(jù)(將“Adam”改為“Kevin”),將更改保存到數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)查詢返回 CUSTOMER 表中的兩行:

CUSTOMER ID(整數(shù),主鍵) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Adam Smith
2 Baker Street

下面給出了帶有解釋的 SDO 實(shí)現(xiàn)。

rdbService 查詢數(shù)據(jù)庫(kù)以獲得數(shù)據(jù)。
																				
																						DataObject root = rdbService.get(); 

																				
																		

相同的數(shù)據(jù)可能已經(jīng)用 XML 等價(jià)地表示了。
																				
																						<customers>
  <CUSTOMER ID="1" FIRSTNAME="Adam" LASTNAME="Smith"/>
  <CUSTOMER ID="2" FIRSTNAME="Baker" LASTNAME="Street"/>
</customers>

																				
																		

打印每個(gè)客戶名。
																				
																						Iterator i = root.getList("CUSTOMER").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("FIRSTNAME");
	System.out.println(name);
}

																				
																		

將第一個(gè)數(shù)據(jù)對(duì)象的 FIRSTNAME 設(shè)為 Kevin。中間件更新變更摘要(這里并沒(méi)有顯示出來(lái))來(lái)指示改變。
																				
																						DataObject customer1 = root.getDataObject("CUSTOMER[1]");
customer1.setString("FIRSTNAME", "Kevin"); // or

root.setString("CUSTOMER[1]/FIRSTNAME", "Kevin"); 

																				
																		

將更新的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。
																				
																						rdbService.update(root);

																				
																		

現(xiàn)在數(shù)據(jù)庫(kù)包含:

CUSTOMER ID(整數(shù),主鍵) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Kevin Smith
2 Baker Street

注意,第一行已經(jīng)被更新了。

如果在我們的示例應(yīng)用程序已經(jīng)獲得數(shù)據(jù)圖之后,另外一個(gè)應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)并更改了值會(huì)怎么樣?在寫入時(shí),數(shù)據(jù)訪問(wèn)服務(wù)檢查變更摘要來(lái)決定如何對(duì)數(shù)據(jù)源應(yīng)用更新。數(shù)據(jù)庫(kù)可以使用開放式并發(fā)控制 (optimistic concurrency control) 來(lái)確保這個(gè)改變之前最后包含的值是“Adam”(否則,另外一個(gè)應(yīng)用程序可能先改變數(shù)據(jù),可能在該應(yīng)用程序中需要某些錯(cuò)誤恢復(fù))。某些服務(wù)實(shí)現(xiàn)了更為高級(jí)的開放式并發(fā)形式;變更歷史記錄提供了那些算法所需要的原始值。

使用 EJB 時(shí),SDO 作為 DTO(也稱作值對(duì)象)J2EE 設(shè)計(jì)模式。一般來(lái)說(shuō),訪問(wèn)實(shí)體 EJB(Entity EJB)的每個(gè)屬性的開銷非常大,所以傳輸幾個(gè)數(shù)據(jù)圖中的 SDO 對(duì)象效率更高。會(huì)話 EJB(Session EJB)可能有方法產(chǎn)生和使用 SDO 圖來(lái)更加高效地直接訪問(wèn)實(shí)體 EJB。Customer 實(shí)體 EJB 封裝了對(duì) Customer 記錄的數(shù)據(jù)庫(kù)訪問(wèn)。會(huì)話 EJB 提供了訪問(wèn)方法來(lái)從 Customer 實(shí)體 EJB 產(chǎn)生和返回 Customer SDO 圖。


示例 9. 返回 SDO 和由 SDO 更新實(shí)體 EJB 的會(huì)話 Bean 接口
												
																		
public interface CustomerSession {
	Customer getCustomerByID(String customerID);
	Customers getCustomersByLastName(String lastName);
	void updateCustomers(Customers customers);
}

												
										

Customers 是包含若干客戶的 SDO 根數(shù)據(jù)對(duì)象。CustomersList 包含 Customer 數(shù)據(jù)對(duì)象。ChangeSummary 用來(lái)記錄對(duì) Customer 對(duì)象所做的全部更改,包括任何的添加、刪除或更新。updateCustomers() 方法利用所做的更改來(lái)更新 Customer 實(shí)體 EJB,并且可以在一個(gè)事務(wù)中批處理對(duì)數(shù)據(jù)源的更改。


示例 10. 使用 Java 的 Customer 的 SDO 類型定義
												
																		
public interface Customers {
	List<Customer> getCustomers();
	ChangeSummary getChanges();
}

												
										







總結(jié)

SDO 為所有數(shù)據(jù)源啟用了對(duì)應(yīng)用程序數(shù)據(jù)的統(tǒng)一訪問(wèn)和公共編程模型,而不管數(shù)據(jù)存儲(chǔ)在何地以及如何存儲(chǔ)。SDO 利用了 XML 的簡(jiǎn)易性,而又沒(méi)有引入 XML Schema 的復(fù)雜性或序列化的性能問(wèn)題。通過(guò)同時(shí)使用 SDO 和 SOA,可以將系統(tǒng)編程任務(wù)從業(yè)務(wù)邏輯中分離出來(lái),并且將其封裝在可重用的服務(wù)之中,而不是所有編程人員都必須掌握這些技能才能入門。它們?cè)跊](méi)有陷入技術(shù)和實(shí)現(xiàn)細(xì)節(jié)的情況下簡(jiǎn)化了業(yè)務(wù)應(yīng)用程序的編程,防止了技術(shù)改變產(chǎn)生的影響。有了 SDO,業(yè)務(wù)應(yīng)用程序就是名副其實(shí)的業(yè)務(wù)應(yīng)用程序。

posted on 2006-04-17 03:38 wsdfsdf 閱讀(238) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 技術(shù)文章

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久| 亚洲综合电影| 欧美在线影院| 免费中文字幕日韩欧美| 亚洲国产一区二区三区a毛片 | 欧美成人69| 欧美激情国产高清| 国产精品美女久久久久aⅴ国产馆| 国产精品毛片大码女人| 国产午夜久久| 亚洲国产第一| 午夜精品福利一区二区蜜股av| 久久久久久亚洲精品杨幂换脸| 欧美日本一区| 亚洲破处大片| 亚洲午夜国产一区99re久久| 欧美一区免费| 欧美日韩午夜在线| 红桃视频国产一区| 99精品视频免费观看视频| 午夜视频一区在线观看| 免费一区视频| 亚洲在线第一页| 欧美电影资源| 很黄很黄激情成人| 日韩特黄影片| 麻豆成人小视频| 亚洲小视频在线观看| 久久人人爽人人| 国产精品久久久久久久久久尿 | 亚洲人成啪啪网站| 亚洲欧美日韩综合一区| 欧美黄污视频| 一区二区三区在线高清| 欧美一级电影久久| 99国产一区二区三精品乱码| 久久久久国产一区二区| 国产日本欧美在线观看| 亚洲一区二区三区免费观看| 欧美成人午夜免费视在线看片| 午夜精品久久久久久久99水蜜桃| 欧美视频一区| 一区二区三区成人| 欧美高清在线精品一区| 久久婷婷蜜乳一本欲蜜臀| 狠狠色丁香久久综合频道| 欧美中文在线字幕| 先锋影音国产精品| 国产日韩欧美夫妻视频在线观看| 亚洲在线观看视频| 中文精品99久久国产香蕉| 欧美日韩亚洲一区二| 99香蕉国产精品偷在线观看| 亚洲福利视频免费观看| 欧美韩日高清| 日韩亚洲欧美成人一区| 亚洲午夜久久久久久尤物 | 亚洲高清在线观看一区| 久久婷婷人人澡人人喊人人爽| 黄色成人在线网站| 免费在线视频一区| 欧美v日韩v国产v| 亚洲六月丁香色婷婷综合久久| 亚洲高清不卡在线观看| 欧美日韩1080p| 亚洲免费一在线| 欧美一区二区三区的| 久久九九精品99国产精品| 欧美一区二区三区成人| 狠狠色狠色综合曰曰| 欧美1区免费| 欧美精品xxxxbbbb| 亚洲男人av电影| 亚洲欧美日韩精品一区二区 | 一区二区精品在线| 国产精品激情偷乱一区二区∴| 亚洲免费视频观看| 性欧美18~19sex高清播放| 国产一区二区久久久| 免费在线成人av| 欧美激情视频免费观看| 亚洲一区二区三区四区视频| 欧美在线免费| 亚洲看片一区| 一区二区三区日韩| 国产精品亚洲网站| 免费成人激情视频| 欧美日韩在线一区二区三区| 亚洲欧美日韩一区二区在线| 久久激情婷婷| 一区二区三区日韩精品| 欧美一区国产一区| 国产精品99久久99久久久二8| 亚洲女与黑人做爰| 亚洲高清一区二| 一本色道久久综合精品竹菊| 经典三级久久| 亚洲视频一二| 亚洲第一狼人社区| 午夜国产精品影院在线观看| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美日韩一区高清| 你懂的成人av| 国产欧美日本一区二区三区| 亚洲福利av| 国产日韩欧美亚洲一区| 亚洲精品偷拍| 亚洲国产日韩欧美在线图片| 亚洲男人的天堂在线| 亚洲另类一区二区| 久久精品一本久久99精品| 在线亚洲精品福利网址导航| 久久伊人亚洲| 久久中文在线| 国产亚洲人成网站在线观看| 在线一区二区三区做爰视频网站| 亚洲国产日日夜夜| 久久久久久自在自线| 欧美在现视频| 国产精品久99| 亚洲午夜精品国产| 在线一区二区三区做爰视频网站| 牛牛影视久久网| 日韩视频在线观看国产| 亚洲综合色自拍一区| 午夜伦理片一区| 亚洲一区www| 欧美日韩成人免费| 蜜桃伊人久久| 在线播放日韩欧美| 久久精品人人爽| 狂野欧美激情性xxxx欧美| 国产一区日韩一区| 欧美伊人久久| 久久一区二区三区四区| 国产中文一区| 久久国产精品72免费观看| 久久精品亚洲国产奇米99| 国产一区二区三区在线免费观看 | 免费一级欧美在线大片| 国产自产精品| 久久亚洲精品一区二区| 麻豆亚洲精品| 亚洲另类自拍| 国产精品国产馆在线真实露脸| 一卡二卡3卡四卡高清精品视频| 亚洲一区二区免费在线| 国产精品免费在线| 久久99在线观看| 欧美成人免费全部观看天天性色| 亚洲国产乱码最新视频| 欧美激情视频网站| 亚洲私人黄色宅男| 久久人人爽人人爽爽久久| 韩日精品视频| 欧美肥婆bbw| 亚洲午夜电影| 久久视频在线看| 亚洲区第一页| 国产精品亚洲一区| 久久亚洲国产精品一区二区| 亚洲国产精品久久久久秋霞不卡| 亚洲无线观看| 在线观看国产一区二区| 欧美日韩久久久久久| 欧美一级在线视频| 亚洲福利视频免费观看| 香蕉免费一区二区三区在线观看| 一区二区三区在线观看国产| 欧美日韩中文字幕| 久久久久高清| 亚洲视频在线观看| 亚洲国产精品福利| 欧美在线观看视频一区二区| 亚洲国产欧美一区二区三区同亚洲| 欧美日韩一区二区三区在线观看免| 久久成人久久爱| 亚洲最快最全在线视频| 欧美va亚洲va国产综合| 亚洲欧美日韩国产一区二区| 亚洲第一精品夜夜躁人人爽| 国产精品永久免费视频| 欧美精品网站| 久久伊人亚洲| 午夜精品久久久久久久99热浪潮| 亚洲欧洲三级| 欧美成熟视频| 久久婷婷国产综合精品青草| 亚洲欧美日韩综合一区| 一本色道久久综合亚洲精品高清| 在线观看日韩精品| 亚洲欧美国产视频| 欧美成人四级电影| 久久久一区二区| 亚洲女ⅴideoshd黑人|