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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

JSP與XML的結合

綜述:可擴展標注語言(eXtensible Markup LanguageXML)正被迅速的運用于業界,它已作為與平臺、語言和協議無關的格式描述和交換數據的廣泛應用標準。XML和它的輔助規范可用于描述數據的文檔表現,描述XML文檔類型的限制,描述XML文檔和資源之間的鏈接,描述XML文檔的自動轉換和格式化。   如何開發自定義標簽庫?

  我使用JSPASP編程已經有一段頗長的時間了,在兩種服務器端的編程方式中,我越來越覺得JSP的功能要強大得多。不提別的,其中JSP的標簽庫就是我選擇JSP作為首選服務器端Web應用開發工具的原因。為什么?因為:維護和開發的速度。在一個單一的服務器頁面中,你可以混合使用各種不同的腳本方法和對象。就?quot;混凝土"一樣,這種混合可令服務器端的腳本變得強大,并且讓服務器端的編程者設計出非常靈活和動態的Web頁面。不過這種自由的混合也有其缺點,那就是維護起來非常麻煩,特別是當項目逐漸變大時。由于最終的產品是經由一個傳統的Web設計者來維護的,因此會帶來問題。更糟糕的是,隨著代碼的復雜性增加,開發的速度就會變慢,不利于開發中等和大型的Web應用,一旦開發完,站點還要找合格的編程者來維護這些頗為復雜的代碼。

幸好,JSP提供了一個很好解決的辦法。標簽庫提供了一個簡單的方法來建立一個可重用的代碼塊。一旦標簽庫設計好,它就可以在許多項目中再次使用。更方便的是,與COMJ2EE不同,你無需學習任何其它的技巧就可以建立一個標簽庫!只要你懂得寫JSP,你就可以建立一個標簽庫。標簽庫還可以改善Web應用的維護。這個是得益于JSP頁面自定義標簽的簡單XML接口。這樣,Web設計者甚至可以做到無需知道任何JSP的知識,就可以建立JSPWeb應用。這個開放式的Web開發對于團隊運作是非常有效的。JSP編程者可以建立自定義的標簽和后臺的代碼模塊,而Web設計者可以使用自定義的標簽來建立Web應用,并且將精力集中在Web設計上。

  1. 標簽庫的定義

   JSP標簽庫(也稱自定義庫)可看成是一套產生基于XML腳本的方法,它經由JavaBeans來支持。在概念上說,標簽庫是非常簡單和可以重用的代碼構造。

執行XML/XSL轉換的標簽范例和HTML頁面

<
@ taglib uri=" http://www.jspinsider.com/jspkit/JAXP " prefix="JAXP">

c:/xml/example.xml

c:/xml/example.xsl

  在這個例子中,通過使用簡單的標簽來訪問后臺更為強大的代碼,一個XML被裝載,并且通過一個XSL文件來產生一個結果,并發送給客戶端,全部通過使用一個簡單的標簽調用就做到了。

   自定義標簽為在JSP項目中創建易于重用的代碼打開了一扇大門。你所需要的只是標簽庫和它的文檔說明。

  2. 標簽的組件

   雖然標簽庫非常易于使用,不過要建立一個內里的設計來支持標簽庫是頗復雜的,起碼要比建立一個簡單的JavaBean復雜。這個復雜是來自于標簽庫是由幾部分構成的。不過,你只需要知道JavaJSP的知識就夠了。

一個簡單的標簽由下面的元素構成:

   ⑴ JavaBeans:為了得到Java與生具來的面向對象的好處,可重用的代碼應該放到一個獨立的代碼容器中。這些JavaBeans并不是標簽庫的一部分。不過它是你的代碼庫用來執行相關任務的基本代碼塊。

  標簽處理:這是標簽庫的真正核心。一個標簽處理器將引用它需要的任何資源(你的JavaBeans)和訪問你的JSP頁面的全部信息(pageContext對象)。JSP頁面也會將所有已經被設置的標簽屬性和JSP頁面上的標簽體中的內容傳送給標簽處理器。在標簽處理器處理完畢后,它將發回輸出到你的JSP頁面進行處理。

  標簽庫的描述(tld文件):這是一個簡單的XML文件,它記錄著標簽處理器的屬性、信息和位置。JSP容器通過這個文件來得知從哪里及如何調用一個標簽庫。

  網站的web.xml文件:這是你網站的初始化文件,在這個文件中,你定義了網站中用到的自定義標簽,以及哪個tld文件用來描述每個自定義的標簽。

  分發文件(一個WAR或者JAR文件):如果你想重用自定義標簽的話,你需要一個方法來將它由一個項目轉移到另一個項目中。將標簽庫打包為一個JAR文件是一個簡單而且有效的方式。
在你的JSP文件中作標簽庫聲明:很簡單,如果要用到該標簽的話,只要在頁面聲明一下就可以,其后,你就可以在該JSP頁面的任何地方使用它。

   看來要做的工作很多,不過其實并不是很難。它的要點并不在于編碼,而是在于如何將各部分正確地組織起來。不過,這樣的分層是很重要的,它可令標簽的使用靈活和更容易轉移。更重要的是,這些層的存在可讓處理建立標簽的工程通過一個JSP IDEJSP的集成開發環境)自動完成。期望將來的JSP IDE可自動完成創建一個自定義標簽的大部分工作,這樣你只需要寫代碼和標簽處理就可以了。

   注意:一個標簽處理僅定義一個自定義標簽;一個標簽庫是幾個處理相同任務的標簽處理器的集合。

  3. 建立自己的標簽

   以下將一步一步地教你如何建立自定義的標簽,具體的例子是擴展JSP,令它擁有自己的HTML編碼功能。這個功能將所有的<>字符用HTML代碼來代替。它可以很容易地擴展為做其它的編碼處理。為了簡化,這個例子只解釋了建立自定義標簽的基本要素。

  創建一個JavaBean

   你代碼中任何可重新使用的部分都應該放到一個JavaBean中。這個很重要,因為你要經常在項目的其它地方用到這些代碼。放在標簽處理器中的任何代碼在標簽外都是不可以重新使用的,因此將可重用的代碼部分獨立開來是很重要的。在這個例子總,為HTML編碼的邏輯是常用的,因此放到JavaBean中。

   ⑵ HTML編碼JavaBean

/* HTML_Format.Java */

public class HTML_Format extends Object implements Java.io.Serializable {

/**
創建新的HTML_Format */

public HTML_Format
() {}

/**
將一個字符串中所有的所有 < > 字符用響應的HTML編碼代替 */

public String HTML_Encode
String as_data

{

int li_len = as_data.length
();

/*string buffer
的長度要比原來的字符串長*/

StringBuffer lsb_encode = new StringBuffer
li_len + li_len/10));

/*
循環替換全部的< > 字符 */
for
int li_count = 0 ; li_count < li_len ; li_count++

{ String ls_next = String.valueOf
as_data.charAtli_count));

if
ls_next.equals"<")) ls_next = "<";

if
ls_next.equals">")) ls_next = ">";

lsb_encode.append
ls_next ;

}

return
lsb_encode.toString() );

}

}

  創建一個標簽處理器

   標簽處理器使用以下的代碼:

HTML
編碼標簽處理器

import Java.io.IOException;

import Javax.servlet.jsp.*;

import Javax.servlet.jsp.tagext.*;

public class HTML_FormatTag extends BodyTagSupport

{

/* 1}
在標簽末將會調用這個函數 */

public int doEndTag
() throws JspTagException

{

try

{ /* 2}
得到標簽中的文本 */

BodyContent l_tagbody = getBodyContent
();

String ls_output = "";

/* 3}
如果標簽體有文本,就處理它 */

if
l_tagbody != null

{ HTML_Format l_format = new HTML_Format
();

/* 3a}
將標簽體的內容轉換為一個字符串 */

String ls_html_text = l_tagbody.getString
();

ls_output = l_format.HTML_Encode
ls_html_text;

}

/* 4}
將結果寫回到數據流中 */

pageContext.getOut
().writels_output.trim());

}

catch
IOException e

{ throw new JspTagException
"Tag Error:" + e.toString());

}

/*
JSP繼續處理以下頁面的內容 */

return EVAL_PAGE;

}

}

  這個處理很簡單,它包括有:

   o 讀入標簽開始和結束間的文本

   o 調用html編碼函數

   o 返回結果到JSP頁面。

  創建一個標簽描述器

   需要描述自定義標簽以讓系統知道如何處理。該描述文件的后綴為.tld,通常它的名字和標簽處理器相同,并存放在"/WEB-INF/"目錄。

HTML
編碼標簽描述器

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
" http://Java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd ">

<TAGLIB>

<TLIBVERSION>1.0</TLIBVERSION>

<JSPVERSION>1.1</JSPVERSION>

<SHORTNAME>HTML_FormatTag</SHORTNAME>

<URI></URI>

<INFO>HTML Encoding Tag </INFO>

<TAG>

<NAME>HTMLEncode</NAME>

<TAGCLASS>HTML_FormatTag</TAGCLASS>

<INFO>Encode HTML</INFO>

</TAG>

</TAGLIB>

  更新Web XML文件

   現在可告訴JSP容器使用標簽庫。為此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來注冊該標簽庫。最重要的是,要為tag分配一個URIURI是一個唯一的引用,只應用在該網站的這個特別的標簽上。使用全長的URL或者包名是一個好的習慣,它可以確保唯一性,因為該標簽可以在不同的網站使用。這個例子是簡化了。

修改web.xml文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

" http://Java.sun.com/j2ee/dtds/web-app_2.2.dtd ">

<WEB-APP>

<TAGLIB>

<TAGLIB-URI>

HTMLEncode

</TAGLIB-URI>

<TAGLIB-LOCATION>

/WEB-INF/HTML_FormatTag.tld

</TAGLIB-LOCATION>

</TAGLIB>

</WEB-APP>

  使用新的標簽

   自定義的標簽已經設置好,可以用在一個JSP頁面上。要做到這一點,只需在該頁面使用taglib指示命令聲明一下該標簽就可以了,該標簽通過它唯一的URI被引用,并且會被分配一個名字空間前綴。前綴可以任意,只要它不與其它的名字空間沖突便可。

   在一個JSP頁面上使用HTML編碼標簽:

<
@ taglib uri="HTMLEncode" prefix="Examples" >

<PRE>

<?XML:NAMESPACE PREFIX = Examples /><Examples:HTMLEncode>

< Hello , Simple sample >

</Examples:HTMLEncode>
</PRE>

范例代碼的輸出

< Hello , Simple sample >

which displays as:

< Hello , Simple sample >

  通過這個標簽,我就將該頁面的所有代碼編碼了。有趣的是所有的自定義標簽都是在服務器上處理的。這意味著你將不會在輸出的頁面上看到自定義的標簽。

   建立一個標簽不是很難吧。最困難的部分是要學習標簽處理的所有細節。這是一個很強大的功能,我們只是提到了最基本的地方。由于這個處理需要幾步,新的JSP編程者在創建標簽時將會感到迷惑。

  如何利用JSP開發DOM應用?

  DOMDocument Object Model的縮寫,即文檔對象模型。XML將數據組織為一顆樹,所以DOM就是對這顆樹的一個對象描敘。通俗的說,就是通過解析XML文檔,為XML文檔在邏輯上建立一個樹模型,樹的節點是一個個對象。我們通過存取這些對象就能夠存取XML文檔的內容。

   下面我們來看一個簡單的例子,看看在DOM中,我們是如何來操作一個XML文檔的。這是一個XML文檔,也是我們要操作的對象:

<?xml version="1.0" encoding="UTF-8"?>

<messages>

<message>Good-bye serialization, hello Java!</message>

</messages>

  下面,我們需要把這個文檔的內容解析到一個個的Java對象中去供程序使用,利用JAXP,我們只需幾行代碼就能做到這一點。首先,我們需要建立一個解析器工廠,以利用這個工廠來獲得一個具體的解析器對象:

   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

   我們在這里使用DocumentBuilderFacotry的目的是為了創建與具體解析器無關的程序,當DocumentBuilderFactory類的靜態方法newInstance()被調用時,它根據一個系統變量來決定具體使用哪一個解析器。又因為所有的解析器都服從于JAXP所定義的接口,所以無論具體使用哪一個解析器,代碼都是一樣的。所以當在不同的解析器之間進行切換時,只需要更改系統變量的值,而不用更改任何代碼。這就是工廠所帶來的好處。

   DocumentBuilder db = dbf.newDocumentBuilder();
當獲得一個工廠對象后,使用它的靜態方法newDocumentBuilder()方法可以獲得一個DocumentBuilder對象,這個對象代表了具體的DOM解析器。但具體是哪一種解析器,微軟的或者IBM的,對于程序而言并不重要。

   然后,我們就可以利用這個解析器來對XML文檔進行解析了:

   Document doc = db.parse("c:/xml/message.xml");

   DocumentBuilderparse()方法接受一個XML文檔名作為輸入參數,返回一個Document對象,這個Document對象就代表了一個XML文檔的樹模型。以后所有的對XML文檔的操作,都與解析器無關,直接在這個Document對象上進行操作就可以了。而具體對Document操作的方法,就是由DOM所定義的了。

   從得到的Document對象開始,我們就可以開始我們的DOM之旅了。使用Document對象的getElementsByTagName()方法,我們可以得到一個NodeList對象,一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,觀其名而知其意,所代表的是一個Node對象的列表:

   NodeList nl = doc.getElementsByTagName("message");

   我們通過這樣一條語句所得到的是XML文檔中所有<message>標簽對應的Node對象的

   一個列表。然后,我們可以使用NodeList對象的item()方法來得到列表中的每一個Node對象:

   Node my_node = nl.item(0);

   當一個Node對象被建立之后,保存在XML文檔中的數據就被提取出來并封裝在這個Node中了。在這個例子中,要提取Message標簽內的內容,我們通常會使用Node對象的getNodeValue()方法:

String message = my_node.getFirstChild().getNodeValue();

   請注意,這里還使用了一個getFirstChild()方法來獲得message下面的第一個子Node對象。雖然在message標簽下面除了文本外并沒有其它子標簽或者屬性,但是我們堅持在這里使用getFirseChild()方法,這主要和W3CDOM的定義有關。W3C把標簽內的文本部分也定義成一個Node,所以先要得到代表文本的那個Node,我們才能夠使用getNodeValue()來獲取文本的內容。現在,既然我們已經能夠從XML文件中提取出數據了,我們就可以把這些數據用在合適的地方,來構筑應用程序。
DOM
實例

  先說說這個例子到底要做的是什么吧,我們在一個名為link.xml文件中保存了一些URL地址,我們希望可以通過DOM把這些URL讀出并顯示出來,也可以反過來向這個XML文件中寫入加入的URL地址。很簡單,卻很實用,也足夠來例示DOM的絕大部分用法了。

   第一個程序我們稱為xmldisplay.Java,主要的功能就是讀取這個XML文件中各個節點的內容,然后在格式化輸出在System.out上,我們來看看這個程序:

import Javax.xml.parsers.*;

import org.w3c.dom.*;

  這是引入必要的類,因為在這里使用的是Sun所提供的XML解析器,因而需要引入Java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具體實現。org.w3c.dom包中定義了w3c所制定的DOM接口。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document doc=builder.parse("links.xml");

doc.normalize();

  除了上面講到的,還有一個小技巧,對Document對象調用normalize(),可以去掉XML文檔中作為格式化內容的空白而映射在DOM樹中的不必要的Text Node對象。否則你得到的DOM樹可能并不如你所想象的那樣。特別是在輸出的時候,這個normalize()更為有用。

  NodeList links =doc.getElementsByTagName("link");

  剛才說過,XML文檔中的空白符也會被作為對象映射在DOM樹中。因而,直接調用Node方法的getChildNodes方法有時候會有些問題,有時不能夠返回所期望的NodeList對象。解決的辦法是使用ElementgetElementByTagName(String),返回的NodeLise就是所期待的對象了。然后,可以用item()方法提取想要的元素。

for (int i=0;i<links.getLength();i++){

Element link=(Element) links.item(i);

System.out.print("Content: ");

System.out.println(link.getElementsByTagName("text").item(0).getFirstChild();

.getNodeValue());

……

  上面的代碼片斷就完成了對XML文檔內容的格式化輸出。只要注意到一些細節的問題,比如getFirstChile()方法和getElementsByTagName()方法的使用,這些還是比較容易的。
下面的內容,就是在修改了DOM樹后重新寫入到XML文檔中去的問題了。這個程序名為xmlwrite.Java。在JAXP1.0版本中,并沒有直接的類和方法能夠處理XML文檔的寫入問題,需要借助其它包中的一些輔助類。而在JAXP1.1版本中,引入了對XSLT的支持,所謂XSLT,就是對XML文檔進行變換(Translation)后,得到一個新的文檔結構。利用這個新加入的功能,我們就能夠很方便的把新生成或者修改后的DOM樹從新寫回到XML文件中去了,下面我們來看看代碼的實現,這段代碼的主要功能是向links.xml文件中加入一個新的link節點:

import Javax.xml.parsers.*;

import Javax.xml.transform.*;

import Javax.xml.transform.dom.DOMSource;

import Javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;

  新引入的Java.xml.transform包中的幾個類,就是用來處理XSLT變換的。

我們希望在上面的XML文件中加入一個新的link節點,因而首先還是要讀入links.xml文件,構建一個DOM樹,然后再對這個DOM樹進行修改(添加節點),最后把修改后的DOM寫回到links.xml文件中:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document doc=builder.parse("links.xml");

doc.normalize();

//---
取得變量----

String text="Hanzhong's Homepage";

String url=" www.hzliu.com ";

String author="Hzliu Liu";

String discription="A site from Hanzhong Liu, give u lots of suprise!!!";

  為了看清重點,簡化程序,我們把要加入的內容硬編碼到記憶String對象中,而實際操作中,往往利用一個界面來提取用戶輸入,或者通過JDBC從數據庫中提取想要的內容。

Text textseg;

Element link=doc.createElement("link");

  首先應該明了的是,無論什么類型的NodeText型的也好,Attr型的也好,Element型的也好,它們的創建都是通過Document對象中的createXXX()方法來創建的(XXX代表具體要創建的類型),因此,我們要向XML文檔中添加一個link項目,首先要創建一個link對象:
Element linktext=doc.createElement("text");

textseg=doc.createTextNode(text);

linktext.appendChild(textseg);

link.appendChild(linktext);

……

  創建節點的過程可能有些千篇一律,但需要注意的地方是,對Element中所包含的text(在DOM中,這些text也是代表了一個Node的,因此也必須為它們創建相應的node),不能直接用Element對象的setNodeValue()方法來設置這些text的內容,而需要用創建的Text對象的setNodeValue()方法來設置文本,這樣才能夠把創建的Element和其文本內容添加到DOM樹中。看看前面的代碼,你會更好的理解這一點:

doc.getDocumentElement().appendChild(link);

   最后,不要忘記把創建好的節點添加到DOM樹中。Document類的getDocumentElement()方法,返回代表文檔根節點的Element對象。在XML文檔中,根節點一定是唯一的。

TransformerFactory tFactory =TransformerFactory.newInstance();

Transformer transformer = tFactory.newTransformer();

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new Java.io.File("links.xml"));

transformer.transform(source, result);

  然后就是用XSLTDOM樹輸出了。這里的TransformerFactory也同樣應用了工廠模式,使得具體的代碼同具體的變換器無關。實現的方法和DocumentBuilderFactory相同,這兒就不贅述了。Transformer類的transfrom方法接受兩個參數、一個數據源Source和一個輸出目標Result。這里分別使用的是DOMSourceStreamResult,這樣就能夠把DOM的內容輸出到一個輸出流中,當這個輸出流是一個文件的時候,DOM的內容就被寫入到文件中去了。

  如何利用JSP開發SAX應用?

  SAXSimple API for XML的縮寫,它并不是由W3C官方所提出的標準,可以說是"民間"的事實標準。實際上,它是一種社區性質的討論產物。雖然如此,在XML中對SAX的應用絲毫不比DOM少,幾乎所有的XML解析器都會支持它。

   這樣泛泛的說來或許有些不容易理解,別急,后面的例子會讓你明白SAX的解析過程。看看這個簡單XML文件:

<POEM>

<AUTHOR>Ogden Nash</AUTHOR>

 

posted on 2009-06-16 21:53 肥仔 閱讀(189) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国产成人精品视频| 亚洲黄一区二区| 亚洲一区欧美激情| 久久免费精品日本久久中文字幕| 美日韩精品视频免费看| 亚洲国产精品成人一区二区| 亚洲电影免费观看高清| 99在线热播精品免费| 欧美专区福利在线| 欧美久久婷婷综合色| 国产欧美一区二区三区久久| 一区二区在线视频| 亚洲一区综合| 欧美黄色小视频| 亚洲综合导航| 欧美激情国产高清| 国产一区二区精品久久| 一本色道久久综合狠狠躁的推荐| 欧美怡红院视频一区二区三区| 欧美成人视屏| 欧美一区二区三区在| 欧美日韩亚洲一区在线观看| 极品尤物一区二区三区| 亚洲欧美一级二级三级| 亚洲欧洲综合另类在线| 午夜精品在线视频| 欧美日韩国产欧| 亚洲欧美日韩精品久久亚洲区| 欧美高清你懂得| 精品1区2区3区4区| 午夜视频一区在线观看| 日韩一区二区精品葵司在线| 欧美 日韩 国产精品免费观看| 国产午夜精品视频免费不卡69堂| 一区二区三区免费网站| 亚洲国产清纯| 噜噜噜久久亚洲精品国产品小说| 国产精品视频最多的网站| 亚洲少妇自拍| 在线性视频日韩欧美| 欧美另类久久久品| 亚洲人精品午夜| 亚洲第一偷拍| 免费观看久久久4p| 91久久久亚洲精品| 亚洲高清av| 欧美大片91| 亚洲日产国产精品| 亚洲激情综合| 欧美日韩一区二区三| 9人人澡人人爽人人精品| 亚洲欧洲精品一区二区三区波多野1战4| 久久婷婷国产综合精品青草| 黄色一区二区在线观看| 久久夜精品va视频免费观看| 久久精品水蜜桃av综合天堂| 在线欧美亚洲| 亚洲韩国日本中文字幕| 欧美激情一二区| 亚洲无人区一区| 亚洲一区二区三区三| 国产情侣一区| 美女主播一区| 欧美理论片在线观看| 制服诱惑一区二区| 亚洲综合999| 狠狠入ady亚洲精品经典电影| 久久综合亚州| 欧美激情一区在线| 午夜精彩国产免费不卡不顿大片| 午夜欧美精品| 91久久精品一区二区别| 日韩视频在线观看免费| 国产欧美精品xxxx另类| 免费成人高清| 欧美色精品在线视频| 久久国产高清| 牛牛精品成人免费视频| 亚洲自拍偷拍色片视频| 久久精品国产久精国产一老狼| 亚洲高清中文字幕| 亚洲素人在线| 亚洲欧洲视频| 亚洲免费婷婷| 亚洲肉体裸体xxxx137| 这里只有精品电影| 亚洲第一综合天堂另类专| 99精品欧美一区二区三区综合在线 | 欧美精品v日韩精品v韩国精品v| 国产精品99久久久久久久久| 欧美伊人久久久久久久久影院| 亚洲三级影片| 欧美一级理论性理论a| 亚洲精品一区二区三区av| 亚洲欧美久久久| 99re6热在线精品视频播放速度| 午夜精品福利电影| 国产精品99久久久久久久vr| 久久亚洲国产成人| 亚洲欧美日韩精品久久久久| 你懂的国产精品永久在线| 久久黄色网页| 欧美午夜精品久久久久久久 | 国内一区二区在线视频观看| 亚洲美女在线看| 亚洲黄一区二区三区| 欧美一站二站| 午夜国产一区| 欧美三区视频| 亚洲精品视频在线播放| 亚洲精华国产欧美| 久久久噜噜噜久噜久久| 久久久福利视频| 国产日韩三区| 香蕉av福利精品导航| 欧美一级免费视频| 国产精品久久久久77777| 最新亚洲一区| 亚洲精品一二三| 欧美不卡在线| 亚洲人成欧美中文字幕| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美片在线观看| 欧美激情网站在线观看| 在线观看日韩av| 久久久精品国产一区二区三区| 久久av二区| 黄色亚洲在线| 久久欧美中文字幕| 欧美福利在线| 日韩午夜高潮| 欧美日韩免费看| 亚洲午夜精品久久久久久app| 亚洲自拍另类| 国产午夜精品久久久久久久| 亚洲欧美在线免费观看| 久久er99精品| 在线看视频不卡| 欧美激情精品久久久久久久变态 | 亚洲国产精品传媒在线观看| 在线精品亚洲一区二区| 免费一级欧美片在线观看| 亚洲高清视频一区二区| 国产日韩精品久久| 午夜激情一区| 国产视频亚洲精品| 久久亚洲视频| 91久久中文| 亚洲男女自偷自拍| 狠狠网亚洲精品| 欧美国产精品人人做人人爱| 亚洲精品字幕| 久久免费观看视频| 亚洲欧洲另类国产综合| 欧美先锋影音| 久久成人这里只有精品| 亚洲激情国产精品| 欧美一级理论片| 亚洲欧洲日本国产| 国产欧美一区二区三区另类精品| 另类春色校园亚洲| 亚洲性xxxx| 欧美国产精品va在线观看| 一本色道久久综合精品竹菊 | 午夜精品久久久久久久久久久久久| 国产精品swag| 久久色在线播放| 亚洲视频一区二区免费在线观看| 久久躁日日躁aaaaxxxx| 亚洲天天影视| 亚洲国产91| 国产亚洲人成a一在线v站| 欧美黄色网络| 欧美伊人影院| 91久久国产综合久久91精品网站 | 欧美在线播放一区二区| 国产综合亚洲精品一区二| 亚洲欧美日韩在线不卡| 久久亚洲一区二区三区四区| 99在线精品视频在线观看| 欧美一区二区三区免费大片| 亚洲国产一区二区三区在线播| 国产欧美日韩综合精品二区| 欧美日韩国产精品| 免费成人在线视频网站| 久久大香伊蕉在人线观看热2| 亚洲特级毛片| 一本一本a久久| 99精品久久久|