精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Worklight中適配器的開發

移動開發
基于 Worklight 可以開發安裝于手機端的應用和部署于服務器端的適配器(adapter),通過適配器應用可以訪問數據庫和外部系統,這樣新開發的移動應用就可以方便的和其他系統進行集成。

文章將通過基于 Eclipse 的 IDE,來開發 Worklight 支持的 HTTP 和 SQL 適配器;并且演示測試適配器的方法,最后,通過集成應用、適配器和 Web Service 來體現適配器在開發移動應用中的重大作用。

Worklight 中適配器的架構

WorklightWorklight作為一個移動程序的開發平臺,通過三種模式(Web、混合、本地)支持了不同需求的客戶端開發,但是面臨的一個現實問題是如何和已有的系統進行良好的集成。適配器(adapter)是平臺的服務器端組件,作為一個傳輸層負責Worklight 服務器和不同企業級后臺的連接。通過平臺支持的 HTTP 和 SQL 適配器,客戶端應用可以與原有系統方便的進行數據訪問,這減少了重復的開發工作。

適配器由三部分組成:基于 XML 的配置文件,用于定義適配器的類型和提供的方法;基于 JS 的方法實現文件,通過 Mozilla Rhino 解析器實現對不同后臺的訪問;基于 XSL 文件的數據轉化規則,在 HTTP 適配器中存在,用于將獲得的數據按照一定規則進行轉化。

Worklight支持的適配器提供了如下特性:

  • 快速開發:開發者可以使用便捷而強大的服務器端 JavaScript 創建簡潔易讀的代碼,用于和不同后臺程序的集成。
  • 只讀操作和事務操作:平臺通過適配器支持對后臺系統的只讀和事物操作。
  • 安全:適配器使用靈活的認證機制創建與后臺的連接,使用的用戶可以是系統用戶也可以是事務中操作的用戶。
  • 可擴展性:適配器通過 cache 機制減少了與后臺系統的交互,并且通過配置,限定和后臺系統建立的連接數。
  • 數據透明:適配器提供了獲取后臺數據的統一接口,這樣開發者在獲取數據時就不需要關注數據源、格式和傳輸協議信息。

圖 1. 適配器架構
圖 1. 適配器架構

圖 1 描述了適配器和前臺的 app 以及后臺系統間數據交互的過程,具體的流程如下:

  1. 適配器暴露一系列的方法,稱之為 procedures,前臺 app 通過 Ajax 方式調用這些過程。
  2. 這些方法從后臺獲取相應信息。
  3. 后臺系統返回的數據格式如下
    1. 如果格式為 JSON,Worklight服務器直接返回。
    2. 如果格式不是 JSON,服務器將數據格式轉化為 JSON 后,再返回。
  4. 這些方法將獲得的 JSON 數據進行業務處理,將最終結果返回給 app。

基于 Eclipse 的適配器開發

根據適配器連接的后臺種類,它被分為 HTTP 適配器和 SQL 適配器。在實際的應用中 SQL 適配器用于連接不同的后臺數據庫,并通過 SQL 語句或存儲過程進行訪問。適配器目前支持 MySQL 和 Oracle 的數據庫,并且在幾個月后將支持 DB2 數據庫。HTTP 適配器支持訪問 soap 服務和 rest 服務,并且可以根據指定的 XSL 文件對獲得的數據片段進行轉化,獲得用戶需要的數據和格式。

為了更好的演示不同適配器的作用和相互合作的方法,文章將構建如下場景:

  • 首先創建 SQL 適配器,并且提供對于 SQL 語句和存儲過程的訪問。
  • 然后創建 HTTP 適配器,用于訪問由 Axis2 框架構建的 Web Service。
  • 通過 Eclipse 提供的測試環境,對于前面創建的適配器進行測試,并且解釋測試返回信息的含義。
  • 最后通過開發一個應用,并且整合上述的適配器,完成一個完整的功能。
 adapter-jndi-name = ${custom-db.1.jndi-name} 
 custom-db.1.relative-jndi-name = jdbc/worklight_adapter 
 custom-db.1.driver = com.mysql.jdbc.Driver 
 custom-db.1.url = jdbc:mysql://localhost:3306/worklight_adapter 
 custom-db.1.username = root 
 custom-db.1.password = root 

在安裝有Worklight 插件的 Eclipse 下開發適配器通過下面的步驟可以完成:

新建工程和 SQL 適配器:

  • 點擊 File-> New -> Project -> Worklight -> Worklight Project
  • 輸入工程名稱:HelloAdapterProj,點擊確認,完成工程創建
  • 點擊 File-> New -> Other -> Worklight -> Worklight Adapter
  • 輸入應用名稱:MySQLAdapter,選擇 HelloAdapterProj 作為工程,在適配器類型中選擇 SQL Adapter,點擊確認,完成 SQL 適配器創建

創建完畢的適配器其文件結構如下:

  • MySQLAdapter.xml:在文件中定義了很多的屬性,比如適配器在Worklight 控制臺中顯示的名稱和簡單描述,最大的連接數等等,其中最重要的是下列兩個參數:
    • dataSourceJNDIName 定義了適配器所連接的 JNDI 的名稱,具體的配置將在下面敘述
    • procedure 定義適配器向外提供的方法名稱(需要通過 .js 文件實現)
  • MySQLAdapter-impl.js:在文件中實現了兩個方法,getAllCountries 用于調用數據庫中的存儲過程;getOneCountryID 通過調用 SQL 語句獲取相應的信息

對于適配器需要的 JNDI 參數,可以通過修改 Worklight 的配置文件實現。在 Worklight 框架中存在一個默認的配置文件 default.worklight.properties,用戶可以通過修改 worklight.properties 文件來覆蓋默認配置文件中的一些屬性。清單 1 描述了為連接本地的 SQL 數據庫,在 worklight.properties 添加的配置信息:

清單 1. JNDI 配置

  1. adapter-jndi-name = ${custom-db.1.jndi-name}  
  2. custom-db.1.relative-jndi-name = jdbc/worklight_adapter  
  3. custom-db.1.driver = com.mysql.jdbc.Driver  
  4. custom-db.1.url = jdbc:mysql://localhost:3306/worklight_adapter  
  5. custom-db.1.username = root  
  6. custom-db.1.password = root  

所有帶有 custom 屬性的參數均為Worklight 保留的參數,適配器部署到服務器后,系統會讀取 XML 文件中的 dataSourceJNDIName 屬性,然后根據 JNDI 配置的信息來建立數據庫的連接。

清單 2. SQL 適配器配置

  1. <connectivity>  
  2.     <connectionPolicy xsi:type="sql:SQLConnectionPolicy">  
  3.         <dataSourceJNDIName>${adapter-jndi-name}</dataSourceJNDIName>  
  4.     </connectionPolicy>  
  5.     <loadConstraints maxConcurrentConnectionsPerNode="5" />  
  6.  </connectivity>  
  7.  
  8.  <procedure name="getAllCountries"/>  
  9.  <procedure name="getOneCountryID"/>  

清單 3. SQL 適配器方法實現

  1. var procedure1Statement =  
  2.   WL.Server.createSQLStatement("select * from country where name = ?;");  
  3.  
  4.  function getAllCountries() {  
  5.     return WL.Server.invokeSQLStoredProcedure({  
  6.         procedure : "getAllCountries",  
  7.         parameters : []  
  8.     });  
  9.  }  
  10.  
  11.  function getOneCountryID(name) {  
  12.     var result = WL.Server.invokeSQLStatement({  
  13.         preparedStatement : procedure1Statement,  
  14.         parameters : [name]  
  15.     });  
  16.  
  17.     var id = result.resultSet[0].index1;  
  18.  
  19.     return getLeagueInfo(id);  
  20.  }  

在 JS 文件中,函數通過調用 WL.Server.invokeSQLStoredProcedure 方法執行后臺數據庫提供的存儲過程,調用 WL.Server.invokeSQLStatement 方法實現了對 SQL 語句的執行,方法需要的參數和函數的具體說明,用戶可以在Worklight 提供的開發者手冊上了解它的詳細使用過程。

HTTP 適配器

建立 HTTP 適配器的過程類似 SQL 適配器:

  • 點擊 File-> New -> Other -> Worklight -> Worklight Adapter
  • 輸入應用名稱:HTTPAdapter,選擇 HelloAdapterProj 作為工程,在適配器類型中選擇 HTTP Adapter,點擊確認,完成 HTTP 適配器創建

HTTP 適配器的內容比 SQL 適配器略微復雜一些,除了上面介紹的 XML 和 JS 文件之外,還包括一個 XSL 文件。XSL 文件將根據規則對獲取的內容進行轉化,去除不需要的數據,改變數據的變量名,這樣可以對數據進行先期的編輯。

清單 4. HTTP 適配器配置

  1. <connectivity>  
  2.     <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">  
  3.         <protocol>http</protocol>  
  4.         <domain>localhost</domain>  
  5.         <port>8081</port>  
  6.     </connectionPolicy>  
  7.     <loadConstraints maxConcurrentConnectionsPerNode="2" />  
  8.  </connectivity>  
  9.  
  10.  <procedure name="getLeauge"/>  

清單 5. HTTP 適配器方法實現

  1. function getLeauge(id) {  
  2.     var input = {  
  3.         method : 'get',  
  4.         returnedContentType : 'xml',  
  5.         path : "axis2/services/LeagueService/getLeague",  
  6.         parameters : {  
  7.             'index' : id,  
  8.         },  
  9.         transformation : {  
  10.             type : 'xslFile',  
  11.             xslFile : 'filtered.xsl' 
  12.         }  
  13.     };  
  14.  
  15.     return WL.Server.invokeHttp(input);  
  16.  }  

在 XML 文件中配置 WS 的地址,定義提供的方法;然后在 JS 中調用 WL.Server.invokeHttp 方法完成對后臺數據的提取和轉化。雖然 JS 方法的參數只有一個,但是參數是 JSON 格式,其中包含著單獨的變量,其定義如下:

  • method: 確認調用的方法是 get 還是 post
  • returnedContentType: HTTP 服務返回的數據格式,這影響到應用解析數據的方式
  • returnedContentEncoding: 返回數據格式的編碼格式,默認為 utf-8
  • path: 指定 WS 的路徑和方法
  • headers: HTTP 請求的頭
  • cookies: HTTP 請求的 cookie 信息
  • body: 在方法是 post 時編寫相應的內容
  • transformation: 轉化數據的參數,包括 XSL 文件的位置和轉化的格式

數據的轉化

在 第 1 節 中描述了適配器和前臺的 app 以及后臺系統間數據交互的過程,在第三步中,如果開發者定義了相應的 XSL 文件,那么轉化成 JSON 格式的過程就要分為兩步:

  1. 服務器首先將后臺的數據轉化為 XML 格式
  2. 通過 XSL 文件轉化后,再將數據轉化為 JSON 格式

清單 6. XSL 文件轉化

  1. <xsl:template match="/">  
  2.    {  
  3.        Items: [  
  4.        <xsl:for-each select="//*[local-name() = 'return']">  
  5.   {  
  6.        ranking: '<xsl:value-of select="*[local-name() = 'ranking']"/>',  
  7.        name: '<xsl:value-of select="*[local-name() = 'name']"/>',  
  8.        round: '<xsl:value-of select="*[local-name() = 'round']"/>',  
  9.        win: '<xsl:value-of select="*[local-name() = 'win']"/>',  
  10.        draw: '<xsl:value-of select="*[local-name() = 'draw']"/>',  
  11.        lose: '<xsl:value-of select="*[local-name() = 'lose']"/>
  12.        },  
  13.        </xsl:for-each>  
  14.        ]  
  15.    }  
  16. </xsl:template>  

在示例中,由于 WS 是根據 Axis2 框架編寫的,所以返回的 XML 文件中的標簽會有前綴,為了實現只對其中部分數據的抽取,需要使用一定的 XSL 函數進行匹配(在示例中使用了 local-name 函數),具體的 XSL 函數說明參見 XSL 文檔。

適配器的測試

在開發平臺上,還提供了適配器的測試方法,為了測試適配器,需要按照如下方法進行:

  • 右擊適配器 -> Run As -> Deploy Worklight Adapter
  • 在部署成功后,右擊適配器 -> Run As -> Invoke Worklight Procedure

系統會顯示如下的測試環境,根據選取的方法和填入的參數,完成對適配器的測試。

圖 2. 適配器測試界面
圖 2. 適配器測試界面

從返回的數據可以看到,如果測試成功,那么系統將返回完整的結果集(resultSet)并且將 isSuccessful 標志位置為 true;如果失敗,在 errors 信息位中,有詳細的信息,并且 isSuccessful 標志位置為 false。

在示例中,在 WS 沒有啟動的情況下,測試系統會得到服務器不可連接的錯誤;而當設置的 XSL 規則有問題時,則會提示描述解析 XML 文件發生錯誤。

圖 3. 適配器測試錯誤(連接)
圖 3. 適配器測試錯誤(連接)

圖 4. 適配器測試錯誤(解析)
圖 4. 適配器測試錯誤(解析)

從上面的描述可以看出,適配器的測試是易于實現的,并且在平臺的支持下,提供了詳細的調試信息,但是單純的適配器只能返回數據,為了展示返回的數據,必須和客戶端的應用集成,所以接下來的示例將描述應用和適配器集成的方法。

適配器的集成

為了訪問部署在服務器上的適配器,應用可以通過Worklight 提供的 JS 函數來訪問也可以通過Worklight 支持的本地語言來訪問。在 JS 函數情況下方法的參數分為兩個部分:

  • invocationData: 調用適配器需要的參數
    • adapter 表示適配器的名稱
    • procedure 表示適配器中的函數名稱
    • parameters 表示傳遞給適配器的參數
  • 回調函數 : 當調用適配器成功或者失敗時,需要提供相應的回調函數。onSuccess 函數在調用適配器成功時使用,onFailure 函數在調用適配器失敗時使用

清單 7. 客戶端對于適配器調用

  1. function wlCommonInit() {  
  2.    busyIndicator = new WL.BusyIndicator("AppBody");  
  3.    $('nationList').observe('change', nationSelectionChange);  
  4.    getNationList();  
  5. }  
  6.  
  7. function getNationList() {  
  8.    busyIndicator.show();  
  9.    var invocationData = {  
  10.        adapter : 'MySQLAdapter',  
  11.        procedure : 'getAllCountries',  
  12.        parameters : []  
  13.    };  
  14.  
  15.    WL.Client.invokeProcedure(invocationData, {  
  16.        onSuccess : getNationListSuccess,  
  17.        onFailure : getNationListFailure  
  18.    });  
  19. }  

當應用啟動時,系統調用 wlCommonInit 函數,通過對 SQL 適配器的訪問,調用存儲過程,當用戶從選擇項中,確認一個數據后,調用 SQL 語句獲取結果。為了程序流程的簡潔,應用只和 SQL 適配器交互,但是當需要調用 HTTP 適配器時,在 SQL 適配器中定義了和 HTTP 適配器交互的代碼。

上述流程帶來了好處是:因為 HTTP 適配器和 SQL 適配器均部署在服務器端,所以在訪問 HTTP 適配器時,不涉及客戶端應用和 HTTP 適配器的交互,減少訪問的流量;同時暴露的接口也只有 SQL 適配器,方便了管理;更為重要的是,適配器可以利 cache 功能,儲存相應的數據,減少系統的負載。

通過本地程序訪問適配器時,根據語言的不同,實現的方式也不同,在 Java 中需要繼承 WLResponseListener 接口,在 Objective-C 中需要繼承 WLDelegate 協議,詳細的過程可以在開發相應的程序時查看Worklight 的開發文檔。

結束語

適配器作為Worklight 平臺的一個關鍵模式,不但方便了開發者將新的應用和原有的系統集成,還為移動應用的開發提供了統一的數據接口。基于這個模式,程序員可以將關鍵的流程處理放在服務器端,對于客戶端只暴露接口,提供輸入和輸出的定義,這符合編程模式中服務優先的原則。

適配器還提供了兩種很重要的功能:

1. 適配器保護功能,在安全配置上,對重要的適配器方法進行保護,這樣訪問相應的方法就需要進行用戶驗證;

2. 適配器驗證功能,在安全驗證上,原有的系統可能有各種驗證方式,使用適配器可以在服務器端編程,用于和原系統的驗證模式結合,這樣就可以適應各種不同的驗 證方式。

責任編輯:佚名 來源: 風信網
相關推薦

2012-12-10 10:53:04

IBMdW

2018-10-11 10:38:31

前端JavaScript編程語言

2021-02-16 08:16:09

適配器模式MybatisJava

2015-08-07 10:05:37

recyclervie超省寫法

2022-02-18 17:21:29

適配器模式客戶端

2020-10-25 08:56:21

適配器模式

2021-08-06 06:51:16

適配器配置Spring

2022-02-13 23:33:24

設計模式Java

2011-04-28 09:54:50

jQuery

2013-11-26 16:39:21

Android設計模式

2021-02-18 08:39:28

設計模式場景

2012-05-16 17:22:11

Java設計模式

2009-12-21 10:26:09

Oracle適配器

2009-11-18 18:08:20

PHP適配器模式

2012-08-02 10:46:34

JavaAdapter模式

2010-07-09 12:53:30

HART協議

2025-06-05 01:45:00

Spring框架適配器

2014-12-17 09:57:01

AndroidAdapteViewHolder

2013-02-26 10:55:47

C#適配器設計模式

2014-07-17 10:55:10

Win8.1應用開發適配器模式
點贊
收藏

51CTO技術棧公眾號

97在线观看视频国产| 在线视频你懂得一区| 成人h视频在线| 一本一本久久a久久| 日韩精品第二页| 中文字幕一区二区三区av| 91影视免费在线观看| 欧产日产国产v| www.爱久久| 日韩欧美亚洲成人| 日韩中文一区二区三区| 国产在成人精品线拍偷自揄拍| 国产精品久久占久久| 黑人欧美xxxx| 亚洲欧洲中文| 亚洲黄色精品视频| 久久激情一区| 中文字幕日韩高清| 亚洲少妇一区二区三区| 蜜桃视频在线观看播放| 国产欧美日韩精品一区| 亚洲最大成人网色| 一区二区三区视频免费看| 国产影视一区| 制服丝袜亚洲精品中文字幕| 日韩国产小视频| 欧美成熟毛茸茸| 激情久久久久久久久久久久久久久久| 欧美另类69精品久久久久9999| 亚洲熟女乱综合一区二区三区| 欧美国产日韩电影| 成人欧美一区二区三区白人| 国产三区二区一区久久| 一二区在线观看| 99人久久精品视频最新地址| 在线亚洲国产精品网| 成年人看片网站| 日本欧美不卡| 亚洲一区二区三区四区在线| 亚洲国产日韩美| 五月婷婷开心中文字幕| 青青草精品视频| 97国产suv精品一区二区62| 中文乱码字幕高清一区二区| 五月天亚洲一区| 日韩区在线观看| 青青在线视频免费| 91九色国产在线播放| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产欧美视频在线观看| 国产精品一区二区三区免费 | 精久久久久久| 超碰日本道色综合久久综合| 中文字幕 自拍| 欧美黑人巨大videos精品| 日韩一级完整毛片| 亚洲视频一二三四| 97成人超碰| 日韩欧美中文第一页| 日本a视频在线观看| 丝袜美女在线观看| 亚洲精品福利视频网站| 日本福利视频导航| 天堂地址在线www| 欧美国产乱子伦| 日本午夜一区二区三区| 欧美 日韩 国产 在线| 高清在线不卡av| 91影院未满十八岁禁止入内| 久久久999久久久| 久久xxxx精品视频| 欧美自拍视频在线| 日韩视频免费观看高清| 极品av少妇一区二区| 欧美激情中文字幕在线| 麻豆影视在线播放| 极品少妇一区二区三区| 欧美激情中文字幕乱码免费| 久久亚洲精品大全| 亚洲毛片视频| 情事1991在线| 日产精品久久久| 美女精品在线| 国产福利视频一区| 自拍偷拍福利视频| 久久99精品久久久久久| 成人看片人aa| 亚洲精品国产一区二| 高清不卡一区二区| 精品欧美一区二区精品久久| 亚洲国产精品久久人人爱潘金莲 | 欧美日韩一区二区综合| 俺去了亚洲欧美日韩| 91高清免费看| 欧美日韩1区| 国产做受69高潮| 亚洲天堂视频网站| 久久精品99国产国产精| 91老司机精品视频| 亚洲第一页综合| 国产不卡在线播放| 久久精品日产第一区二区三区| 青青色在线视频| 国产精品午夜免费| 久久久成人精品一区二区三区 | 中文字幕日韩av综合精品| 国产在线观看免费视频软件| 欧美特黄一区| 国产成人精品一区| jlzzjlzzjlzz亚洲人| 国产乱对白刺激视频不卡| 国产精品二区在线| 国模无码一区二区三区| 国产欧美一区二区精品性| 中文字幕中文字幕一区三区| 美女尤物在线视频| 在线观看91视频| 亚洲va在线va天堂va偷拍| 国产日韩三级| 日韩中文在线观看| 国产免费观看av| 精彩视频一区二区三区| 精品国产免费一区二区三区| 1pondo在线播放免费| 亚洲综合在线观看视频| 91国产精品视频在线观看| 一区二区三区无毛| 亚洲精品日韩在线| 欧美成欧美va| 蜜臀精品久久久久久蜜臀| 精品免费国产| 黄色网址在线免费播放| 色久综合一二码| 动漫美女无遮挡免费| 97精品国产福利一区二区三区| 久久久爽爽爽美女图片| 一级全黄少妇性色生活片| 久久色在线观看| 国产成人在线小视频| 日韩在线电影| 亚洲欧美中文字幕| 豆国产97在线 | 亚洲| 韩国女主播成人在线| 视频一区二区三| 日韩激情电影| 91精品一区二区三区在线观看| 国产精品一区二区入口九绯色| 在线中文字幕亚洲| 成人福利在线观看| 天堂аⅴ在线地址8| 欧美午夜视频网站| 蜜桃av免费看| 国产精品日韩精品欧美精品| 99精品国产高清一区二区| 日本不卡不卡| 欧美日韩在线播放三区四区| 国产91色在线|亚洲| 熟妇高潮一区二区高潮| 亚洲美女一区二区三区| 爱豆国产剧免费观看大全剧苏畅| 久久综合欧美| 青青久久av北条麻妃黑人| 天天干视频在线| 一区二区视频在线| 91人人澡人人爽| 欧美久久99| 99精品欧美一区二区三区| 91视频在线观看| 欧美影片第一页| 一区二区三区在线观看免费视频| 乱人伦精品视频在线观看| 久久偷窥视频| 我爱我色成人网| 亚洲欧美日韩综合| 日韩不卡高清视频| 国产欧美日韩另类一区| 97国产精东麻豆人妻电影| 天海翼亚洲一区二区三区| 欧美一级淫片播放口| 亚洲av成人精品一区二区三区在线播放 | 中文人妻av久久人妻18| 久久美女艺术照精彩视频福利播放| 亚洲国产精品一区二区第一页| 国产成+人+综合+亚洲欧美| 久久亚洲国产精品| 特黄视频在线观看| 欧美日韩精品一区二区三区| 麻豆changesxxx国产| 久久免费偷拍视频| 伊人精品视频在线观看| 一本综合久久| 亚洲啪啪av| 国产日韩三级| 91精品久久久久久久久久久久久| 性欧美猛交videos| 亚洲天堂男人的天堂| 国产日韩欧美一区二区东京热| 黑丝美女久久久| 加勒比婷婷色综合久久| 99精品国产视频| 91免费视频污| 视频一区欧美精品| 被灌满精子的波多野结衣| 精品日韩免费| 精品视频一区二区| 精品视频在线播放一区二区三区| 亚州成人av在线| 国产高清一区二区三区视频| 亚洲黄色有码视频| 国产色视频在线| 在线观看不卡一区| 日本午夜视频在线观看| 亚洲精品免费播放| 永久免费毛片在线观看| 97成人超碰视| 日本人dh亚洲人ⅹxx| 免费在线观看精品| 美女福利视频在线| 在线精品一区| 成人av在线播放观看| 97人人精品| 色女人综合av| 欧美美女在线| 精品视频第一区| 91精品短视频| 97久久人人超碰caoprom欧美 | 色综合久久综合| 国产第一页第二页| 亚洲一区视频在线观看视频| 亚洲欧美小视频| 国产精品福利电影一区二区三区四区 | 精品人妻大屁股白浆无码| 99久久夜色精品国产亚洲96| 热re99久久精品国产99热| 日韩电影不卡一区| 国产精品成人一区二区三区| 99精品视频在线免费播放| 国产日韩欧美在线观看| a屁视频一区二区三区四区| 国产99久久精品一区二区 夜夜躁日日躁| 成人福利电影| 欧美高跟鞋交xxxxhd| 成年视频在线观看| 久久亚洲春色中文字幕| av毛片在线看| 欧美日本高清一区| 久久av色综合| 国语对白做受69| 老司机深夜福利在线观看| 欧美精品久久一区二区| 97人人爽人人澡人人精品| 韩国日本不卡在线| 热色播在线视频| 青青在线视频一区二区三区| 欧美天堂视频| 国产精品人成电影在线观看| 四虎国产精品永久在线国在线| 成人精品视频99在线观看免费| 久久av影院| 亚洲一区二区中文| 91夜夜蜜桃臀一区二区三区| 国产亚洲欧美一区二区三区| 婷婷激情久久| 亚洲免费久久| 欧美96在线丨欧| 男人的天堂狠狠干| 久久在线精品| 日本熟妇人妻中出| 国内成人免费视频| 国产性猛交96| 久久精品人人做| 波多野结衣在线网址| 一区二区三区四区不卡在线 | 欧美日韩精品在线| 午夜影院免费在线观看| 日本道免费精品一区二区三区| www.久久网| 日韩一卡二卡三卡国产欧美| 少妇精品视频一区二区| 国产香蕉精品视频一区二区三区 | 超碰福利在线观看| 亚洲精品v天堂中文字幕| 国产大片在线免费观看| 久久精品在线视频| 国产网站在线| 国产美女精品免费电影| caoporn成人| 欧洲亚洲一区二区三区四区五区| 97精品一区| 无码精品a∨在线观看中文| 美女视频黄免费的久久 | 欧美国产成人在线| 九九热国产精品视频| 色婷婷综合久久久久中文一区二区| 一区二区三区亚洲视频| 亚洲国产小视频| 欧美成人高清在线| 欧美在线视频网站| 欧美a在线观看| 日韩久久在线| 亚洲国产精品第一区二区三区| 在线观看高清免费视频| 成人永久aaa| 日本免费网站视频| 色婷婷综合激情| 可以免费看毛片的网站| 精品国产欧美一区二区五十路| 欧美男男激情videos| 2022国产精品| 色喇叭免费久久综合| 老太脱裤子让老头玩xxxxx| 国内精品在线播放| 亚洲天堂久久新| 亚洲成精国产精品女| 91超薄丝袜肉丝一区二区| 精品亚洲一区二区三区在线观看| yellow91字幕网在线| 国产精品老牛影院在线观看| 欧美影院天天5g天天爽| 黄色影视在线观看| 蜜桃av一区二区| 自拍偷拍中文字幕| 午夜精品福利一区二区三区av| 91国内精品视频| 亚洲片av在线| 狠狠躁少妇一区二区三区| 91九色极品视频| 91精品国产91久久综合| 美女黄色片视频| 91蝌蚪porny| 久久无码精品丰满人妻| 日韩欧美一二三| 2024最新电影免费在线观看| 91美女片黄在线观看游戏| 欧美一区电影| 美女黄色片视频| 国产精品婷婷午夜在线观看| 无码人妻精品一区二区| 亚洲女在线观看| 一区一区三区| 欧美日韩亚洲一区二区三区在线观看 | 久久精品久久精品亚洲人| 欧美午夜三级| 中文字幕成人一区| 国产一区在线不卡| 国产精品精品软件男同| 91精品在线一区二区| 成人video亚洲精品| 99re视频在线播放| 欧美三级网页| 美女扒开腿免费视频| 黄色精品一区二区| 嫩草在线播放| 国产精品网站视频| 天天影视欧美综合在线观看| 欧美激情第四页| 亚洲一二三四在线观看| 乱精品一区字幕二区| 91成人在线观看国产| 视频一区欧美| 蜜臀一区二区三区精品免费视频| 国产精品国产a| 精品国产伦一区二区三| 97国产精品久久| 欧美日韩国产免费观看视频| 岛国毛片在线播放| 亚洲精品久久久蜜桃| 欧美视频一二区| 国产精品91视频| 欧美影视一区| 精品一区二区视频在线观看| 日韩欧美一区视频| 黄色动漫在线观看| 精品国产一二| 喷水一区二区三区| 久久久久亚洲av无码专区体验| 亚洲成avwww人| 深夜成人影院| 男女爱爱视频网站| 久久久久久毛片| 91片黄在线观看喷潮| 欧美精品18videos性欧| 国产成人精品一区二区免费看京| 中文字幕线观看| 欧美性videos高清精品| 在线激情免费视频| 精品午夜一区二区三区| 久久精品国产99久久6| 日韩av无码中文字幕| 中文字幕免费精品一区高清| av成人男女| 欧美午夜aaaaaa免费视频| 亚洲影视在线观看| wwwxxx在线观看| 国产手机精品在线| 紧缚奴在线一区二区三区| 亚洲午夜18毛片在线看| 久久伊人91精品综合网站| 精品在线手机视频| 韩国三级在线看|