亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > XML > 正文

一個使用Apache SDO處理XML數據的例子

2024-09-05 20:56:02
字體:
來源:轉載
供稿:網友

   本文給出了一個使用apache sdo處理xml數據的例子。由于sdo現在還不是處理xml的標準的解決方案,因此,本文還討論了sdo中的基本的操作xml數據的方法。

    跟蹤數據的變化在很多軟件、應用程序和商業(yè)場景中是一個基本的要求。如果要嚴格地實現這個需求是非常困難的,這主要是因為對文件的不同變化建模,并監(jiān)視這些變化一般很難做到。從另一方面講,在所有的程序中反復地實現這種功能要比將一個單獨的模塊應用到不同的應用程序中更經濟實用。而服務數據對象(sdo),這個由bea和ibm定義的異構數據訪問解決方案,為開發(fā)人員提供了更容易實現的機制來從系統層跟蹤數據的變化。

    一、處理xml數據的三個階段

    在本文給出的處理xml的例子分為三個不同的階段,這些階段如下:

    1. 建立

    2. 處理

    3. 瀏覽

    xml數據可以通過一個文件系統在這三個階段之間進行傳輸。在本例的中心場景如下:第二步需要記錄xml文件在第一階段被建立的記錄,當第三步瀏覽xml數據時,人們總希望知道這個文件有哪些變化。如果我們使用word的跟蹤特性,我們將會立即獲得這些變化的值。

    許多應用程序都有這些需求,包括實現并發(fā)控制、離線應用程序的同步,商業(yè)進程管理(bpm)系統。這部分將演示sdo如何幫助我們更容易地實現這些需求。

    本文提供的xml數據是一個訂購數據,代碼如下:

   

 <?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"
    xmlns="http://www.example.com/po"
targetnamespace="http://www.example.com/po">

<xsd:import namespace="commonj.sdo/xml" schemalocation="sdo.xsd"/>
    <xsd:element name="purchaseorder" type="purchaseordertype"/>
    <xsd:element name="comment" type="xsd:string"/>

<xsd:complextype name="purchaseordertype">
        <xsd:sequence>
            <xsd:element name="shipto" type="usaddress"/>
            <xsd:element name="billto" type="usaddress"/>
            <xsd:element ref="comment" minoccurs="0"/>
            <xsd:element name="items"  type="items"/>
        </xsd:sequence>
        <xsd:attribute name="orderdate" type="xsd:date"/>
    </xsd:complextype>
    <xsd:complextype name="statustype">
        <xsd:sequence>
            <xsd:element name="status"   type="xsd:string"/>
            <xsd:element name="contact"   type="xsd:string"/>
            <xsd:element name="changedate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complextype>

<xsd:complextype name="usaddress">
        <xsd:sequence>
            <xsd:element name="name"   type="xsd:string"/>
            <xsd:element name="street" type="xsd:string"/>
            <xsd:element name="city"   type="xsd:string"/>
            <xsd:element name="state"  type="xsd:string"/>
            <xsd:element name="zip"    type="xsd:decimal"/>
        </xsd:sequence>
        <xsd:attribute name="country" type="xsd:nmtoken" fixed="us"/>
    </xsd:complextype>
    <xsd:complextype name="items">
        <xsd:sequence>
            <xsd:element name="item" minoccurs="0" maxoccurs="unbounded">
                <xsd:complextype>
                    <xsd:sequence>
                        <xsd:element name="productname" type="xsd:string"/>
                        <xsd:element name="price"  type="xsd:decimal"/>
                        <xsd:element name="quantity">
                            <xsd:simpletype>
                                <xsd:restriction base="xsd:positiveinteger">
                                    <xsd:maxexclusive value="100"/>
                                </xsd:restriction>
                            </xsd:simpletype>
                        </xsd:element>
                        <xsd:element ref="comment"   minoccurs="0"/>
                        <xsd:element name="shipdate" type="xsd:date" minoccurs="0"/>
                    </xsd:sequence>
                    <xsd:attribute name="partnum" type="sku" use="required"/>
                </xsd:complextype>
            </xsd:element>
        </xsd:sequence>
    </xsd:complextype>

<xsd:simpletype name="sku">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="/d{3}-[a-z]{2}"/>
        </xsd:restriction>
    </xsd:simpletype>
</xsd:schema>

 

   createpo.java類完成了建立xml的工作。代碼如下

   

 package com.company.sdo.po;
import commonj.sdo.dataobject;
import commonj.sdo.helper.datafactory;
public class createpo {
public static void main(string[] args) throws exception {
//1.  使用xsd定義類型和屬性
     util.definepotypes();
//2.  建立根dataobject
     dataobject purchaseorder =
datafactory.instance.create(constants.po_namespace, "purchaseordertype");
//3.  設置根dataobject的數據類型屬性
     purchaseorder.setstring("orderdate", "1999-10-20");
//4.  建立子dataobject
     dataobject shipto = purchaseorder.createdataobject("shipto");
//5.  設置子dataobject的數據類型屬性
     shipto.set("country", "us");
shipto.set("name", "alice smith");
shipto.set("street", "123 maple street");
shipto.set("city", "mill valley");
shipto.set("state", "ca");
shipto.setstring("zip", "90952");
dataobject billto = purchaseorder.createdataobject("billto");
billto.set("country", "us");
billto.set("name", "robert smith");
billto.set("street", "8 oak avenue");
billto.set("city", "mill valley");
billto.set("state", "pa");
billto.setstring("zip", "95819");
purchaseorder.set("comment", "hurry, my lawn is going wild!");
dataobject items = purchaseorder.createdataobject("items");
//6.  為子dataobject “item”建立一個子dataobject
     dataobject item1 = items.createdataobject("item");
item1.set("partnum", "872-aa");
item1.set("productname", "lawnmower");
item1.setint("quantity", 1);
item1.setstring("price", "148.95");
item1.set("comment", "confirm this is electric");
dataobject item2 = items.createdataobject("item");
item2.set("partnum", "926-aa");
item2.set("productname", "baby monitor");
item2.setint("quantity", 1);
item2.setstring("price", "39.98");
item2.setstring("shipdate", "2007-11-21");
dataobject item3 = items.createdataobject("item");
item3.set("partnum", "998-aa");
item3.set("productname", "carpet");
item3.setint("quantity", 1);
item3.setstring("price", "439.98");
item3.setstring("shipdate", "2007-12-01");
//7.  將xml數據保存在一個xml文件中
     util.storexml(purchaseorder,"purchaseorder", constants.po_xml);
}
}

    1. 使用xsd定義類型和屬性;由于我們的數據是基于xml格式的,因此,我們首先需要在運行時定義sdo類型的屬性。這個功能由util類的definepotypes()方法完成。在definepotypes方法內部調用了xsdhelper類。definepotypes()方法的代碼如下:

   

 public static void definepotypes() throws exception {
fileinputstream fis = new fileinputstream(po_model_original);
xsdhelper.instance.define(fis, null);
fis.close();
}

    2. 建立根數據對象:sdo的動態(tài)api可以通過數據對象的層次和屬性或是一個datagraph(包含了數據對象元數據的一個圖)來描述結構化數據。sdo提供了用于建立一個未連接的數據對象的datafactory接口。

    3. 設置根數據對象的數據類型屬性:訂購單在sdo中是一個類型,并且根據schema,它有一個叫orderdate的數據類型屬性,這是一個日期類型。

    4. 建立子數據對象:數據對象訂購單有一些子數據對象。例如,上面代碼中的注釋4在purchaseorder中建立shipto子結點。除了這種方法,我們還可以使用datafactory來建立一個未連接的shipto數據對象,并使用setdataobject方法將他設置成purchaseorder的一個子結點。代碼如下:

    dataobject shipto = datafactory.instance.create(constants.po_namespace, "usaddress");
           ......
    purchaseorder.setdataobject("shipto", shipto);

    5. 設置子對象結點的數據類型屬性:基于usaddress類型的定義,shipto數據對象有不同的數據類型屬性。上面注釋5建立了這些屬性。

    6. 為子數據對象“item”建立一個子數據對象:這部分顯示了建立xml時sdo數據模型。

    在下一部分將討論如何使用sdo的動態(tài)api,我們可以編輯訂購單,并且在同時跟蹤他們的變化。

|||

   三、記錄處理xml數據的變化

 

    我們可以利用在sdo中定義的changesummary機制來跟蹤訂購單的變化。為了實現我們的第二個目的,我們先來編輯一個這個xml的schema文件po_orginal.xsd。代碼如下:

   

 <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"
    xmlns="http://www.example.com/po"
    xmlns:sdo="commonj.sdo"
    xmlns:sdoxml="commonj.sdo/xml"
targetnamespace="http://www.example.com/po">

<xsd:import namespace="commonj.sdo/xml"
schemalocation="c://eclipse//workspace//sdo//src//main//resources//sdo.xsd" />
    <xsd:element name="purchaseorder" type="purchaseordertype"/>
    <xsd:element name="comment" type="xsd:string"/>
    <xsd:element name="status" type="statustype"/>

<xsd:complextype name="purchaseordertype">
        <xsd:sequence>
            <xsd:element name="shipto" type="usaddress"/>
            <xsd:element name="billto" type="usaddress"/>
            <xsd:element ref="comment" minoccurs="0"/>
            <xsd:element name="items"  type="items"/>
            <xsd:element ref="status" minoccurs="1" maxoccurs="1"/>
        <xsd:element name="changes" type="sdo:changesummarytype"/>
        </xsd:sequence>
        <xsd:attribute name="orderdate" type="xsd:date"/>
    </xsd:complextype>
   ......
</xsd:schema>

    這個被導入的sdo.xsd定義了changesummarytype。我們在purchaseordertype中加一個changesummarytype的元素。我們可以將這個元素命名為任何東西,當然,除了使用“changes”。

    為了使用新的schema,我們需要使用util類的definepotypes()方法來裝載它。我們將要保存被createpo.java產生的xml文件為po.xml。這個文件和po_original.xml比較得知,po.xml在<po:purchaseorder>: <changes logging="false" />中有一個新的子元素。processpo.java類處理訂購單。當運行時,程序保存了這個處理過程,并在po_processed.xml中產生了一條變化記錄。po_processed.xml的代碼如下:

   

 <?xml version="1.0" encoding="ascii"?>
<po:purchaseorder xmlns:po="http://www.example.com/po" orderdate="1999-10-20">
  <shipto country="us">
    <name>alice smith</name>
    <street>123 maple street</street>
    <city>mill valley</city>
    <state>ca</state>
    <zip>90952</zip>
  </shipto>
  <billto country="us">
    <name>alice smith</name>
    <street>8 oak avenue</street>
    <city>mill valley</city>
    <state>pa</state>
    <zip>95819</zip>
  </billto>
  <po:comment>hurry, my lawn is going wild!</po:comment>
  <items>
    <item partnum="872-aa">
      <productname>lawnmower</productname>
      <price>148.95</price>
      <quantity>1</quantity>
      <po:comment>confirm this is electric</po:comment>
    </item>
    <item partnum="926-aa">
      <productname>baby monitor</productname>
      <price>39.98</price>
      <quantity>2</quantity>
      <shipdate>2007-11-21</shipdate>
    </item>
    <item partnum="999-aa">
      <productname>armed chair</productname>
      <price>299.95</price>
      <quantity>1</quantity>
      <po:comment>make sure the cover is leather.</po:comment>
    </item>
  </items>
  <changes create="     ##//items/item[3]" delete="     ##//changes/items[1]/item[3]" logging="false" xmlns:sdo="commonj.sdo">
    <billto sdo:ref="     ##//billto">
      <name>robert smith</name>
    </billto>
    <item sdo:ref="     ##//items/item[2]">
      <quantity>1</quantity>
    </item>
    <items sdo:ref="     ##//items">
      <item sdo:ref="     ##//items/item[1]" />
      <item sdo:ref="     ##//items/item[2]" />
      <item partnum="998-aa"><productname>carpet</productname><price>439.98</price><quantity>1</quantity><shipdate>2007-12-01</shipdate></item>
    </items>
  </changes>
</po:purchaseorder>

    上面的代碼顯示了xml文件的變化記錄,但是我們更感興趣的是<changes>元素,這個元素現在變得更復雜了。這個元素捕捉了訂購單的所有的變化?;具@些變化,應用程序可以恢復以前的未變化的數據。

    現在讓我我們看一下processpo.java類,并分析一個sdo如何允許我們獲得這樣詳細的變化數據。

    1. 注釋1中在運行時轉載了po.xml。

    2. 注釋2建立了和purchaseorder數據對象相關的changesummary對象。

    3. 為了跟蹤變化,注釋3打開了changesummary對象的日志功能。

    4. 在注釋4中,日志是關閉的,purchaseorder的所有變化和它的子數據對象在changesummary對象中被捕捉。

    5. 在注釋5中輸出了結果,我們可以看看util類中的printchangesummary方法,代碼如下:

 

 public static void printchangesummary(changesummary chngsum) {
if (chngsum == null) {
system.out.println("changesummary is not in existence!");
return;
}
for (iterator it = chngsum.getchangeddataobjects().iterator(); it.hasnext();) {
dataobject changedobject = (dataobject) it.next();
system.out.println();
if (chngsum.iscreated(changedobject)) {//is the changed object newly created
                system.out.println("created: " + changedobject);
if (changedobject.getcontainer()!=null){
system.out.println("/t--- to be contained in : "
                        + changedobject.getcontainer().gettype().getname()
+ " ---");
}else{
system.out.println("/t--- created object has no container --- ");
}
printannotateddataobject("newly created",changedobject, 2);
} else if (chngsum.isdeleted(changedobject)) {
system.out.println("deleted: " + changedobject);
if (chngsum.getoldcontainer(changedobject) != null){
system.out.println("/t--- originally contained in : " + chngsum.getoldcontainer(changedobject).gettype().getname() + " ---");
}else{
system.out.println("/t--- deleted object has no container ---");
}
// a potential bug in tuscany sdo, this shows nothing in processpo.java
                printannotateddataobject("deleted",changedobject, 2);
// drill down to deleted property
                system.out.println("/t--- deleted property information --- ");
// a potential bug in tuscany sdo, this section shows nothing in reviewpo.java
                for (iterator settingit = chngsum.getoldvalues(changedobject).iterator(); settingit.hasnext();) {
printdeletedproperty((changesummary.setting) settingit.next());
}
system.out.println("/t--- deleted property information --- ");
} else if (chngsum.ismodified(changedobject)) {
system.out.println("updated:  " + changedobject);
// print out the updated object
                printannotateddataobject("after update", changedobject, 2);
// drill down to changed property
                system.out.println("/t--- property update information --- ");
for (iterator settingit = chngsum.getoldvalues(changedobject).iterator(); settingit.hasnext();) {
changesummary.setting changesetting = (changesummary.setting) settingit.next();
printupdatedproperty(changesetting, changedobject,chngsum);
}
system.out.println("/t--- property update information --- ");
} else
                system.out.println("should never come here!");
}
}

    在這個方法中,我們首先使用了getchangeddataobjects()來獲得所有變化了的數據對象,然后按著他們的種類處理,即建立、刪除或編輯。如果數據對象是新建的,我們會打印對象的信息和所有的屬性。

    在下一部分,我們來瀏覽被編輯的訂購單。

    四、通過一個不同的實體瀏覽數據的變化

    xml數據處理的第三部分需要完成兩個任務:

    1. 程序需要按著編輯順序打印出主要的信息。

    2. 顯示處理階段所有的修改記錄。

    當我們可以更進一步根據著一個記錄變化階段編輯訂購單時,這部分顯示了如何使用reviewpo.java調用所有的編輯記錄。reviewpo.java的代碼如下:
 

package com.company.sdo.po;
import java.io.fileinputstream;
import java.util.list;
import commonj.sdo.changesummary;
import commonj.sdo.dataobject;
import commonj.sdo.helper.xmldocument;
import commonj.sdo.helper.xmlhelper;
public class reviewpo {
public static void main(string[] args) throws exception {
util.definepotypes();
fileinputstream fis = new fileinputstream(constants.po_processed_xml);
//1. 裝載要處理的訂購單
          xmldocument xmldoc = xmlhelper.instance.load(fis);
dataobject purchaseorder = xmldoc.getrootobject();
//2.  顯示被編輯的訂購單的信息
          system.out.println();
system.out.println("---received purchase order information---");
system.out.println("order date: " + purchaseorder.get("orderdate"));
system.out.println("order comment: " + purchaseorder.get("comment"));
dataobject shipto = purchaseorder.getdataobject("shipto");
system.out.println("ship to name: ");
util.printdataobject(shipto,1);
dataobject billto = purchaseorder.getdataobject("billto");
system.out.println("bill to name: ");
util.printdataobject(billto,1);
dataobject items = purchaseorder.getdataobject("items");
list itemlist = items.getlist("item");
system.out.println("ordered items: ");
for (int i = 0; i < itemlist.size(); i++) {
dataobject item = (dataobject) itemlist.get(i);
system.out.println("/titem " + (i+1) + " :" );
util.printdataobject(item,2);
}
//3.  顯示了第二階段的數據變化
          system.out.println();
system.out.println("---review changes in purchase order ---");
changesummary chngsum = purchaseorder.getchangesummary();
util.printchangesummary(chngsum);
//4.  取消第二階段的所有變化
          system.out.println();
system.out.println("---action taken after reviewing the changes---");
system.out.println("/t###undo all changes###");
chngsum.undochanges();
//5. 編輯訂購單的原始版本
          system.out.println();
system.out.println("---changes made in purchase order review---");
chngsum.beginlogging();
billto.set("name", "alice smith");
chngsum.endlogging();
//6.  將新的變化輸出到系統控制臺
          util.printchangesummary(chngsum);
//7.  將改變記錄保存到一個xml文件中
          util.storexml(purchaseorder,"purchaseorder", constants.po_reviewed_xml);
}
}

    要注意的是第二個任務不同于在前一部分打印changesummary,在這里printout是直接基于changesummary的。變化細節(jié)在運行時被重新裝載。我們可以通過比較這兩個printout來分辨它們的不同。在上一部分,printdataobject()在刪除項時什么都沒產生,而是調用了printdeletedproperty()來列出它們的屬性和它們的值。在當前的printout中,恰恰相反。

    在程序的其他部分,注釋4通過調用undochanges方法取消了在第二階段的所有的變化,注釋5對訂購單做了一些小的變化。我們可以看看保存變化記錄的文件(po_reviewed.xml)來驗證這些操作結果。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
成人美女黄网站| 日韩av自拍偷拍| 毛片av一区二区三区| 国产伦理精品| 国产精品无码久久av| 裸体素人女欧美日韩| 国产大片中文字幕在线观看| 亚洲美女又黄又爽在线观看| 伊人久久五月天| 欧美日韩一级二级| 中文字幕亚洲精品在线观看| 欧美电影院免费观看| 久久久久久香蕉网| 美女www一区二区| 国产精品777| 久热这里只精品99re8久| 奇米精品一区二区三区四区| 超碰97av在线| 中文字幕在线官网| 午夜剧场高清版免费观看| 六十路精品视频| 99久久精品无免国产免费| 国产av麻豆mag剧集| 日本中文一区二区三区| 92国产精品观看| 国产综合av一区二区三区| 欧美最猛黑人xxxx黑人猛交黄| 色135综合网| 亚洲第一中文av| 国产精品免费看| 国产成人亚洲综合| 欧美中日韩免费视频| 久青草视频在线播放| 国产精品免费看一区二区三区| 人人澡人人透人人爽| 亚洲国产日韩在线一区模特| 欧美一区二区三区爽大粗免费| 亚洲一区二区精品在线| 99t1这里只有精品| 成人av一区| 亚洲一二三四2021不卡| 91社区在线播放| 猫咪成人在线观看| 日本天堂一区| 少妇无套高潮一二三区| 82av视频| 成人国产一区二区三区精品麻豆| 亚洲婷婷综合网| 欧美高清视频手机在在线| 国产视频一区在线播放| 麻豆精品在线| 自拍偷拍第9页| 欧美精品三级在线观看| 免费网站在线高清观看| 久久这里只有精品8| 紧缚捆绑精品一区二区| 色av中文字幕一区| 国产精品自产拍在线观看2019| 99久久免费视频.com| 亚洲国产aⅴ成人精品无吗| 四虎影视国产在线视频| 成人美女视频| 中文官网资源新版中文第二页在线观看| 久久毛片高清国产| 在线成人国产| 亚洲欧美色一区| 日本国产在线播放| 中文字幕永久在线视频| 一区二区三区久久精品| 精品亚洲二区| 成年人看的免费视频| 国产极品模特精品一二| 日本精品久久| 亚洲黄色高清| 一个色的综合| 欧美韩国日本不卡| 欧美激情二区三区| 国产精品久久久久久久久久久久久久久久久久| 99热久久这里只有精品| 成人在线高清免费| 两个人免费视频观看日本| 污污网站免费在线观看| 日本成人小视频| 国产精品久久久久久久成人午夜| 亚洲黑丝一区二区| 激情久久一区| 亚洲欧美日韩在线不卡| 国产欧美欧洲在线观看| 日本毛片在线免费观看| 日韩欧美在线国产| av日韩在线网站| 在线播放日韩欧美| 欧美一区二区三区播放| 亚洲熟妇无码av在线播放| 国产精品尤物| 国产91精品不卡视频| 成人手机在线| 欧美黄色影院| 欧美日韩大片在线观看| www视频网站| 久久久久久久久久久综合| 男人看的污网站| 国产亚洲视频系列| 天天综合国产| 国产剧情日韩欧美| 久草资源在线观看| 9.1成人看片| 男人天堂新网址| 一区二区 亚洲| 美女网站视频在线观看| 亚洲精美色品网站| www.污视频| 亚洲一区二区自拍| 亚洲少妇中文在线| 日韩久久免费av| 久久资源综合| 91精品在线影院| 亚洲另类第一页| 性猛交ⅹxxx富婆video| 无码久久精品国产亚洲av影片| 国产精品久久久久久亚洲伦| 国产高清视频免费| 午夜精品一区二区三区在线视| 国产一区二区三区四区老人| 免费看的黄色大片| 中文字幕在线直播| 欧美黄色一级大片| 日本精品福利视频| 一区二区三区麻豆| 欧美成人毛片| 国产传媒在线| 精品一区二区在线免费观看| 91黄色免费网站| 真人做人试看60分钟免费| 久久久久久免费看| 久久精品欧美视频| 日本不卡一区二区三区| 国产精品都在这里| 一区精品在线播放| 囯产精品一品二区三区| 国产精彩视频在线观看| 午夜性色福利视频| 中文字幕欧美日韩一区二区| 亚洲午夜影视影院在线观看| 热久久久久久久久| 美女无遮挡网站| 亚洲欧美自拍一区| 992tv在线| 久久品道一品道久久精品| 日韩高清不卡一区二区| 老司机亚洲精品一区二区| 国产人成亚洲第一网站在线播放| 欧美精品乱码久久久久久按摩| 中文av一区二区三区| 中日韩精品视频在线观看| 亚洲动漫第一页| 日日摸日日碰夜夜爽av| 男女黄床上色视频| 6080yy精品一区二区三区| 国产精品第3页| 漫画在线观看av| 欧美一区三区二区在线观看| 午夜av入18在线| 日本精品在线中文字幕| 精品国产乱码久久久久久丨区2区| 电影一区二区三区久久免费观看| 日韩精品久久一区二区三区| 欧美性色综合网| 日韩免费av一区二区三区| 欧美精品v日韩精品v韩国精品v| 乱中年女人伦av一区二区| 欧美亚洲天堂网| 污视频网站免费在线观看| 亚洲精品**中文毛片| 蜜桃91丨九色丨蝌蚪91桃色| 国产福利拍拍拍| 欧美香蕉大胸在线视频观看| 92看片淫黄大片欧美看国产片| 国产又粗又猛又黄又爽| 在线综合视频网站| 久久久久97| 好男人免费精品视频| 91精品国产综合久久久久久久久| 成人在线视频观看| 日韩欧美一区视频| 日韩经典中文字幕一区| 一级中文字幕一区二区| 国产精品麻豆欧美日韩ww| 国产精品一区无码| 国产露出视频在线观看| 九九热国产在线| 日日草天天干| 琪琪亚洲精品午夜在线| 久久免费一级片| 午夜精品视频一区| 在线成人免费| 国产成人aa在线观看网站站| 美国黄色一级毛片| 中文字幕网在线| 国产欧美精品一区二区三区四区| 日韩免费三级| 激情久久av一区av二区av三区| 老司机福利在线视频| a级黄色小视频| 国产麻豆日韩| 久久99成人| 国产超级av| 奇米影视第四狠狠777| 性色av一区二区三区红粉影视| 亚洲自拍偷拍在线| 97人妻一区二区精品视频| 97在线视频一区| 国产精品视频999| 国产一区二区三区中文字幕| 日韩欧美亚洲日产国产| 乱中年女人av三区中文字幕| 久久久久久国产三级电影| 国产区在线观看| 亚洲精品美女久久7777777| 成人毛片免费看| 国产xxxxx18| 午夜伦理在线视频| 午夜久久久久久| 黄上黄在线观看| 亚洲国产另类av| 免费看的黄色大片| 免费在线一级片| 国产精品午夜福利| 中文字幕欧美日韩在线不卡| 欧美视频二区36p| eeuss影院在线| 欧美精品成人久久| 偷拍与自拍一区| 精品久久久中文字幕| 欧美肥婆姓交大片| 美女国产精品久久久| 久久精品女人的天堂av| 日韩a级在线观看| 丝袜亚洲欧美日韩综合| 国产精品女人久久久| 欧美在线视频你懂得| 日韩精品在线网站| 屁屁影院在线观看| 日韩美女在线| 亚洲国产精品一区二区三区| 精品少妇一区二区30p| 亚洲免费成人av| 欧美成人三级伦在线观看| 97超碰在线视| 91久久影院| japanese色国产在线看视频| 麻豆疯狂做受xxxx高潮视频| 91成人超碰| 四虎影视精品| 国产乱人伦精品一区| 亚洲精品v欧美精品v日韩精品| 欧美一级片网址| 极品尤物一区二区三区| 日韩精品在线视频美女| 亚洲精品成a人ⅴ香蕉片| 美女把尿口扒开让男人桶在线观看| 亚洲综合小说区| 久久成人精品| 蜜臀av在线播放一区二区三区| 成人免费看视频网站| 国产免费一区二区三区香蕉精| 首播影院在线观看免费观看电视| 91黄色小网站| 伊人成综合网yiren22| 伊人网在线视频观看| 国产中文字幕网| 成人在线观看你懂的| 亚洲成人精品| 欧美粗大gay| 欧美交受高潮1| xxxx欧美18另类的高清| 在线观看国产精品淫| 日韩一级裸体免费视频| 国产 日韩 亚洲 欧美| 午夜剧场免费在线观看| 午夜av免费观看| 99国产精品久久久久久久久久| 国产色综合天天综合网| 高清免费观看在线| 激情五月六月婷婷| 久久精品99国产| 嫩草av久久伊人妇女超级a| 久久午夜夜伦鲁鲁片| 久久久久国产精品麻豆ai换脸| 99re成人在线| 国产精品不卡在线| 黄大色黄女片18第一次| 国产精品国产精品国产专区不片| 每日更新成人在线视频| 国产精品视频h| 一区二区三区精品99久久| 麻豆成人久久精品二区三区红| 免费h片在线观看| 999av视频| 婷婷六月综合网| 亚洲爱情岛论坛永久| 日韩精品在线视频美女| 五月婷婷综合网| 91亚洲男人天堂| 一区二区在线观看av| 日本免费精品| 国外色69视频在线观看| 看片网站欧美日韩| 99视频免费看| 亚洲欧美春色| jlzzjlzzjlzz亚洲人| 天天干,夜夜操| 91污在线观看| 91精品麻豆| 久久精品xxx| 蜜臀av无码一区二区三区| xxx国产在线观看| 欧美日韩伦理在线免费| 日日天天狠狠| 欧美tickling网站挠脚心| 国产一级片免费观看| 国产成人啪精品视频免费网| 日本一本a高清免费不卡| 黄网站欧美内射| 在线观看视频网站你懂得| 在线国产成人影院| 成人天堂资源www在线| 中文字幕在线播放av|