日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

使用 Translator 模式構建更好的網站

2019-11-18 14:25:26
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

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

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

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

在此 JSP 文件中,要注重的第一點是它有一個 page 指令標記。這是因為它需要繼續一個超類,并需要導入兩個類。JSP 文件繼續了超類 com.ibm.igs.ispkcm.translator.JspBase,因為 JspBase 包括一些很好的實用函數,它使得 JSP 文件可包含更少的代碼。該 JSP 文件所用的主要實用函數是 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,所以它是一個無狀態的服務對象。Translator 對象將在特定 JSP 文件或 servlet 的不同往返之間維護必要的狀態信息。狀態信息應僅限于網站訪問者輸入的值和要向網站訪問者顯示的任何處理錯誤。因為 Translator 對象的每個實例都與一個特定的網站訪問者相關聯,所以 JSP 文件調用 Translator 對象的 getInstance(HttpServletRequest) 方法。由于為該方法傳遞的是一個 HttpServletRequest 對象,所以該方法將能夠檢索與該網站訪問者的 Httpsession 相關的 Translator 實例。

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

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

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

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

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

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

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

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

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

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

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

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

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

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


DoubleTranslator dtDouble = new DoubleTranslator();
String sTemp = dtDouble.translate(loan.getInterestRate());
setInterestRate(sTemp);
為了使轉換代碼具有最大的可重用性,并為整個站點提供一種共同的轉換,syncGuiToModel() 和 syncModelToGui() 使用的都是 Object Translator 類。Object Translators 與 Translator 對象聯系得如此緊密,以致于幾乎可將它們看作是 Translator 對象的規則。Object Translator 類是一個簡單的類,它的唯一用途就是將一種數據類型轉換為格式化字符串,以及將格式化字符串轉換為它的數據類型。下面是一個很簡單的 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()。這個方法可實現更強大的功能,例如,可以添加幾行代碼,使得當格式化類似 1000.25 這樣的大 double 值時,可預格式化這個值,以便顯示為 1,000.25。

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

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

參考資源

下面的 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 與他聯系。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
999精品网| 国产网站欧美日韩免费精品在线观看 | 欧美日韩一区二区在线视频| 中文字幕亚洲在| 在线视频1区2区| 久久激情一区| 欧美激情视频一区二区三区在线播放| 色妇色综合久久夜夜| 日韩在线视频在线观看| 中文在线第一页| 中文字幕一区二区三区精品| 91精品国产自产91精品| 91精品国产综合久久蜜臀| 精品999在线| 日韩在线视频观看| 日韩中文字幕亚洲| 精品极品三级久久久久| 日韩国产一区久久| 欧美日韩国产首页| 91精品观看| 日韩精品国产欧美| 国产欧美日韩三级| 欧美日韩一级视频| 精品成人久久久| www.中文字幕在线观看| 亚洲专区一二三| 日韩网站中文字幕| 一区二区三区鲁丝不卡| 91精品国产综合久久久久久| 欧美日韩高清一区二区| 日韩三级免费观看| 一区二区在线高清视频| 日韩精品视频中文字幕| 精品久久蜜桃| 亚洲乱码在线观看| 欧美一级日韩一级| 天天综合日日夜夜精品| 亚洲精品中文字幕乱码三区| 91精品久久久久久久久| 91精品在线观看视频| 91精选在线| 日韩欧美资源站| 中文字幕亚洲高清| 日韩精品三级| 国产1区在线| 区日韩二区欧美三区| 亚洲一区激情| 日韩三级免费观看| 日韩免费视频一区二区视频在线观看 | 一区二区不卡在线播放| 亚洲福利视频专区| 亚洲人线精品午夜| 高清1区2区| 久久久91精品国产| 日韩午夜高潮| 国产一区在线不卡| 日韩在线视频免费观看高清中文| 国产传媒久久久| 日韩视频免费直播| 中文字幕成人乱码在线电影| 国产综合精品在线| 午夜国产欧美理论在线播放| av中文网站| 国产欧美第一页| 欧美国产三级| 日韩亚洲一区中文字幕| 91精品国产综合久久久久久漫画| 日韩国产在线不卡视频| 国产日韩1区| 亚洲国产欧美91| 久久久99精品久久| 中文字幕亚洲欧美| 中文字幕国产亚洲| 一区二区高清在线| 日韩不卡一区二区| 日韩精品视频在线观看网址| 先锋男人资源站| 国产啊啊啊视频在线观看| 国精品产品一区| 一级日本免费的| 成年人黄国产| 欧美日韩国产影片| 久久视频一区| 日韩一级中文字幕| 日韩美女视频一区二区在线观看| www.中文字幕在线| 欧美三级中文字幕在线观看| 成人ww免费完整版在线观看| 日韩综合精品| 国产在成人精品线拍偷自揄拍| 国产欧美日韩精品在线观看| 日韩av一区二区在线| 国产综合精品在线| 国产91久久久久蜜臀青青天草二| 一区二区在线高清视频| 欧美日韩一区二区在线视频| 亚洲黄页一区| 在线观看国产一级片| 韩国av一区二区| 中文字幕99| 一区二区三区精品99久久| 日韩欧美中文在线| www.三级.com| 日韩欧美综合| 欧美日韩精品不卡| 中文字幕日韩高清| 麻豆一区二区99久久久久| 国产九九在线| 国产无遮挡在线视频免费观看| 久久蜜桃一区二区| 蜜桃久久av| 1区2区3区在线视频| 不卡视频一区二区三区| 欧美三级日韩三级国产三级| 精品日韩一区二区三区免费视频| 91精品国产调教在线观看| 精品在线网站观看| 欧美午夜影院在线视频| 中文不卡在线| 欧美三级三级三级爽爽爽| 999视频精品| 精品久久久视频| 精品九九久久| 国内国产区免费视频| 亚洲欧美99| 国内精品99| 日本精品在线| 久久 天天综合| 日韩欧美国产成人精品免费| 日韩精品福利视频| 美女黄a一级视频| 99精品视频99| 日韩欧美不卡视频| 午夜国产视频| 欧美日韩国产在线观看| 久久久精品福利| 精品人妻二区中文字幕| 日韩视频在线观看一区| 欧美日韩高清一区二区不卡| 最近高清中文在线字幕在线观看1| 日韩视频 中文字幕| 精品婷婷伊人一区三区三| 亚洲国产专区| 黄色一区二区视频| 精品国产99久久久久久| 国产三级精品在线观看| 欧美 中文字幕| 一区二区不卡久久精品| 欧美日韩亚洲国内综合网俺| 欧美在线日韩精品| 久久永久免费视频| 国产在线拍偷自揄拍精品| 91麻豆精品在线| 国产一区在线观看视频| 欧美变态tickling挠脚心| 日韩精品视频在线观看免费| 日韩国产高清一区| 久草亚洲一区| 精品国产999| 欧美日韩免费高清| xxxcom在线观看| 欧美 日韩 国产在线| 日韩欧美亚洲日产国| 日韩一级免费在线观看| 国产欧美日韩精品在线观看| 精品久久久91| 欧美日韩国产不卡在线看| 99久久www免费| 日韩va亚洲va欧洲va国产| 中文字幕精品在线| 91精品久久久久久久久| 国产专区中文字幕| www.av中文字幕| 亚洲第一中文字幕在线观看| 白嫩少妇丰满一区二区| 精品久久久91| 国产伦精品免费视频| 久久精品国产91精品亚洲| 亚洲免费婷婷| 一本一道综合狠狠老| 免费精品国产自产拍观看| 色综合久久六月婷婷中文字幕| 91精品国产自产观看在线| 成人禁用看黄a在线| 欧美日韩性视频在线| 最新中文字幕在线播放| 国产成人精品av久久| 欧美一级手机免费观看片| 日韩欧美在线网址| 国产视频二区| 一区在线视频观看| 日韩亚洲不卡在线| 国产三级视频在线播放线观看| a视频免费在线观看| 欧美日韩综合高清一区二区| 亚洲免费精品视频| 亚洲国产午夜精品| 国产www.大片在线| 亚洲大片精品永久免费| 日韩免费精品| av免费在线网站| 欧美中文字幕第一页| 亚洲高清视频一区| 国内精品99| 欧美日韩在线观看首页| 国产999精品在线观看| 中文字幕五月欧美| 天堂精品高清1区2区3区| 国产免费久久| 亚洲综合在线不卡| 91精品在线视频观看| 最近中文字幕在线中文视频| 精产国产伦理一二三区| 日韩精品在线免费播放| 国产95在线|亚洲| 亚洲国产一区自拍| 国产精品一区二区三区免费观看| 91精品视频在线| 精品极品三级久久久久| 精品色蜜蜜精品视频在线观看| 亚洲乱码一区av黑人高潮| 国产 日韩 欧美 综合| 日韩中文字幕91| 欧美日韩国产一二三| 一二三区精品视频| av午夜在线| 精品久久久91| 在线视频三区| 国产调教精品| 国产日韩电影| 欧美日韩久久不卡| 色综合天天性综合| 欧美日韩久久不卡| 国产亚洲污的网站| 高清不卡一区二区| 国产欧美日韩精品综合| 日韩字幕在线观看| 综合激情国产一区| 日韩中文字幕| 国产婷婷一区二区| 在线视频观看日韩| 在线观看av的网站| 久久99精品久久久久久青青日本| 激情久久99| 日韩一级免费在线观看| 日韩视频1区| www在线视频| 国产久卡久卡久卡久卡视频精品| 日韩精品视频免费| 国产中文在线观看| 久久麻豆视频| 亚洲大片免费看| 精品视频久久| 久久中文精品| 五月综合激情日本mⅴ| 欧美中文字幕精品| 国产精品一区二三区| 国产午夜在线观看| 国产小视频免费在线网址| 日韩欧美在线综合| 国产日韩av一区二区| 国产手机视频一区二区| 日韩亚洲国产欧美| 欧美日韩成人综合| 亚洲伊人婷婷| 色综合天天综合网天天狠天天| 日韩色在线观看| 精品国产999| 国产网站欧美日韩免费精品在线观看 | 在线欧美日韩精品| 国产欧美日韩在线视频| 福利在线国产| 国产中文在线视频| 日韩精品视频免费播放| 婷婷综合福利| 国产高清视频一区二区| 国产三级在线观看视频| 欧美日韩国产在线观看| 亚洲欧洲日韩精品在线| 欧美日韩国产在线看| av免费在线网站| wwwwww在线观看| 日韩欧美亚洲区| 国产黄色小视频| 最新中文字幕在线| 偷窥国产亚洲免费视频| 日韩欧美专区在线| 国产对白在线| 亚洲国产www| 国产日韩在线视频| 亚洲羞羞网站| 国产小视频在线| 欧美日韩精品欧美日韩精品 | 日韩专区中文字幕| 欧美日韩国产中字| 欧美日韩在线视频首页| 又黄又www的网站| 欧美日韩国产综合久久| 国产字幕在线看| 亚洲欧美日本国产专区一区| 中文字幕日韩高清| 欧美国产亚洲一区| 国产99在线 | 亚洲| 国产在线欧美| 欧美.日韩.国产.一区.二区| 欧美日韩亚洲91| 亚洲一级在线| 国产一区不卡精品| 日韩精品视频免费播放| 久久久久久久久综合| 天天综合天天做| 亚洲欧美日本国产专区一区| 精品免费久久久| 日韩中文字幕精品视频| 国自产拍在线网站网址视频| 日韩久久久精品| av最新网址| 国产一二三区精品视频| 国产主播中文字幕| 91精品国产综合久久久蜜臀粉嫩| 欧美国产亚洲一区| 亚洲一卡二卡在线观看| 中文字幕在线精品| 国产婷婷一区二区| 欧美日韩性视频一区二区三区| 91精品国产色综合久久久蜜香臀 | av中文在线资源| 日韩视频在线免费看| 欧美成人vr18sexvr| 日韩精品中文字幕第1页| 欧美国产一区视频在线观看| 在线综合 亚洲 欧美中文字幕| 欧美 日韩 国产在线| 亚洲欧美久久久| 日韩欧美中文| 日韩在线观看视频一区| 日韩午夜一区| 欧美日韩人人澡狠狠躁视频| 99久热re在线精彩视频| 中文欧美字幕免费| 欧美日韩免费精品| 在线一区二区三区精品| 深夜福利一区二区| 日韩三级精品电影久久久| 精品在线观看一区| 日韩专区视频网站| 日韩在线 中文字幕| 精品视频123区在线观看| 国产三级在线观看视频| 国产日韩电影| 中文字幕 欧美 日韩| 91精品网站| 欧美日韩一二三四| 精品对白一区国产伦| 中文字幕精品一区二| 国产成人日日夜夜| 欧美特黄一区| 国自产拍在线网站网址视频| 91精品国产综合久久久久久| av影视在线看| 91久久精品网| www.老鸭窝.com| 91精品视频国产| 欧美日韩精品国产| 日韩av一区二区在线观看| 欧美日韩中文字幕在线视频| 中文字幕精品在线视频| 91精品观看| 午夜一区二区视频| 日韩视频中文字幕| 国产www.大片在线| 国产欧美综合视频| 中文字幕伊人| 亚洲尤物av| 欧美中文字幕在线| 97天天综合网| 国产黄色小视频| 国产三级精品在线观看| 日韩免费视频一区二区视频在线观看 | 精品国产免费观看一区| 精品视频资源站| 视频一区中文字幕国产| 91精品在线国产| 在线观看国产福利视频| 九九九精品视频| 国产一区日韩| 久久久久久久久99精品| 一级片在线免费看| 欧美日韩综合在线观看| 国产午夜精品一区二区三区视频| 精品国产999| 国产v日产∨综合v精品视频| 欧美一级手机免费观看片| aaa欧美日韩| 国产卡1卡2卡三卡在线| 久久精品黄色片| 国产一区日韩欧美| 亚洲精华国产欧美| 不卡一二三区| 欧美中文字幕视频在线观看|