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

首頁 > 學院 > 開發(fā)設計 > 正文

使用 Translator 模式構建更好的網(wǎng)站

2019-11-18 14:25:26
字體:
來源:轉載
供稿:網(wǎng)友

本文介紹 Translator 模式,并說明如何在 jsp 技術和 servlet 環(huán)境中使用 Translator 模式。讀完本文以后,您將能夠利用本文提供的代碼示例成功實現(xiàn)這一模式。

在使用 JSP 文件和 servlet 構建 Web 應用程序時,應用程序的界面多半會是 Html。瀏覽器翻譯后的 HTML 就是一個大型字符串。構成應用程序的業(yè)務對象只有少數(shù)屬性為字符串,其余屬性則為日期、數(shù)字甚至其他業(yè)務對象。在構建 Web 應用時,如何將業(yè)務對象所包含的信息轉換為瀏覽器可識別的 HTML 是個大問題。幾乎每個應用程序都會以 HTML 格式收集信息,而這些信息又會作為字符串發(fā)送給服務器。因此現(xiàn)在還存在如何將所提交的信息轉換為業(yè)務對象可識別的值這一問題。

Translator 模式通過提供一個與 JSP 文件、servlet 和業(yè)務對象協(xié)同工作的 Translator 對象解決了這兩個問題。Translator 對象將三個不同對象結合在一起,從而使每個對象都專用于完成一項給定的任務。Translator 對象之所以可充當這個紐帶,是因為它封裝了要完成的全部轉換邏輯。JSP 文件與 Translator 對象通信,專用于顯示信息。這使 JSP 文件變得比較“干凈”,即 JSP 文件中幾乎沒有 java 代碼。servlet 專門處理業(yè)務對象的持久性和屏幕之間的導航流。有了 servlet 專門處理這些任務,JSP 文件就幾乎不需要 Java 代碼了,從而使 JSP 文件變得更加“干凈”。

更具體一點
如前所述,Translator 模式由三個基本部分組成,分別是專用的 Translator 對象、servlet 和 JSP 文件。

JSP 文件的唯一職責就是充當用戶界面類。這是可能的,因為 JSP 文件從 Translator 對象獲取預先格式化好的字符串值(稍后討論)。JSP 文件應包含盡可能少的 Java 代碼,因為負責開發(fā) JSP 文件的網(wǎng)頁設計者通常對 Java 編程語言知之甚少,或者干脆就一無所知。使內(nèi)嵌在 JSP 文件中的 Java 代碼盡可能達到最少,這樣就使 JSP 文件更像純 HTML 頁面。與整篇都糾纏著 Java 代碼的 JSP 文件相比,純 HTML 頁面的修改要輕易得多。

Translator 對象是一種專用的類,它類似于 MVC 模式中的模型 (model) 類。Translator 對象將業(yè)務對象與 JSP 文件中的顯示域聯(lián)系起來。網(wǎng)頁設計者將調用 Translator 對象的一個 getter 方法在 JSP 文件中顯示動態(tài)信息。Translator 對象將返回一個預先格式化好的字符串,因此網(wǎng)頁設計者需要做的全部工作就是將它發(fā)送到一個輸出流中。Translator 對象能夠提供此信息,因為它在內(nèi)部變量中存儲著需要顯示的全部值。這些變量是由 syncGuiToModel() 和 PRocessForm() 方法設置的。這兩個方法專門處理屏幕和 Translator 之間的信息同步。小組中的 Java 開發(fā)人員負責構建這個 Translator 對象。

最后,servlet 專用于處理導航流和業(yè)務對象的持久性。當 servlet 接收到提交表單時,它將獲得 Translator 對象的一個實例,并使用 processForm() 方法將對表單的分析委派給 Translator 對象。在表單的分析完成以后,servlet 就會讓 Translator 對象使用 syncModelToGui() 方法將業(yè)務對象的值同步為表單中所提交的值。在成功轉換所提交的值并將它們設置到業(yè)務對象上之后,servlet 將對業(yè)務對象執(zhí)行持久化,并向網(wǎng)頁訪問者顯示確認頁。

給我顯微鏡
下面我們仔細查看 Translator 模式的三個部分:JSP 文件、servlet 和 Translator 對象。(本文的示例遵循的是 Servlet 2.1 規(guī)范和 JSP 1.0 規(guī)范。這些示例是在 WebSphere 3.02 和 WebSphere 3.5 環(huán)境下構建和測試的。)

JSP 文件
使用 Translator 模式的典型 JSP 輸入表單如下所示:

<%@ page extends="com.ibm.igs.ispkcm.translator.JspBase"
import="com.ibm.developerworks.translatorpattern.LoanTranslator,
Java.util.Hashtable"%>
<HTML>
<%
LoanTranslator ltLoan = LoanTranslator.getInstance(request);
Hashtable htErrors = ltLoan.getErrors();
%>
<HEAD>
</HEAD>
<BODY>
<%= displayErrors(htErrors) %>
<action="/servlet/com.ibm.developerworks.translatorpattern.LoanRegistrationServlet">
<%= hightLightErrors(ltLoan.BORROWER_LAST_NAME, htErrors) %>Borrower Last Name:
<INPUT name="<%= ltLoan.BORROWER_LAST_NAME %>"
value="<%= ltLoan.getBorrowerLastName() %>">
</FORM>
</BODY>
</HTML>

在 Translator 模式中,所有表單都是 JSP 文件,而非 HTML 文件,所以輸入域的值可以是動態(tài)的。這一點很重要,因為我們網(wǎng)站的訪問者是實實在在的人,他們會犯輸入錯誤。比讓網(wǎng)站通知您它不接受您的輸入更糟糕的唯一一件事情是,讓它通知您它不接受您在某個域中輸入的內(nèi)容,并要求您重新鍵入其他 20 個域,因為某個程序員正忙于檢查股市報價,沒有時間來提高輸入表單的用戶友好性。在 Translator 模式中,輸入表單的每個輸入域的值都是動態(tài)設置的,因此假如因存在輸入錯誤而需要向網(wǎng)站訪問者重新顯示輸入頁,他們就會看到突出顯示的錯誤,但其他輸入項仍然保留。

請記住,JSP 文件是由對 Java 代碼知之甚少或一無所知的網(wǎng)站設計者編寫和維護的。鑒于這個原因,我們希望 JSP 文件包含盡可能少的 Java 代碼。但我們在上一段的說明聽起來似乎需要編寫大量的 Java 代碼。該 JSP 文件示例只有少量 Java 代碼,但它們主要位于表達式 (<%= x %>) 中。它們能夠使用這些眾多的功能,因為 JSP 文件從它的超類 com.ibm.igs.ispkcm.translator.JspBase 中繼續(xù)了這些代碼,并將大量代碼放在 Translator 對象中。

在此 JSP 文件中,要注重的第一點是它有一個 page 指令標記。這是因為它需要繼續(xù)一個超類,并需要導入兩個類。JSP 文件繼續(xù)了超類 com.ibm.igs.ispkcm.translator.JspBase,因為 JspBase 包括一些很好的實用函數(shù),它使得 JSP 文件可包含更少的代碼。該 JSP 文件所用的主要實用函數(shù)是 displayErrors() 和 highLightErrors()。該 page 指令導入 LoanTranslator 和 Hashtable,因為 JSP 文件中引用了這兩個類,導入這兩個類是為了以后在此 JSP 代碼中引用這兩個類時不必使用它們完全限定的類名。以下代碼顯示了 import 語句的一個示例:

<%@ page extends="com.ibm.igs.ispkcm.translator.JspBase"
import="com.ibm.developerworks.translatorpattern.LoanTranslator,
Java.util.Hashtable"%>
JSP 文件中第一行真正的 Java 代碼獲取 Translator 對象的一個實例,然后獲取一個 Hashtable,其中存儲著屬于 Translator 對象的那個實例的錯誤。因為 JSP 文件(在編譯后)是一個 servlet,所以它是一個無狀態(tài)的服務對象。Translator 對象將在特定 JSP 文件或 servlet 的不同往返之間維護必要的狀態(tài)信息。狀態(tài)信息應僅限于網(wǎng)站訪問者輸入的值和要向網(wǎng)站訪問者顯示的任何處理錯誤。因為 Translator 對象的每個實例都與一個特定的網(wǎng)站訪問者相關聯(lián),所以 JSP 文件調用 Translator 對象的 getInstance(HttpServletRequest) 方法。由于為該方法傳遞的是一個 HttpServletRequest 對象,所以該方法將能夠檢索與該網(wǎng)站訪問者的 Httpsession 相關的 Translator 實例。

<%
LoanTranslator ltLoan = LoanTranslator.getInstance(request);
Hashtable htErrors = ltLoan.getErrors();
%>

在此 JSP 文件示例中,網(wǎng)站訪問者將在表單的頂部看到所有處理錯誤。用來顯示這些錯誤消息的 HTML 是使用 <%= displayErrors(htErrors) %> 表達式輸出的。displayErrors() 方法是從 JSP 文件的超類 JspBase 中繼續(xù)而來的。有了 displayErrors(),用于顯示錯誤消息的所有邏輯都被集中在一起,從而簡化了維護工作。

下面這段代碼模板適用于表單上的每個輸入域:

<%= hightLightErrors(ltLoan.BORROWER_LAST_NAME, htErrors) %>Borrower Last Name:
<INPUT name="<%= ltLoan.BORROWER_LAST_NAME %>"
value="<%= ltLoan.getBorrowerLastName() %>">
highLightErrors() 是從 JSP 文件的超類 JspBase 中繼續(xù)而來的。假如某個輸入域有錯誤,該方法將突出顯示該輸入域的標簽。該方法接收兩個參數(shù):String 和Hashtable。該 Hashtable 是其中存儲著從 Translator 的實例檢索而來的錯誤的 Translator。String 是正在檢查其是否有錯誤的輸入域的名稱。假如存在與該域相關的錯誤,highLightErrors() 就會返回突出顯示此輸入域的標簽的 HTML。

在此代碼模板中,須注重的重要一點是:INPUT 標記的 name 屬性是由一個表達式設置的,該表達式使用 LoanTranslator 對象的 BORROWER_LAST_NAME 常量。因為在 JSP 文件中引用此域名時使用了一個常量,所以 Translator 對象和 servlet 的調試變得更加輕易。使用常量更為輕易,因為無論何時開發(fā)人員更改此域的名稱,他們都會獲得一個編譯錯誤,而非運行時錯誤。查找編譯錯誤要輕易得多,因為編譯器會立即指出錯誤,而運行時錯誤到調試和測試期間才能被發(fā)現(xiàn)。

有關此代碼模板的最后一個(也是最重要的一個)注重事項是:INPUT 標記的 value 屬性是由一個表達式設置的,該表達式使用了 Translator 的一個 getter 方法。value="<%= ltLoan.getBorrowerLastName() %> 這行代碼是此模式最重要的部分之一,因為它就是使輸入域的值缺省為網(wǎng)站訪問者最初輸入的值的代碼。通過將此值缺省設置為網(wǎng)站訪問者最初輸入的值,訪問者就能看到他最初輸入的內(nèi)容,并很輕易地修正他的錯誤。這節(jié)省了網(wǎng)站訪問者的時間,并能使其獲得更好的用戶體驗。

servlet
下面是一個典型的簡化 servlet:

public void doPost(HttpServletRequest request, HttpServletResponse response)
{
// 缺省設置是使用戶返回輸入頁。
String sRedirect = LOAN_JSP;
// 獲取 Translator 的正確實例
LoanTranslator ltTrans = LoanTranslator.getInstance(request);
// 現(xiàn)在有了 Translator 的一個實例
ltTrans.processForm(request);
// 獲取 Loan 的正確版本的邏輯
Loan lnTheLoan = null;
if (ltTrans.isNew () == true)
{
// 創(chuàng)建新 Loan
}
else
{
// 獲得現(xiàn)有的 loan
}
// Sync the Loan object values to values in the submitted form.
ltTrans.syncModelToGui(lnTheLoan);
// 確保未出現(xiàn)任何錯誤
if (ltTrans.hasErrors() == false)
{
// 提交 Loan 信息,然后將重定向設置為正確的尾隨頁
sRedirect = LOAN_CONFIRMATION;
}
// 將網(wǎng)站訪問者重定向為當前工資。
try {
response.sendRedirect(sRedirect);
}
catch (Exception e)
{
// 錯誤邏輯
}
}

servlet 的主要用途是控制 JSP 文件之間的導航流以及對業(yè)務對象執(zhí)行持久化。此 servlet 的代碼很簡單。

servlet 執(zhí)行的第一個操作就是從 HttpServletRequest 中獲取 Translator 對象的一個實例。
隨后 servlet 使用 processForm() 方法將對所提交的 HTML 表單的處理委派給 Translator。
在 Translator 分析表單之后,servlet 將確定是否需要從第二存儲中創(chuàng)建或檢索業(yè)務對象(示例中的 Loan)。
在 servlet 擁有業(yè)務對象的一個實例之后,servlet 就會調用 Translator 對象的 syncModelToGui()。syncModelToGui() 隨后將網(wǎng)站訪問者提交的全部值轉換為業(yè)務對象可識別的值。
在 Translator 完成值的同步之后,servlet 將檢查當試圖轉換網(wǎng)站訪問者輸入的值時,Translator 是否記錄了任何錯誤。
假如沒有記錄任何錯誤,servlet 就會將網(wǎng)站訪問者重定向到確認頁(通常是另一個 JSP 文件,它同樣能顯示來自 Translator 的值)。
假如記錄了錯誤,servlet 就將網(wǎng)站訪問者重定向到輸入表單,這樣他就可以修正錯誤。
Translator 對象
因為 Translator 對象是 JSP 文件、servlet 和業(yè)務對象之間的聯(lián)系紐帶,所以要求它是有狀態(tài)的,并且要求它在 HTTP 請求(或線程)之間維護狀態(tài)。為了符合這個標準,Translator 對象需要起到類似偽孤子 (pseudo singleton) 那樣的作用。Translator 類有五個主要部分,另外還有一個前面未曾提及的 Object Translator 類庫。

getInstance()
syncGuiToModel()
若干 getter 方法
processForm()
syncModelToGui()
Object Translators 庫
為了調用 Translator 對象的一個實例,調用程序必須調用靜態(tài)方法 getInstance(HttpServletRequest)。getInstance() 方法將確定是否應返回 Translator 的一個新實例,或者是否應從 HttpSession 中重用某個實例。該方法通過查看定制參數(shù) action 來實現(xiàn)這一點。此參數(shù)是隨 HTTP 請求(例如,http://localhost/registerLoan.jsp?action=new)一起傳遞的。下面的樣例代碼段顯示了 getInstance() 的內(nèi)容:

public static LoanRegistrationTranslator getInstance(HttpServletRequest request)
{
// 聲明返回值變量。
LoanRegistrationTranslator lrtRV = null;
// HttpSession 是必需的,因此在此處將它提取出來。
HttpSession session = request.getSession();
// 從 request 對象中檢索 action 參數(shù)。
String sAction = parseString(request, ACTION);
// 確定我們要返回哪種 Translator。
if (ACTION_PROCESS.equals(sAction) == true)
{
// 因為 action 參數(shù)被設置為 process,這表示我們正在處理一個現(xiàn)有的
// Translator,所以從 HttpSession 中將這個 translator 提取出來。
lrtRV = (LoanRegistrationTranslator)
session.getValue(HttpSessionValueKeys.LOAN_REGISTRATION_TRANSLATOR);
}
else if (sAction == null "".equals(sAction) == true
ACTION_NEW.equals(sAction) == true)
{
// 由于未設置或根本未傳遞 action,所以缺省操作是創(chuàng)建一個新的 translator。
// 另一種可能是 action 為 "new"
lrtRV = new LoanRegistrationTranslator();
session.putValue(HttpSessionValueKeys.LOAN_REGISTRATION_TRANSLATOR, lrtRV);
}
else
{
// 由于 action 不滿足前面的任何檢查,即 action 值是位于輔助存儲器中的
// 一個現(xiàn)有 Loan 的 ID,所以這次創(chuàng)建一個 LoanRegistrationTranslator,
// 其值被預設為已保存的 loan 中的值。
lrtRV = new LoanRegistrationTranslator(sAction);
session.putValue(HttpSessionValueKeys.LOAN_REGISTRATION_TRANSLATOR, lrtRV);
}
// 返回 Translator 對象的一個實例。
return lrtRV;
}
對于要在 JSP 文件中顯示的每個業(yè)務對象值,Translator 都提供了一個 getter 方法。這些 getter 方法由 JSP 文件調用。必須在 JSP 文件中顯示的每個業(yè)務對象屬性都有一個 getter 方法。getter 方法總是返回一個 String。返回的 String 值已被預先格式化,以便直接在 JSP 文件中顯示。預先格式化 String 是為了使 JSP 文件中的 Java 代碼盡可能少。對這些值的格式化改為在 syncGuiToModel() 中進行。

Translator 使用 processForm() 清除以前顯示的錯誤,并從提交的表單中分析此信息。當 servlet 接收到一個提交的表單時,它就會將對該表單的處理委托給 Translator。在本委托期間,Translator 分析提交表單的值,并將這些值分別存儲在 String 變量中。這些存儲變量隨后通過 syncModelToGui()(由 servlet 調用)轉換為業(yè)務對象的值。

syncGuiToModel() 和 syncModelToGui() 是兩個類似的方法,顧名思義,其中一個方法按某個方向對值執(zhí)行同步,而另一個方法按相反的方向執(zhí)行同步。syncGuiToModel() 從業(yè)務對象的屬性中提取這些值,并使用 Object Translator 預先格式化每個屬性值。Object Translator 將值預先格式化為要在屏幕上顯示的值。隨后,它將 Translator 的對應 String 變量設置為這個值。syncModelToGui() 執(zhí)行的操作相同,但方向相反。下面是從典型的 syncGuiToModel() 中摘出的一小段代碼:


DoubleTranslator dtDouble = new DoubleTranslator();
String sTemp = dtDouble.translate(loan.getInterestRate());
setInterestRate(sTemp);
為了使轉換代碼具有最大的可重用性,并為整個站點提供一種共同的轉換,syncGuiToModel() 和 syncModelToGui() 使用的都是 Object Translator 類。Object Translators 與 Translator 對象聯(lián)系得如此緊密,以致于幾乎可將它們看作是 Translator 對象的規(guī)則。Object Translator 類是一個簡單的類,它的唯一用途就是將一種數(shù)據(jù)類型轉換為格式化字符串,以及將格式化字符串轉換為它的數(shù)據(jù)類型。下面是一個很簡單的 Object Translator 類的代碼:

public class DoubleTranslator extends ObjectTranslator
{
public String translate(double doubleValue)
{
return Double.toString(doubleValue);
}
public double translate(String stringToBeTranslated) throws Exception
{
double dRV = 0.0;
try {
Double dbDouble = Double.valueOf(stringToBeTranslated);
dRV = dbDouble.doubleValue();
}
catch(Exception e)
{
Exception eTranslation =
new Exception("Please enter a numeric value like 1.0 or 1.25");
throw eTranslation;
}
return dRV;
}
}
當這個樣例 Object Translator 將 double 轉換為格式化的 String 時,它只需調用 Double.toString()。這個方法可實現(xiàn)更強大的功能,例如,可以添加幾行代碼,使得當格式化類似 1000.25 這樣的大 double 值時,可預格式化這個值,以便顯示為 1,000.25。

對于 DoubleTranslator.translate(String),須注重的重要一點是,它會發(fā)出一個可讀性很好的異常,而不是標準的 Java.lang.NumberFormatException 異常。JSP 文件將此異常的消息直接顯示給網(wǎng)站訪問者,因此,讓網(wǎng)站的普通訪問者很輕易地理解該方法發(fā)出的異常是非常重要的。

小結
使用 Translator 模式框架的優(yōu)點很多,不僅可以降低網(wǎng)站的成本,而且可以提高用戶的滿足度。由于不同組件都只執(zhí)行專門的任務,因而網(wǎng)站的構建成本降低了。這些專門任務分配給生產(chǎn)小組,如 HTML 小組或 Java 程序員小組。因為 Translator 模式的 ObjectTranslators 在整個網(wǎng)站重用,所有全部格式化和分析都是以相同的方式進行的。因為每項任務都以相同的方式完成,所以網(wǎng)站訪問者就能夠以一致的方式查看整個網(wǎng)站的信息。這進一步提高了用戶的滿足度。

參考資源

下面的 developerWorks 教程可幫助您進一步了解 servlet 和 JSP 文件:
Building Java HTTP servlets
Building servlets with session tracking
IntrodUCtion to JavaServer Pages technology
作者簡介
Donald Bell 是 IBM 全球服務中心的 IT 專家,他為客戶提供有關基于 Web 的技術應用指導??梢酝ㄟ^ bellds@us.ibm.com 與他聯(lián)系。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
男女爱爱视频免费| 精品国产福利一区二区在线| 精品国精品国产自在久不卡| 中文精品久久久久人妻不卡| 亚洲中午字幕| 精品国产三级| 国产精品国产三级国产有无不卡| 亚洲欧美日韩一区在线观看| 国产一区二区在线电影| 在线精品亚洲一区二区| 成人永久aaa| 欧美精品日韩www.p站| 国产精品999久久久| 亚洲校园激情春色| 88xx成人网| 亚洲国产中文字幕在线视频综合| 亚洲影视中文字幕| 橘梨纱av一区二区三区在线观看| 精品日韩电影| 色天堂在线视频| 欧美精品一区二区三区久久| 精品无码人妻一区二区三| 国产成人综合视频| 男人天堂视频网| 国产高清在线看| 欧美日韩国产首页| 国内自拍视频网| 澳门av一区二区三区| 欧美日本精品一区二区三区| 国产免费亚洲高清| 国产精品一区二区三区四区在线观看| 外国一级黄色片| 久久草在线视频| 91视频 - 88av| 综合中文字幕亚洲| 69久久夜色精品国产69蝌蚪网| 久久精品国产一区| 精品88久久久久88久久久| 亚洲国产另类精品专区| 搡的我好爽在线观看免费视频| 精品盗摄一区二区三区| 久久激五月天综合精品| 久久久久久香蕉网| 精品99久久久久久| 艳妇乳肉豪妇荡乳av| 成人在线免费观看视视频| 日本a级片在线播放| 精品国产一区二区三区2021| 成人妇女淫片aaaa视频| 亚洲аv电影天堂网| 蜜桃久久久久久久| 国产日韩欧美| 亚洲按摩av| 久久久91精品国产| 四虎影院影音| 色婷婷成人综合| 四虎.com| 99视频只有精品| 亚州欧美精品suv| 九九在线免费视频| 国产精品18久久久久| 亚洲一卡二卡三卡四卡五卡| 亚洲高清无码久久| 欧美插插视频| 无码粉嫩虎白一线天在线观看| 日本成人伦理电影| 欧美激情久久久| 韩国成人在线| 在线日韩精品视频| 一呦二呦三呦精品国产| 国产精品igao视频| 欧美韩国理论所午夜片917电影| 国产美女在线看| 精品国产一区二区在线| 日韩精品高清不卡| 精品无码一区二区三区在线| 色综合一个色综合亚洲| 99国产精品免费网站| 波多野结衣毛片| 国产毛片在线看| 欧美日本久久| 日韩在线观看电影完整版高清免费悬疑悬疑| 国产91久久久久蜜臀青青天草二| 久久尤物电影视频在线观看| 国产一区二区三区直播精品电影| 精品伦理一区二区三区| 欧美日韩一级视频| 视频一区二区三区在线| 一二三区精品| 日韩网址在线观看| 国产高清在线视频| 中文字幕在线亚洲三区| 91free张津瑜movies| 国产大片中文字幕在线观看| 国产精品自产拍高潮在线观看| 欧美婷婷久久五月精品三区| c++连点器| 日韩免费av一区二区| www.亚洲人.com| 日韩video| 五月天久久777| 久精品免费视频| 91超碰碰碰碰久久久久久综合| 四虎国产精品成人免费4hu| 日韩高清在线观看| 久久综合久中文字幕青草| 两个人日本在线观看视频| 香蕉视频在线网站| 一级片免费在线| 日韩国产在线播放| 欧美成人bangbros| 久久精品国产亚洲7777| 欧美男人操女人视频| 日本在线观看网址| 亚洲av无码一区二区三区dv| 国产二级片在线| 日韩精品福利| 午夜成人在线视频| 国产成人综合欧美精品久久| 毛片免费在线观看| 欧美顶级xxxxbbbb| 亚洲成人av观看| 香蕉国产成人午夜av影院| 国产91精品精华液一区二区三区| 天天插天天操天天射| 蜜桃久久av一区| 色哟哟一一国产精品| 不用播放器成人网| 91视频8mav| 中国日本在线视频中文字幕| 亚洲成av人乱码色午夜| 中文在线√天堂| 国产98色在线|日韩| 91搞黄在线观看| 国产视频丨精品|在线观看| 国产一区二区三区在线看| 国产精品一区在线观看乱码| 国产精品乱码一区二三区小蝌蚪| 刘亦菲国产毛片bd| 国产av一区二区三区精品| 一区二区精品在线| 香蕉视频网站在线播放| 日韩精品电影一区二区| 成人日韩在线视频| 先锋影音在av资源看片| 久久综合免费视频| 国产欧美日韩免费| 国产精品久久久久蜜臀| 69久久夜色精品国产69乱青草| 亚洲成人人体| 四虎久久免费| 日本午夜大片a在线观看| 91精品国产综合久久香蕉的用户体验| 中文字字幕一区二区三区四区五区| 成人久久久久久久久| 日韩乱码在线视频| 亚洲黄色a级片| 日韩精品久久久久久福利| 你懂的视频一区二区| 久久影院午夜精品| 欧美日韩亚洲国内综合网俺| 日本怡春院一区二区| 日韩美女一区二区三区四区| 国产精品久久久久久久牛牛| 欧美性潮喷xxxxx免费视频看| 欧美第一在线视频| 国产精品国模大尺度私拍| 精品国产自在久精品国产| 欧美一卡二卡| tube国产麻豆| 麻豆精品一区| 欧美做爰猛烈大尺度视频| 天堂va在线| 国产卡二和卡三的视频| 久久av色综合| 国产91丝袜在线播放| 亚洲午夜一区二区三区| 91嫩草国产丨精品入口麻豆| 日韩国产欧美精品一区二区三区| 97一区二区国产好的精华液| 午夜免费看毛片| 成人xvideos免费视频| 欧美在线播放一区| 久久人人97超碰com| 日韩电影在线免费看| 国产毛片在线视频| 亚洲japanese制服美女| 国 产 黄 色 大 片| 阿v天堂2017| 蜜臀久久99精品久久久久久宅男| 亚洲高清视频网站| www.国产三级| 在线视频三级| 成人区精品一区二区婷婷| 国产精品久久久久久久久男| 8av国产精品爽爽ⅴa在线观看| 亚洲一区二区在线观| 免费成人进口网站| 中文字幕无码日韩专区免费| 动漫成人在线观看| 欧美日韩另类综合| 国产98在线|日韩| 日韩不卡在线观看日韩不卡视频| 国产尤物av一区二区三区| 一卡二卡三卡日韩欧美| 经典三级在线| freemovies性欧美| 免费黄色片在线观看| 91精品国产高清一区二区三区蜜臀| 国产精品酒店视频| 亚洲国产日韩欧美在线图片| 国产精品久久婷婷| 成人免费看的视频| 91色乱码一区二区三区| 久久6精品影院| 精品在线视频免费观看| 久久久久免费精品国产| aaa一级毛片| 成人日韩欧美| 久久精品亚洲成在人线av网址| 欧美精品免费在线观看| 亚洲精品网址| 大肉大捧一进一出好爽视频| 日本韩国免费观看| 欧美午夜美女看片| 日韩福利二区| 精品成a人在线观看| 亚洲精品v欧美精品v日韩精品| 欧美色图片区| 亚洲视频一区二区三区| 五月婷婷久久综合| 色综合久久天天| 实拍女处破www免费看| 国产视频福利在线| 国产精品羞羞答答在线| 神马伦理电影| 五月天激情开心网| 粉嫩tv在线播放| 亚洲热线99精品视频| 精品国产伦一区二区三区| 人妻一区二区视频| 久久久久久91亚洲精品中文字幕| 国产999免费视频| 国产91精品一区二区麻豆网站| 999国内精品视频在线| 中文字幕 国产精品| 日韩国产在线看| 日韩中文字幕免费在线观看| 欧美视频在线一区二区三区| 97人人澡人人爽91综合色| 久草在线中文888| 伊人久久婷婷色综合98网| 欧美精品在欧美一区二区少妇| 午夜在线视频一区二区区别| 浮力国产第一页| 少妇精品无码一区二区免费视频| 色婷婷成人在线| 亚洲视频专区在线| 日本aa在线观看| 91九色porn在线资源| 国产精品影视在线观看| 日本久久亚洲电影| 蜜桃传媒在线观看免费进入| а√天堂中文在线资源8| 五月天久久久| 色婷婷久久久综合中文字幕| 涩涩屋黄网站| 亚洲自偷自拍熟女另类| 精品人妻久久久久一区二区三区| 国产做受高潮69| 国产日产精品一区二区三区| 日本我和搜子同居的日子高清在线| 国产a级片视频| 超碰在线免费观看97| 922tv免费观看在线| 国产精品露脸自拍| 国产黄色免费观看| www在线视频| 久久久久久久电影| 亚洲自拍偷拍色图| 亚洲永久字幕| 成人网ww555视频免费看| av免费观看网址| 亚洲52av| 久久久久亚洲无码| 欧美黄色一区二区| 国产日韩亚洲欧美综合| jizzjizzjizz中国| 亚洲国产高清一区二区三区| 国产精品一区二区在线观看不卡| 中文字幕+乱码+中文字幕| 亚洲综合小说区| 一区二区三区精品99久久| 国产主播一区二区三区四区| av免费看在线| 欧美极品第一页| 四季av综合网站| 99久久伊人精品| 国内a∨免费播放| caopor在线视频| 精品国产伦一区二区三| 男人天堂亚洲| 五月激情六月丁香| 韩国一区二区在线播放| 国产精品你懂的在线观看| 中文字幕有码视频| 欧美日韩二三区| 精品视频久久久| 99成人在线观看| 国产成年妇视频| 成人a在线视频免费观看| 国产精品18久久久久网站| 丰满少妇又爽又紧又丰满电影| 国产精品无码av在线播放| 五月天激情小说综合| 国产精品无码av无码| 8848成人影院| 久久黄色影视| 国产精品xxx电影| 中文字幕第五页| 亚洲一区二区视频在线播放| 日本强好片久久久久久aaa| 妞干网在线视频观看| 伊人久久av导航| 最新日韩免费视频| 视频一区免费观看| 98精品国产自产在线观看| 懂色av一区二区|