国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

ASP 3.0高級編程(312)

ASP 3.0高級編程(312)

更新時間:2022-05-10 文章作者:未知 信息來源:網絡 閱讀次數:

7.2.4 客戶端腳本錯誤
       到目前為止,我們已了解了來自ASP的錯誤。然而ASP也經常用于創建包含客戶端腳本的網頁。如果包含客戶端代碼的<SCRIPT>元素沒有被設置成RUNAT="SERVER"屬性,ASP將不考慮服務器,而把網頁信息不加改變地傳送到客戶端。
       因此,如果打開了一個ASP網頁,并且顯示的是一個瀏覽器錯誤對話框,就不應該在服務器端尋找ASP程序代碼的錯誤。瀏覽器看不到ASP程序代碼,所以不能識別任何錯誤,如果有一個對話框出現在客戶端,那么在客戶端代碼中必定有一個錯誤。
1.  語法錯誤
如果在網頁中的客戶端程序代碼有語法錯誤的話,當腳本下載到客戶端,瀏覽器便會出現相應的錯誤。盡管網頁中內容仍可正常載入(除非由這些客戶端腳本代碼動態裝入),但網頁停止執行。用戶將看到一個包含錯誤細節的對話框,或者是一個指示網頁包含錯誤的狀態條消息。
現代瀏覽器趨向于隱藏網頁腳本錯誤的細節,而僅在狀態條上顯示一個小的錯誤圖標。在IE 4.0和IE 5.0中,正常的錯誤對話框可以通過Internet Options對話框的Advanced頁進行設置來激活,如圖7-14所示:

圖7-14  Advanced頁面設置屏幕
處理腳本程序代碼中的客戶端錯誤和在服務器端相似,并且通常會更容易些,因為經常可以直接從服務器目錄中通過雙擊來下載網頁。一般不需要通過Web服務器和HTTP獲得網頁來觀察瀏覽器中的結果,其中的唯一不同是一些服務器交互由客戶端腳本來完成,如使用RDS的數據綁定或者動態裝入。
2.  運行期或語義錯誤
在客戶端腳本中,通常可能會遇到語法錯誤,也會經常遇到運行期或語義錯誤。事實上,在客戶端,這種現象是很普遍的。因為在客戶端不能像服務器端那樣對腳本的環境進行控制,不能肯定用戶在他們的機器上正運行什么,實際上在服務器上僅能從一些組件如Browser Capabilities中得到大概情況。
所以,使用客戶端對象或特殊版本的腳本語言和屬性的腳本程序很可能不能正常工作。盡管如此,處理客戶端錯誤和處理服務器端錯誤是差不多的。
3.  在服務器上創建的客戶端程序代碼
在錯誤發生時,作為“客戶端對話框對應于ASP錯誤頁面”規則(關于出錯的地方)的一個特別的例外是,使用ASP程序代碼在服務器上動態地創建客戶端程序代碼。例如,可能想在ASP中進行求值運算,然后把數據傳給運行在客戶端的腳本代碼,可能最容易的方法是把數據作為一個變量插入腳本代碼中:
<%
' get the name of our server from the ServerVariables collection
strServerNameInASP = Request.ServerVariables("SERVER_NAME")
%>

<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "<% = strServerNameInASP %>";

alert('Server name is: ' + strServerName);

// stop hiding code
-->
</SCRIPT>
在客戶端,在ASP處理這個頁面之后,將得到的是:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "WROXBOX";

alert('Server name is: ' + strServerName);

// stop hiding code
-->
</SCRIPT>
可以忽略RUNAT="CLIENT"屬性,但是加上這一項可以使得在查看運行代碼的ASP網頁時更加清楚。
這樣,如果在某個位置想把服務器端數據庫中的數據加入到一個客戶端數組中,可以采用下面的程序實現:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10)             //highest available index will be

<% ' start of ASP processing
intIndex = 0
Do While { not at the end of some recordset }
              strTitle = { get title from database record }
              Response.Write "arrBooks[" & CInt(intIndex) & "] = '" _
                                   & strTitle & "'; " & vbCrlf
              intIndex = intIndex +1
              { move to next record in database }
Loop

do something here on the client with the array of book titles

// stop hiding code
-->
</SCRIPT>
這段服務器端ASP程序代碼產生的客戶端代碼,在客戶端運行時創建書名標題數組。同時產生的客戶端腳本錯誤出現在瀏覽器的錯誤對話框中。錯誤的原因是以arrBooks命名的數組是由JavaScript代碼運行在客戶端時創建的,僅能接受9個書名;而服務器端代碼能很可能產生多于9個的書名,具體多少由源數據庫中的記錄數來決定。這相當于如下客戶端代碼:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10)             //highest available index will be
arrBooks[0] = 'Instant JavaScript';
arrBooks[1] = 'Professional ASP 3.0 Programming';
arrBooks[2] = 'ADO 2.5 Programmers Reference';

etc

arrBooks[9] = 'ASP Techniques for Webmasters';
arrBooks[10] = 'ASP Programmers Reference';          // <- client-side error occurs here
arrBooks[11] = 'ADSI CDO Programming';
arrBooks[12] = 'Professional MTS and MSMQ Programming';

do something here on the client with the array of book titles

// stop hiding code
-->
</SCRIPT>
這個頁面只有經過修正之后才能正常工作,可以通過增加數組大小,也可以通過控制來自數據庫的記錄數使其正常工作。

7.3 防止錯誤
       上面已經看到了能夠出現的一些不同類型的錯誤,并且有了一些查找錯誤的感覺。下面將考慮如何避免把錯誤引入程序中,盡管不能保證所編寫的程序沒有錯誤,但是這里概括的許多技術有助于減少錯誤數目。

良好的編程習慣
       在編程中避免出現錯誤是和良好的編程習慣相關的,這里有許多工作我們要做,以減少把錯誤帶進網頁的可能性。可能有些人因采用某個技術而走向極端,甚至一定程度上在某個特殊問題上因書生氣十足而引入了更多的錯誤。當然編程人員也不可能采用了這里列出的所有技術。
       要考慮的主要內容是:
       · 代碼的格式化和縮進編排。
       · 變量顯式表明。
       · 變量轉換為合適的數據類型。
       · 使用有意義的變量命名約定。
       · 封裝腳本。
       · 注意潛在的錯誤情況。
1.  代碼的格式化和縮進編排
許多VBScript編程員懶于格式化編排其書寫的程序。盡管這并不阻礙程序運行,但這使得查找何處產生了錯誤變得困難。例如,在前面我們看到的程序中,丟失了一個End If,由于嵌套結構的縮進,錯誤在哪里是相當明顯的:
                            objCounters.Remove strCounterName
                     Response.Write "Removed counter " & strCounterName
              <--- missing 'End If' should be here
       End If
End If
%>
如果程序看起來像下面所示的那樣,尋找錯誤將不是一件易事:
<% if Len(Request.Form("cmdSet")) then
strCounterName=Request.Form("lstSet")
strNewValue=Request.Form("txtSet")
if isnumeric (strnewvalue)     then
intNewValue =cint(strNewValue)
       objCounters.Set strCounterName, intNewValue
Response.write      "Set counter"         & strCounterName &" to " & strNewValue

else
Response.write      strNewValue          &" is not a valid number"
       If Len ( Request.Form ("cmdRemove")) then
StrCounterName = Request.Form("lstRemove")

objCounters.Remove strCounterName
Response.write      "Removed counter "& strCounterName
end if
End IF
%>
2.  顯式表明變量
VBScript支持Option Explicit語句。在一個腳本頁面的開頭插入Option Explicit語句時,可以避免使用沒有用Dim命令(或用于動態數組的ReDim)定義的變量。似乎不需要這么做,因為腳本語言允許通過給一個變量賦值來創建一個需要的變量。然而用Option Explicit進行定義有助于避免錯誤,特別是那些難以發現的引起腳本產生不正確結果的邏輯錯誤。
例如,編寫如下程序:
<%
' get value for calculation
strSalesTotal = Request.Form("SalesTotal")
curSalesTotal = CCur(strSalesTotal)
sngCommissionPercent = 2.5

' calculate commission payment
sngCommission = curSalesTotal * (sngComissionPercent /100)
%>
運行這段程序不會產生錯誤(當然,除非用戶給銷售合計值賦了非法的值)。然而這段程序總是會產生0的結果,因為在程序的最后一行中sngCommissionPercent變量名拼寫錯了。腳本解釋器將產生一個新的變量名(叫作sngComissionPercent),由于沒有賦值,在數學計算時返回值總為0。
為了防止這種錯誤,僅需在程序開頭增加Option Explicit語句。
<%
Option Explicit
Dim strSalesTotal
Dim curSalesTotal
Dim sngCommissionPercent

' get value for calculation
strSalesTotal = Request.Form("SalesTotal")
curSalesTotal = CCur(strSalesTotal)
sngCommissionPercent = 2.5

' calculate commission payment
sngCommission = curSalesTotal * (sngComissionPercent /100)
%>
這時,當腳本引擎試圖解釋程序時將識別出一個語法錯誤,并且能夠指出此變量沒有聲明,如圖7-15所示:

圖7-15  顯示的錯誤信息
在JScript中引用一個沒有聲明的變量將返回一個“Undefined”信息,并且在試圖使用變量之前,能夠檢測到這種情況。
3.  變量轉換為合適的數據類型
回頭看看前面的程序,可能發現用CCur函數把用戶提供的數據轉換成了貨幣型數據類型。在VBScript中,有一系列類似這樣的數據變形變換函數,在第3章中有詳細的描述。
blnBoolean = Cbool(varVariant)     ' converts to a Variant of subtype Boolean
bytByte = Cbyte(varVariant)          ' converts to a Variant of subtype Byte
curCurrency = CCur(varVariant)   ' converts to a Variant of subtype Currency
datDate = CDate(varVariant)         ' converts to a Variant of subtype Date
dblDouble = CDbl(varVariant)       ' converts to a Variant of subtype Double
intInteger = CInt(varVariant)         ' converts to a Variant of subtype Integer
lngLong = CLng(varVariant)         ' converts to a Variant of subtype Long
sngSingle = CSng(varVariant)       ' converts to a Variant of subtype Single
strString = CStr(varVariant)          ' converts to a Variant of subtype String
如果不能完成變換,也就是說變量內容對新數據類型來說是無效的,便會出現一個運行期錯誤。然而,如果對數值類型進行變換,我們希望這個數值是有效的,并且能在程序中使用。因此能夠檢測一個均衡的值對于防止錯誤的出現是一件“幸事”。
如果想把輸入空格作0對待,并且把任何其他無效的輸入作為用戶錯誤對待,前面程序變為:
strSalesTotal = Request.Form("SalesTotal")
If Len(strSalesTotal) = 0 Then
       ' no value entered, so assume zero
       curSalesTotal = 0
ElseIf Not IsNumeric(strSalesTotal) Then
       ' not a valid number, so report an error and stop
       Response.Write "The value you entered is not a valid number. "
       Response.Flush
       Resonse.End
Else
       ' OK to conver the string value and use it
       curSalesTotal = CCur(strSalesTotal)
End If
在JScript中,所有的變量都是對象,并且有typeOf()方法。可以使用typeOf()來確定存在變量中的數據是什么類型,見第3章中的詳細論述。
也可以對“null”(VBScript中為Null)進行測試保證在程序使用各種變量之前它們已經賦了值。一個特例是從數據庫中獲得數據時,數據庫中的字段內容經常是Null,表示沒有數據。
4.  變量命名和編碼約定
閱讀過本章和前面幾章后,讀者可以看出我們對變量名使用三個字母的前綴,用以指明它所代表的數據類型。盡管在這兩種腳本語言中用ASP提供的所有變量都是Variant(或JScript中的等價物)類型的,但用變量名來區分出存儲在其中的數據的類型仍是非常有用的,有助于防止編寫程序時出錯。
有許多不同的變量命約定,經常使用的見表7-2:
表7-2  變量類型及前綴
變量類型
前   綴

布爾型(Boolean)
bln

字節型(Byte)
byt

日期/時間型(Date/Time)
dat或dtm

集合型(Collection)
col

雙精度型(Double)
dbl

整型(Integer)
int

長整型(Long)
lng

對象型(Object)
obj

單精度型(Single)
sng

字符型(string)
str

對于一個包含函數和子程序的網頁,指出某個變量是否已經聲明或存在于任何函數和子程序之外是非常有用的。若已經聲明,則該變量對網頁來說是全局變量。對全局變量加上“g”前綴,所以一全局字符串變量可能被命名為gstrMystring;類似的,以“a”為前綴的變量是數組或數組元素。

程序注釋
       許多編程人員感覺到對程序增加注釋不僅增加了不必要的開發時間,而且也減緩了網頁的運行速度,因為腳本解釋器每次必須先讀整個程序,然后再跳過這些注釋。盡管這種觀點有一定的道理,但是一個月后再回過頭來想讀懂沒有注釋的程序,是非常困難的。
       至少應該對常用函數和子程序進行注釋以便你和其他人能重新使用這些程序。特別是,使用新的Server.Execute方法更加容易(詳細情況參閱第4章)。下面是微軟提供的一個例程的注釋格式。
       '*****************************************************
       'Purpose: what the routine is designed to achieve
       'Inputs: a list of all the parameters to the routine
       '      parameter1: description, data-type, etc.
       '      parameter2: description, data-type, etc.
       'Returns: what data type is returned, and what it contains
       'Comments: other comments about the routine, update history, etc.
       '*****************************************************
5.  封裝腳本語言以便代碼重用
剛剛看到了如何注釋子程序和函數以便易于重新使用。面向對象編程的原理是建立在程序代碼重用的基礎上的,并且SSI的#include和新的Server.Execute方法使調用存儲在程序庫中的函數更容易。
例如,如果有一系列函數用于計算稅收和商品的應付費用。可把包含這段程序的頁面插入其他頁面中:
<!-- #inculde VIRTUAL="/library/code/online_sales/tax_and_delivery.inc" -->
包含文件必須含有腳本定界符,或者用<SCRIPT RUNAT="SERVER">...</SCRIPT>或者用<%...%>,每一個子程序和函數應該采用其要求的數值做參數,并且用函數值或更新的參數返回結果。不能使用全局變量,況且不同網頁之間的全局變量也是不可用的。但在主網頁中的程序能安全地調用所需的函數和子程序。
另外可使用Server.Execute(或者Server.Transfer)把執行轉到另一個網頁。如果有一段ASP代碼用來為客戶創建在線采購一覽表,這種方法是非常有用的。它包含HTML用來創建標題、表格,用代碼進行計算并用Request集合的內容填寫相應值(記住不能使用Server.Execute或Server.Transfer把腳本變量傳到另一個網頁)。另外,運行的網頁能夠支持函數、類定義(在VBScript中),或者其他設計為可重新使用的內容。
6.  注意潛在的錯誤情況
編程時不管如何仔細,比如在使用和對變量類型轉換之前對變量值進行測試,但總還是有一些情況不能避免錯誤的出現。明顯的例子是:當使用FileSystemObject對象的方法設法訪問一個用戶指定的文件時,不能確定這個文件是否已移動、刪除或者標記成只讀型,所有這些操作都可能使程序不能工作。
其他類似的情況可能是,當訪問數據庫或其他數據存儲時,對用戶帳戶而言,有時要求某一層權限。在這種情況下,可能因為需要的訪問不能實現,使程序不能工作。
可以通過采取預防性措施編寫程序,來測試類似的潛在錯誤。例如,可以使用Tools組件或者FileSystemObject對象的FileExists方法來查看,是否一個文件在訪問之前就已存在了;或者使用Permission Checker組件來查看當前用戶帳號是否有訪問需要的文件或資源的權限;也可以通過使用FileSystemObject獲得一個文件的屬性設置,以便在刪除或重寫之前查看文件是否是只讀的。
如果不考慮可能發生的錯誤并防止錯誤發生的話,這些情況和許多類似的情況都可能是潛在的運行期錯誤源。
7.  最后的測試
很明顯,測試是對錯誤的最好防范方法。錯誤能通過應用程序影響到其他操作,如果不及時發現能引起不可估量的損失。用各種數值(如用戶提交的,或者訪問一個數據庫得到的數據)對網頁進行測試。同時,更重要的是,如果采用我們不希望的值會發生什么。程序能避免這些情況產生其他錯誤或者避免擾亂正在測試的子程序嗎?
好的測試技術應該包括一系列值,如期望的值、邊界條件值和超出邊界的值。用期望傳送到網頁的值進行測試是應該經常做的工作,同樣超出邊界的值通常比較容易阻止。例如,可以限制可接受的數值范圍為-100~+100,程序如下:
If (intValue < -100) or (intValue > 100) Then
       ' not a valid value, so report an error and stop
       Response.Write "Value must be between –100 and +100 inclusive. "
       Response.Flush
       Response.End
End If
然而要記住查看邊界條件,上面的程序能處理-100和+100嗎?想把數據限制在-100~+100中嗎?取0時會發生什么?上面的程序會顯示“Divide By Zero”錯誤而最終停止執行嗎?

7.4 處理錯誤
       即使采用了防御性編程技術之后,錯誤仍能進入到網頁,這可能是因為測試并不充分,或者是因為所依靠的一些其他資源或服務沒有正確工作。為了防止頁面出現問題,在程序中要能夠進行定制錯誤處理。

7.4.1 ASP缺省錯誤處理器
       前面已經看到過,ASP和IIS能找出網頁中的大多數錯誤,并且能自動生成錯誤信息頁,這些錯誤幾乎總是500.100類型的,并且IIS用Server.Transfer方法裝載以500-100.asp命名的缺省錯誤頁,然后傳送給客戶。第4章介紹了這一工作過程,以及如何與定制錯誤網頁接口。
       然而,運行期腳本錯誤不總是由IIS發現的,當一個運行期錯誤發生時,腳本引擎會查看一下目前執行點或語句的環境。如果正在執行一個子程序或函數,缺省的腳本引擎錯誤處理器通過終止子程序的運行并返回調用子程序的地方來指出錯誤。
       在這里,程序會查看是否實現了其他的錯誤處理器,如果沒有的話,又會重復這個過程,然后返回到調用子程序的地方。當子程序返回到網頁的主程序(在任何其他子程序或函數外面)時,程序又查看是否實現了任何其他的錯誤處理器。在這個過程中,只有確實沒有發現其他的錯誤處理器,程序才給ASP提示錯誤,指示IIS把執行轉到缺省的錯誤頁面。


溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        99re这里都是精品| 亚洲第一成人在线| 欧美日韩久久不卡| 中文字幕av一区 二区| 国产乱对白刺激视频不卡| 国产日韩欧美a| 91美女片黄在线| 亚洲va欧美va天堂v国产综合| 欧美天天综合网| 青椒成人免费视频| 国产调教视频一区| 97精品久久久午夜一区二区三区| 亚洲无人区一区| 日韩一区二区精品葵司在线| 国产福利91精品一区| 中文字幕av一区二区三区| 色哟哟一区二区三区| 石原莉奈在线亚洲三区| 337p日本欧洲亚洲大胆色噜噜| 播五月开心婷婷综合| 一区二区三区中文字幕电影| 欧美精品在线视频| 国产在线观看一区二区| 一区二区三区四区不卡视频| 欧美人牲a欧美精品| 国产美女av一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 丝袜a∨在线一区二区三区不卡| 日韩精品一区二区三区在线| 一本色道久久综合亚洲91| 喷水一区二区三区| 亚洲美女屁股眼交3| 日韩一区二区三区视频| 不卡大黄网站免费看| 久久99精品久久久久久国产越南| 国产亚洲一区二区三区在线观看| 欧美日韩免费电影| 91在线你懂得| 国产精品白丝jk黑袜喷水| 亚洲激情校园春色| 中文幕一区二区三区久久蜜桃| 欧美日韩一区不卡| 成人av动漫在线| 狠狠色狠狠色综合日日91app| 亚洲无人区一区| 中文字幕中文字幕一区| 久久美女艺术照精彩视频福利播放| 91国内精品野花午夜精品| 成人黄色av电影| 国产一区二区三区久久悠悠色av| 视频在线观看国产精品| 一区二区在线观看视频在线观看| 国产精品美女www爽爽爽| 日韩久久精品一区| 精品国产免费久久| 91精品国产入口| 91精品国产乱码| 欧美日韩高清一区二区| 欧美综合天天夜夜久久| 91免费版pro下载短视频| 91麻豆免费观看| 色综合久久久网| 91视频国产资源| 99久久久久免费精品国产| 国产成人av电影在线观看| 国产一区二区不卡| 成人激情图片网| 国产成人精品免费| 成人午夜av电影| 不卡区在线中文字幕| 色欲综合视频天天天| 欧美亚洲综合久久| aaa欧美色吧激情视频| 成人激情动漫在线观看| 91黄色免费版| 在线看国产一区| 精品三级在线观看| 久久亚洲私人国产精品va媚药| 国产女人aaa级久久久级| 中文字幕av免费专区久久| 亚洲欧美日韩国产综合在线| 亚洲国产一区二区三区青草影视| 日日摸夜夜添夜夜添亚洲女人| 香蕉成人啪国产精品视频综合网 | 麻豆传媒一区二区三区| 国产精品69毛片高清亚洲| 成人手机在线视频| 在线日韩国产精品| 精品少妇一区二区| 尤物av一区二区| 国产一区二区在线影院| 日本丶国产丶欧美色综合| 欧美videossexotv100| 亚洲男同性恋视频| 国精产品一区一区三区mba桃花| 91麻豆成人久久精品二区三区| 91麻豆精品国产91久久久资源速度 | 亚洲小少妇裸体bbw| 蜜桃久久av一区| 91丨九色丨黑人外教| 欧美一区二区在线看| 中文字幕中文字幕在线一区 | 亚洲免费成人av| 黄一区二区三区| 欧美伦理视频网站| 一区二区中文视频| 国产麻豆欧美日韩一区| 欧美日韩国产综合一区二区三区 | 青青草视频一区| www.亚洲国产| 久久蜜桃av一区二区天堂| 午夜欧美在线一二页| 99re成人精品视频| 久久精品一区二区| 久久精品理论片| 91精品婷婷国产综合久久竹菊| 国产精品女主播av| 国产成人亚洲综合a∨猫咪| 日韩一区二区三区高清免费看看| 亚洲男人的天堂在线aⅴ视频| 激情欧美日韩一区二区| 日韩欧美色综合网站| 亚洲图片欧美一区| 91精品91久久久中77777| 亚洲人成网站精品片在线观看| 国产传媒一区在线| 久久久精品国产免费观看同学| 老司机午夜精品| 精品国产一区二区国模嫣然| 亚洲不卡在线观看| 在线不卡的av| 亚洲黄色片在线观看| 日本道色综合久久| 最新国产成人在线观看| 99riav一区二区三区| 中文字幕日本乱码精品影院| 成人动漫精品一区二区| 国产蜜臀av在线一区二区三区| 国内不卡的二区三区中文字幕| 久久免费看少妇高潮| 成人午夜视频免费看| 亚洲婷婷综合久久一本伊一区 | 久久久av毛片精品| 成人污污视频在线观看| 亚洲天天做日日做天天谢日日欢| 91在线视频18| 石原莉奈在线亚洲三区| 日韩欧美成人一区二区| 国产精品自拍毛片| 亚洲黄色av一区| 日韩一区二区三区电影在线观看| 久久99精品久久久久久国产越南| 国产午夜精品理论片a级大结局| 粉嫩欧美一区二区三区高清影视| 国产精品国产三级国产普通话99| 91美女片黄在线| 美女视频黄频大全不卡视频在线播放 | 国产成人精品综合在线观看| 亚洲色欲色欲www在线观看| 欧美日韩在线播| 国产精品99久久久| 亚洲色图视频网站| 精品久久久久久久久久久院品网 | 日本女优在线视频一区二区| 国产精品不卡一区| 91精品国产品国语在线不卡| 成人性生交大合| 丝袜美腿亚洲综合| 国产精品人人做人人爽人人添 | 91亚洲精品一区二区乱码| 亚洲成va人在线观看| 久久久精品免费观看| 欧美三级在线看| 成人激情动漫在线观看| 青青草国产精品97视觉盛宴 | 成人h精品动漫一区二区三区| 午夜伊人狠狠久久| 国产精品久久久久精k8 | 欧美日韩国产首页在线观看| 国产一区中文字幕| 天天操天天干天天综合网| 久久―日本道色综合久久| 国产精品资源在线看| 亚洲国产一区二区在线播放| 日本一区二区三区四区在线视频 | 视频一区欧美精品| 国产精品久久久久久久浪潮网站| 日本韩国欧美国产| 丁香桃色午夜亚洲一区二区三区| 亚洲自拍与偷拍| 国产欧美一区二区精品性色超碰 | 日韩欧美中文字幕精品| 91国产福利在线| www.日韩在线| 国内精品第一页| 午夜电影久久久| 1024亚洲合集| 中文字幕一区二区三区不卡在线 | 欧美色中文字幕| 色综合婷婷久久|