国产精品青草久-国产精品情侣愉拍-国产精品区网红主-国产精品区一区二-国产精品热久久-国产精品热热热-国产精品人aⅴ-国产精品人成在线-国产精品人妻人伦-国产精品人人

金喜正规买球

用 JSP 標(biāo)記文件動態(tài)生成 JavaScript 代碼

轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-30 11:28:30.000|閱讀 847 次

概述:在本文中,您將了解如何基于 JSP 標(biāo)記文件構(gòu)建可重用的 Ajax 和 Java 組件,而這些 JSP 標(biāo)記文件很容易開發(fā)和部署。更改之后,JSP 標(biāo)記文件會由 Java EE 服務(wù)器自動重編譯,而無須重啟應(yīng)用程序。此外,您還能完全控制所生成的代碼,并能輕松地定制這些輕量級組件,因?yàn)樗鼈兪褂玫氖?JSP 語法。

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

  很多 Web 開發(fā)人員都經(jīng)常抱怨說 Java™ EE 太復(fù)雜、構(gòu)建新的 Web 組件太難、定制現(xiàn)有的組件沒有預(yù)想的那樣簡單,并且即便是很小的更改都需要重新啟動應(yīng)用程序。本系列給出了針對這些問題的解決方案,即采用代碼生成器、約定、腳本語言和先進(jìn)的 JavaServer Pages ™ (JSP) 特性。在本文中,您將了解如何基于 JSP 標(biāo)記文件構(gòu)建可重用的 Ajax 和 Java 組件,而這些 JSP 標(biāo)記文件很容易開發(fā)和部署。更改之后,JSP 標(biāo)記文件會由 Java EE 服務(wù)器自動重編譯,而無須重啟應(yīng)用程序。此外,您還能完全控制所生成的代碼,并能輕松地定制這些輕量級組件,因?yàn)樗鼈兪褂玫氖?JSP 語法。

  本系列含 4 部分,展示了一種基于 JSP 的技術(shù),用以生成 JavaScript 代碼、顯著減少需要手動編寫的代碼量,本文是第 1 部分。本文的示例應(yīng)用程序展示了如何生成 JavaScript 函數(shù)來發(fā)送 Ajax 請求和處理 Ajax 響應(yīng)。如果想要輕松地更改 Ajax 代碼,可以將這里討論的簡單技巧應(yīng)用到實(shí)際的應(yīng)用程序中。本文更寬泛的目標(biāo)是展示如何使用 JSP 標(biāo)記文件針對具體需求生成 JavaScript 代碼,而非只是 Ajax 例程。

  使用框架和代碼生成器

  如果您很幸運(yùn)地找到了一種能滿足您需要的組件或框架,那么就請使用它吧。如果沒有找到也沒關(guān)系,因?yàn)槟偸强梢蚤_發(fā)自己的解決方案,也可以定制現(xiàn)有的一段代碼。不管是哪種情況,一種很好的做法是 “參數(shù)化” 代碼并將其放入一個可重用的庫,而非將參數(shù)硬編碼到您的代碼里。不過有時候,實(shí)現(xiàn)泛型并不實(shí)際,因?yàn)樗鼤?開發(fā)變得復(fù)雜,而非簡化。在將泛型代碼放入可重用組件或框架時,可以考慮使用代碼生成器來更有效地生成特定的代碼。

  在開發(fā)的過程中避免復(fù)制 & 粘貼

  假設(shè),您需要應(yīng)用程序使用 Ajax 請求站點(diǎn)上的某些信息,最快的(當(dāng)然不是最好的)方法是找到一些如清單 1 這樣的免費(fèi)代碼、更改 URL 并將這些代碼粘貼到 Web 頁面。很多開發(fā)人員都會這么做,但這種做法會導(dǎo)致巨大的維護(hù)問題。如果應(yīng)用程序具有數(shù)百個頁面,最后的結(jié)果將是出現(xiàn)大量像清單 1 中的 getInfo() 這樣的函數(shù)。不好的一面是每次需要進(jìn)行添加或更改(比如實(shí)現(xiàn) Ajax 請求的錯誤處理)時,您都必須要手動修改所有頁面并重新測試它們。好的一面是您可以通過使用庫、框架和代碼生成器,很容易地避免這個維護(hù)問題。


清單 1. Ajax 函數(shù)

function getInfo(country, city) {
var request = null;
if (window.ActiveXObject)
request = new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest)
request = new XMLHttpRequest();
else
return;

    var url = "CityInfo.jsp?country=" + escape(country)
+ "&city=" + escape(city);
request.open("GET", url, true);

    function processResponse() {
if (request.readyState == 4) {
if (request.status == 200) {
// ...
}
}
}

    request.onreadystatechange = processResponse;
request.send(null);
}
 

  開發(fā)泛型函數(shù)

  一種好的開發(fā)實(shí)踐是將盡量多的代碼移入可重用的例程、函數(shù)、類或組件,而這些例程、函數(shù)、類或組件均能劃分到庫或框架中。在我們的示例中,您能找到一個泛型函數(shù),此函數(shù)能創(chuàng)建 XMLHttpRequest 實(shí)例和調(diào)用實(shí)例的 open() 和 send() 方法。

  假設(shè)您決定使用的函數(shù)的名稱為 xhr(),它能接受 5 個參數(shù):返回信息的頁面的 URL、包含名稱和請求參數(shù)的值的兩個數(shù)組、HTTP 方法和用來處理 Ajax 響應(yīng)的一個回調(diào)函數(shù)。現(xiàn)在,您的應(yīng)用程序?qū)鼮楹唵蔚暮瘮?shù),比如清單 2 中所示的 getInfo2(),而且代碼也更容易維護(hù)。如果想要更改發(fā)送 Ajax 請求的代碼,只能修改 xhr() 函數(shù)。


清單 2. 使用泛型函數(shù)

function xhr(url, paramNames, paramValues, method, callback) {
// send Ajax request ...
}

function getInfo2(country, city) {
function processResponse(request) {
// process Ajax response ...
}
xhr("CityInfo.jsp", ["country", "city"], [country, city],
"GET", processResponse);
}
 

  清單 2 包含的泛型函數(shù),名為 xhr(),特定于應(yīng)用程序的函數(shù)名為 getInfo2()。泛型代碼應(yīng)被移入單獨(dú)的 JavaScript 文件以便能將可重用函數(shù)導(dǎo)入需要它們的任何頁面。對于特定的代碼,比如 getInfo2() 函數(shù),如果應(yīng)用程序需要基于相同模式的很多函數(shù),就應(yīng)該考慮使用代碼生成器。

  動態(tài)生成代碼

  代碼生成器能顯著提高開發(fā)和維護(hù) Web 應(yīng)用程序的效率。比如,您可以使用 JSP、Java 代碼或任何其他語言來從模板生成 JavaScript 函數(shù)。得益于屬性名稱,用來指定生成器參數(shù)的基于 XML 的語法能讓代碼可讀性更好,也更容易理解。此外,標(biāo)記屬性沒有像 JavaScript 函數(shù)或 Java 方法的參數(shù)那樣的固定順序。

  對比起來,使用 XML 標(biāo)記的一個明顯優(yōu)點(diǎn)就是它們能為屬性使用默認(rèn)值,然而編程語言只提供了有限的可能性來刪除方法參數(shù)。請考慮這些關(guān)于代碼生成器可擴(kuò)展性的諸多方面,因?yàn)樵诓淮騺y現(xiàn)有代碼的情況下向標(biāo)記增加新的屬性要比更改方法簽名簡單得多。使用 XML 和 JSP 的這些句法方面的優(yōu)點(diǎn)是很明顯的,尤其是當(dāng)代碼生成器需要大量屬性的時候。

  JSP 是在服務(wù)器端生成 JavaScript 代碼的一種很好的選擇,因?yàn)椋?/p>

  1. 開發(fā)人員已經(jīng)了解 JSP 語法。
  2. JSTL 為條件及循環(huán)結(jié)構(gòu)提供了標(biāo)記。
  3. JSP 頁面讓您可以很方便地生成任何形式的文本,包括 JavaScript 函數(shù)。
  4. 此外,JSP 技術(shù)已經(jīng)有了一種很強(qiáng)大的機(jī)制來將可執(zhí)行代碼放在定制標(biāo)記后面,所以,不必為基于 JSP 語法的模板實(shí)現(xiàn)解析器。最后,在每次您做更改時,也不需要外部工具來重新生成代碼。

  清單 3 中包含取自于本文下一章節(jié)所要展示的應(yīng)用程序的一個代碼片段。此處使用了一個名為 <da:xhr> 的定制的 JSP 標(biāo)記來生成 getInfo3() 函數(shù),當(dāng)用戶單擊一個標(biāo)簽為 Get Info 的按鈕時,該函數(shù)就會在 Web 瀏覽器中被調(diào)用。


清單 3. 使用 JSP 標(biāo)記文件生成 Ajax 函數(shù)

<%@ taglib prefix="da" tagdir="/WEB-INF/tags/dynamic/ajax" %>
...
<script type="text/javascript">
<da:xhr function="getInfo3(country, city)" url="CityInfo.jsp" method="GET">
// process Ajax response ...
</da:xhr>
</script>
...
<button ... onclick="getInfo3(...)">Get Info</button>
 

  所生成的 JavaScript 代碼可被放入調(diào)用清單 3 中所示的生成函數(shù)的 Web 頁面的 <script> 元素中。如果多個 Web 頁面需要同樣的 JavaScript 代碼,就像任何常規(guī)的 JavaScript 文件一樣, 動態(tài)生成此代碼的一個單獨(dú)的 JSP 文件將被導(dǎo)入到這個應(yīng)用程序的 Web 頁面,在 <script> 元素的 src 屬性中指定其 URI(參見清單 4)。


清單 4. 導(dǎo)入由 JSP 頁面生成的 JavaScript

<script src="DynamicJavaScript.jsp" type="text/javascript">
</script>
 

  緩存生成的代碼

  雖然在開發(fā)階段為每個請求生成 JavaScript 代碼并不會產(chǎn)生問題,但您不得不考慮在生產(chǎn)環(huán)境中的性能損失。解決的方法就是緩存代碼,比如用 SJTL 將生成的代碼存儲到 JSP application 作用域,如清單 5 所示。然后,可以在 Web 頁面中用 EL 結(jié)構(gòu)(例如 ${applicationScope.cachedCode})插入所緩存的代碼。


清單 5. 緩存生成的代碼

<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>

<c:if test="${empty cachedCode}">
<c:set var="cachedCode" scope="application">
alert("Cached Code");
</c:set>
</c:if>

${applicationScope.cachedCode}
 

  創(chuàng)建一個簡單的 Ajax 應(yīng)用程序

  本節(jié)描述了示例應(yīng)用程序的 JSP 頁面。CityForm.jsp 頁面包括一個 Web 表單,其數(shù)據(jù)由 Ajax 發(fā)送到 Web 服務(wù)器。另一個名為 CityInfo.jsp 的頁面生成 Ajax 響應(yīng)。

  構(gòu)建 Ajax 頁面

  此示例應(yīng)用程序的 CityForm.jsp 頁面使用了兩個定制標(biāo)記,名稱分別為 <da:xhr> 和 <da:innerHTML>,是作為 JSP 標(biāo)記文件實(shí)現(xiàn)的。xhr.tag 文件生成能發(fā)送 Ajax 請求的一個 JavaScript 函數(shù),而 innerHTML.tag 則生成單一一行代碼,它用 innerHTML 屬性在 HTML 元素內(nèi)插入一些內(nèi)容。兩個標(biāo)記文件的 JSP 代碼將在本文的稍后部分給出。

  JSP 頁面(見清單 6)聲明了所使用的標(biāo)記庫,它們是 JSTL Core(前綴為 c)和標(biāo)記文件庫(前綴為 da)。CityForm.jsp 還導(dǎo)入了兩個 JavaScript 文件,名字分別為 ajax.js 和 encode.js ,其函數(shù)從由 <da:xhr> 和 <da:innerHTML> 生成的代碼調(diào)用。這些定制標(biāo)記用于在 <script> 元素內(nèi)生成名為 getInfo() 的一個 JavaScript 函數(shù)的代碼。


清單 6. CityForm.jsp 示例

<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix=&quot;da" tagdir="/WEB-INF/tags/dynamic/ajax" %>

<html>
<head>
<title>Ajax Demo</title>
<script src="ajax.js" type="text/javascript">
</script>
<script src="encode.js" type="text/javascript">
</script>
<script type="text/javascript">
<da:xhr function="getInfo(country, city)" method="GET"
url="CityInfo.jsp" sync="false" json="true" cpr="true">
<da:innerHTML id="info" value="json.info" encode="true"/>
</da:xhr>

function getInfo2(form) {
var country = form.country.options[form.country.selectedIndex].text;
var city = form.city.value;
getInfo(country, city);
}
</script>
</head>
<body>
<form name="data">
Country:
<select name="country" size="1">
<option>Canada</option>
<option>UK</option>
<option selected>USA</option>
</select>
City: <input name="city" size="20">
<button type="button" onclick="getInfo2(this.form)">Get Info</button>
</form>
<div id="info"></div>
</body>
</html>
 

  CityForm.jsp 頁面的 Web 表單包含一個標(biāo)簽為 Get Info 的按鈕、一個國家列表和一個讓用戶輸入城市名稱的輸入字段。當(dāng)用戶單擊這個按鈕時,Web 瀏覽器將調(diào)用 getInfo2() 函數(shù),它的調(diào)用是在 onclick 屬性內(nèi)編碼的。此函數(shù)包含 Web 表單中的 country 和 city 字段的值,并且會將這些值傳遞給 getInfo() 函數(shù),該函數(shù)會將 Ajax 請求發(fā)送給服務(wù)器。Ajax 響應(yīng)將包含需要插入到置于 Web 表單下的 <div> 元素的信息。

  <da:xhr> 的屬性允許指定已生成的 JavaScript 函數(shù)的頭、用來發(fā)送 Ajax 請求的 HTTP 方法以及生成 Ajax 響應(yīng)的那個頁面的 URL。名為 sync、json 和 cpr 的屬性則可以讓您指定已生成代碼的各種特性。

  如果 sync 為 true,那么信息就會被同步請求,這意味著當(dāng)從服務(wù)器檢索數(shù)據(jù)時,用戶界面將會被阻塞。 如果 sync 為 false,請求就是異步的,意味著在信息通過網(wǎng)絡(luò)傳遞和由服務(wù)器處理時,用戶可以進(jìn)行操作。

  如果 json 屬性為 true,那么這個代碼生成器將會用 添加一行 JavaScript 代碼來評估 Ajax 響應(yīng)。最后,如果 <da:xhr> 標(biāo)記的 cpr 屬性是 true,那么 xhr.tag 文件將產(chǎn)生一些 JavaScript 代碼片段,它將在發(fā)送一個新請求前關(guān)閉之前的請求。我在討論 ajax.js 和 xhr.tag 文件時,將會介紹更多關(guān)于此特性的內(nèi)容。

  所生成的代碼

  清單 7 顯示了 CityForm.jsp 頁面已生成的 getInfo(country, city) 函數(shù)。所使用的 HTTP 方法是 GET,生成 Ajax 響應(yīng)的頁面的 URL 是 CityInfo.jsp,sync 屬性是 false,json 與 cpr 屬性都是true。所生成的 JavaScript 代碼使用 ajax.js 文件的 openRequest()、sendRequest()、closeRequest() 和 httpError() 函數(shù),以及 encode.js 的 appendParam() 與 htmlEncode() 函數(shù)。

清單 7. 為使用 GET 的 Ajax 請求所生成的函數(shù)

var getInfoRequest = null;

function getInfo(country, city) {
if (getInfoRequest) closeRequest(getInfoRequest);

    var url = "CityInfo.jsp";
url += ?;
url = appendParam(url, "country", country);
url = appendParam(url, "city", city);

    var request = openRequest("GET", url, true);
getInfoRequest = request;
if (request == null) return null;

    function processResponse() {
if (request.readyState == 4) {
if (request.status == 200) {
;
document.getElementById("info").innerHTML
= htmlEncode(json.info);
} else {
httpError(request);
document.location = url;
}
}
}

    request.onreadystatechange = processResponse;
sendRequest(request, null);
return request;
}
 

  如果將 HTTP 方法改為 POST,那么所生成的代碼也會相應(yīng)地被修改,如清單 8 中所示。這里并沒有向 url 添加請求參數(shù),相反,getInfo() 函數(shù)會將這些參數(shù)追加給一個名為 body 的變量,此變量之后會被傳遞給 ajax.js 文件的 sendRequest() 函數(shù)。

清單 8. 為使用 POST 的 Ajax 請求所生成的函數(shù)

function getInfo(country, city) {
...
var url = "CityInfo.jsp";

var body = "";
body = appendParam(body, "country", country);
body = appendParam(body, "city", city);

    var request = openRequest("POST", url, true);
...
sendRequest(request, body);
return request;
}
 

  生成 JSON 響應(yīng)

  CityInfo.jsp 頁面(見清單 9)使用 JavaScript Object Notation (JSON) 生成對 Ajax 請求的響應(yīng)。為了保持頁面無腳本,Java 代碼將被移入名為 noCache.tag 和 jstring.tag 的兩個 JSP 標(biāo)記文件,它們將由 <da:noCache> 和 <da:jstring> 從 JSP 頁面調(diào)用。將 Java 代碼放入 JSP 標(biāo)記文件要比開發(fā)標(biāo)記處理程序類容易得多,因?yàn)?JSP 容器會在不必重啟應(yīng)用程序的情況下為您生成這些類并且會在代碼更改后自動重新編譯 Java 代碼。


清單 9. CityInfo.jsp 示例

&lt;%@ taglib prefix="da" tagdir="/WEB-INF/tags/dynamic/ajax" %>

<da:noCache/>

json = {
country: <da:jstring value="${param.country}"/>,
city: <da:jstring value="${param.city}"/>,
info: <da:jstring>Info on ${param.city}, ${param.country}</da:jstring>
}
 

  清單 10 給出了 JSON 響應(yīng)。

清單 10. 所生成的 JSON

json = {
country: "UK",
city: "London",
info: "Info on London, UK"
}
 

  noCache.tag 文件(參見清單 11)包含單一一行 Java 代碼,可以設(shè)置 HTTP 響應(yīng)的 Cache-Control 頭。


清單 11. noCache.tag 文件

<% response.setHeader("Cache-Control", "no-cache"); %>
 

  jstring.tag 文件(如清單 12 所示)編碼一個 JavaScript 字符串,其值可以作為屬性,也可以作為內(nèi)容主體傳遞給標(biāo)記文件。如果 value 屬性不指定,<jsp:doBody> 動作就會執(zhí)行包括在 <da:jstring> 和 </da:jstring> 之間的 JSP 代碼,設(shè)置 page 作用域的 value 變量。 在這兩種情況下,Java 代碼用 jspContext.getAttribute() 獲得字符串值并會逐個地輸出字符,轉(zhuǎn)義特殊和非 ASCII 字符。


清單 12. jstring.tag 文件

<%@ attribute name="value&quot; required="false" rtexprvalue="true" %>

<%@ taglib prefix="c&quot; uri="//java.sun.com/jsp/jstl/core" %>

<c:if test="${empty value}">
<jsp:doBody var="value"/>
</c:if>

<%
String value = (String) jspContext.getAttribute("value");
out.write(");
int len = value.length();
for (int i = 0; i < len; i++) {
char ch = value.charAt(i);
switch (ch) {
case \\: out.write("\\\\"); break;
case \n: out.write("\\n"); break;
case \r: out.write("\\r"); break;
case \t: out.write("\\t"); break;
case ":  out.write("\\\""); break;
default: {
if ( <= ch && ch <= ~)
out.write(ch);
else {
out.write("\\u");
for (int j = 3; j >= 0; j--) {
int k = (((int) ch) >> (j << 2)) & 0x0f;
out.write((char) (k < 10 ? k + 48 : k + 55));
}
}
}
}
}
out.write(");
%>
 

  開發(fā) JavaScript 函數(shù)

  本節(jié)介紹 ajax.js 和 encode.js 文件,其函數(shù)均從由 xhr.tag 和 innerHTML.tag 文件生成的 JavaScript 代碼調(diào)用。

  XMLHttpRequest 相關(guān)的函數(shù)

  ajax.js 文件的 openRequest() 函數(shù)(參見清單 13)接受 3 個參數(shù)(method、url 和 async)并會創(chuàng)建一個 XMLHttpRequest 實(shí)例。然后,它會調(diào)用 open() 方法并返回初始化了的 request 對象。如果 body 參數(shù)不是 null,sendRequest() 函數(shù)就會設(shè)置 Content-Type 頭并調(diào)用 request 對象的 send() 方法。


清單 13. ajax.js 文件

function openRequest(method, url, async) {
var request = null;
if (window.ActiveXObject)
request = new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest)
request = new XMLHttpRequest();
if (request)
request.open(method, url, async);
return request;
}

function sendRequest(request, body) {
if (body)
request.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
request.send(body);
}

function closeRequest(request) {
request.onreadystatechange = function() { };
request.abort();
delete request;
}

function httpError(request) {
alert("Http Error: " + request.status);
}
 

  closeRequest() 方法將 onreadystatechange 屬性設(shè)置為一個空函數(shù),調(diào)用 abort() 方法并之后使用 JavaScript 的 delete 操作符釋放 request 對象的內(nèi)存。該函數(shù)應(yīng)該在處理完 Ajax 請求之后對每個 XMLHttpRequest 實(shí)例調(diào)用。否則,很可能導(dǎo)致 Web 瀏覽器內(nèi)的內(nèi)存泄露。ajax.js 的最后一個函數(shù)是 httpError(),它在警告窗口顯示請求的狀態(tài)。

  HTML 和 URL 編碼函數(shù)

  encode.js 文件的 htmlEncode() 函數(shù)(參見清單 14)接受字符串參數(shù)并會用 &amp;、&lt; 和 &gt; 替換 &、< 和 > 字符。attrEncode() 函數(shù)執(zhí)行的是同樣的操作,之后用 &quot; 替換 " 字符以便所編碼的字符串可用作屬性的值。

  JavaScript 的 escape() 函數(shù)通常用來編碼 Ajax 請求的請求參數(shù)。應(yīng)該注意 escape() 沒有編碼 + 字符,這是個問題,因?yàn)樗械?+ 均會在服務(wù)器上被解碼為空格字符。

  上面談及的問題可由 encode.js 文件的 urlEncode() 函數(shù)修復(fù),此文件使用了 JavaScript 的 escape() 來執(zhí)行 URL 編碼,并會在之后用 %2B 替換所有的 + 字符以便編碼后的字符串可以在服務(wù)器端正確解碼。


清單 14. encode.js 文件

function htmlEncode(value) {
return value ? value.replace(/&/g, "&amp;")
.replace(/</g, "&lt;").replace(/>/g, "&gt;") : "";
}

function attrEncode(value) {
return htmlEncode(value).replace(/"/g, "&quot;");
}

function urlEncode(str) {
return str ? escape(str).replace(/\+/g, "%2B") : "";
}

function isArray(a) {
return a.sort ? true : false;
}

function appendParam(url, name, value) {
if (isArray(value)) {
for (var i = 0; i < value.length; i++)
url = appendParam(url, name, value[i]);
} else {
if (url && url.length > 0) {
if (url.charAt(url.length-1) != ?)
url += "&";
} else
url = "";
url += urlEncode(name) + "=" + urlEncode(value);
}
return url;
}
 

  appendParam() 函數(shù)向給定 URL 添加名稱/值對。如果第三個參數(shù)是一個數(shù)組,JavaScript 代碼就會在其元素上迭代并會遞歸調(diào)用 appendParam(),以便針對數(shù)組中的每個元素將名稱/值對添加至 url。

  使用 JSP 標(biāo)記文件生成 JavaScript 代碼

  本節(jié)介紹的是 xhr.tag 和 innerHTML.tag 文件。前者生成能將 Ajax 請求發(fā)送給服務(wù)器的 JavaScript 函數(shù),后者則生成能在 Web 瀏覽器內(nèi)處理 Ajax 請求的回調(diào)函數(shù)的代碼。

  發(fā)送 Ajax 請求

  <da:xhr> 標(biāo)記接受 6 個屬性:所生成的 JavaScript 函數(shù)的頭部、HTTP 方法、將響應(yīng)返回給 Ajax 請求的頁面的 URL、指示請求應(yīng)該同步還是異步發(fā)送的一個布爾屬性、指定請求是否使用 JSON 格式的另一個布爾屬性以及用來啟用本文稱為 “關(guān)閉之前請求” 特性的屬性(cpr)。所有這些屬性均通過 <%@attribute%> 指令在 xhr.tag 文件中聲明(參見清單 15)。

  接下來,標(biāo)記文件使用 <%@taglib%> 指令聲明所使用的標(biāo)記庫,將 method 屬性的字符轉(zhuǎn)變成大寫,定義稱為 reqVarName 的 JSP 變量,該變量構(gòu)建自所生成的 JavaScript 函數(shù)的名稱和 Request 字符串。這之后,xhr.tag 文件開始生成 JavaScript 代碼。如果 cpr 屬性為 true,就會聲明一個 JavaScript 變量并由 null 對該變量進(jìn)行初始化。此變量用來保存之前的請求,而該請求必須在下次調(diào)用所生成的函數(shù)時被 “關(guān)閉”。本文前一章節(jié)已經(jīng)介紹過 ajax.js 文件的 closeRequest() 函數(shù)。

  <dau:appendParams> 標(biāo)記用于 xhr.tag 文件以便向 url 變量追加請求參數(shù)(如果 method 為 GET)或向 body 變量追加請求參數(shù)(如果 method 為 POST)。ajax.js 文件的 openRequest() 函數(shù)創(chuàng)建和初始化 XMLHttpRequest 實(shí)例。Ajax 請求通過 sendRequest() 函數(shù)發(fā)送給服務(wù)器,該函數(shù)的代碼可以在同一個 ajax.js 文件找到。

清單 15. xhr.tag 文件

<%@ attribute name="function" required="true" rtexprvalue="true" %>
<%@ attribute name="method" required="false" rtexprvalue="true" %>
<%@ attribute name="url" required="true" rtexprvalue="true" %>
<%@ attribute name="sync" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>
<%@ attribute name="json" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>
<%@ attribute name="cpr" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>

<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="//java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="dau" tagdir="/WEB-INF/tags/dynamic/ajax/util" %>

<c:set var="method" value="${empty method ? GET : fn:toUpperCase(method)}"/>
<c:set var="reqVarName"
value="${fn:trim(fn:substringBefore(function, ())}Request"/>

<c:if test=&quot;${cpr}">var ${reqVarName} = null;</c:if>

function ${function} {
<c:if test=";${cpr}">if (${reqVarName}) closeRequest(${reqVarName});&lt;/c:if>

    var url = "${url}";
<c:if test="${method == GET}">
url += ?;
<dau:appendParams jsVarName="url" function="${function}"/>
</c:if>
<c:if test="${method == POST}">
var body = "";
<dau:appendParams jsVarName="body" function="${function}"/>
</c:if>

    var request = openRequest("${method}", url, ${!sync});
<c:if test="${cpr}">${reqVarName} = request;</c:if>
if (request == null) return null;

    function processResponse() {
if (request.readyState == 4) {
if (request.status == 200) {
<c:if test="${json}">;</c:if>
<jsp:doBody/>
} else {
httpError(request);
<c:if test="${method == POST}">url += ? + body;</c:if>
document.location = url;
}
}
}

    request.onreadystatechange = processResponse;
<c:if test="${method == GET}">sendRequest(request, null);</c:if>
<c:if test="${method == POST}">sendRequest(request, body);</c:if>
return request;
}
 

  內(nèi)部函數(shù)名為 processResponse(),是通過 onreadystatechange 屬性傳遞給 request 對象的一個回調(diào)函數(shù)。此回調(diào)函數(shù)在 Ajax 請求的整個生命周期進(jìn)行了多次調(diào)用,而請求的當(dāng)前狀態(tài)可從 readyState 屬性獲得。當(dāng) readyState 為 4 時,請求完成。

  如果 HTTP 狀態(tài)碼為 200,表示沒有發(fā)生錯誤,并且 Ajax 請求也可以由 <da:xhr> 和 </da:xhr> 之間的 JSP 代碼處理。此代碼由 <jsp:doBody/> 自 xhr.tag 文件調(diào)用。如果出現(xiàn) HTTP 錯誤,所生成的代碼會調(diào)用 ajax.js 文件的 httpError() 函數(shù),并且瀏覽器也會被重定向到生成 Ajax 響應(yīng)的 URL,因此開發(fā)人員就能夠看到導(dǎo)致 HTTP 錯誤的服務(wù)器端錯誤。例如,如果 HTTP 錯誤碼為 500(內(nèi)部錯誤),應(yīng)該可以看到一個 Java 堆棧跟蹤。

  清單 16 給出了此 appendParams.tag 文件,該文件在給定函數(shù)頭的參數(shù)上迭代并生成一個 JavaScript 代碼行,此代碼行調(diào)用 encode.js 文件的 appendParam() 函數(shù)。本文前面介紹的清單 7 和 8 中給出了所生成的代碼。


清單 16. appendParams.tag 文件

<%@ attribute name="jsVarName" required="true" rtexprvalue="true" %>
<%@ attribute name="function" required="true" rtexprvalue="true" %>

<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="//java.sun.com/jsp/jstl/functions" %>

<c:set var="paramList"
value=&quot;${fn:substringBefore(fn:substringAfter(function, (), ))}"/>

<c:forEach var="paramName" items="${paramList}">
<c:set var="paramName" value="${fn:trim(paramName)}"/>
${jsVarName} = appendParam(${jsVarName}, "${paramName}", ${paramName});
</c:forEach>
 

   developerWorks Ajax 資源中心

  請?jiān)L問 Ajax 資源中心,這是有關(guān)開發(fā) Ajax 應(yīng)用程序所需的免費(fèi)工具、代碼和信息的一站式中心。由 Ajax 專家 Herrington 主持的 活躍 Ajax 社區(qū)論壇 也許可以幫助您解答疑問。 

處理 Ajax 請求

  innerHTML.tag 文件(如清單 17 所示)中有一行 JavaScript 代碼,包含 DOM 對象,用來代表具有給定 id 的 HTML 元素,所使用的是 document.getElementById()。隨后,該元素的內(nèi)容會被更改,方式是設(shè)置 innerHTML 屬性,其新值可以通過 <da:innerHTML> 標(biāo)記的 value 屬性傳遞,也可以在標(biāo)記體內(nèi)傳遞。如果 encode 屬性為 true,所生成的代碼就會調(diào)用 encode.js 文件的 htmlEncode() 函數(shù)。


清單 17. innerHTML.tag 文件

<%@ attribute name="id" required="true" rtexprvalue="true" %>
<%@ attribute name="value" required="false" rtexprvalue="true" %>
<%@ attribute name="encode" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>

<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>

<c:if test="${empty value}">
<jsp:doBody var="value"/>
</c:if>
<c:if test="${encode}">
document.getElementById("${id}").innerHTML = htmlEncode(${value});
</c:if>
<c:if test="${!encode}">
document.getElementById("${id}").innerHTML = ${value};
</c:if>
 

  <da:innerHTML> 標(biāo)記可用在 <da:xhr> 之內(nèi)以處理 Ajax 響應(yīng),如本文的示例應(yīng)用程序所示。您可以構(gòu)建類似的標(biāo)記文件以根據(jù)應(yīng)用程序的具體需要執(zhí)行不同的處理操作。

  結(jié)束語

  在本文,您接觸了如何利用 JSP 標(biāo)記文件生成 Ajax 例程。您可以使用相同的技術(shù)生成服務(wù)器端其他類型的 JavaScript 函數(shù),這樣一來,您就能夠更容易地添加或更改特性,因?yàn)槊看涡薷牧顺洚?dāng)模板的標(biāo)記文件時,代碼都會自動重生成。


標(biāo)簽:

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn

文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載

為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產(chǎn)品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
午夜视频在线会员国产 | 日本三级网站在线观看 | 少妇人妻久久久久久97人妻 | 天美传媒果冻传媒国产日本 | 99久久精品免费看国产一区二区三 | 日本www一道久久久免费 | 日韩电影免费在线观看视频 | 99久久er热在这里只有精品16 | 亚洲欧美一区二区三区在线播放 | 欧美乱妇高清无乱码免费 | 丰满岳乱妇在线观看中字无码 | 无码国产精品一区二区免费式芒果 | 国产99精华液单品榜推荐及分析 | 韩国三级中 | 国产v亚洲v| a级毛片100部免费观看 | 精品欧美成人高清在线观看 | 亚洲字幕成人中文在线观看 | 91无码人妻精品一区二区 | 国产成人亚洲精品91专区高清 | 亚洲精品国品乱码久久久久 | 人与狗精品aa毛片 | 偷窥盗摄手机在 | 91中文字幕在线永久在线观看 | 99久久久久国产精品专区无码 | 日韩视频第一页二页 | 91大神大战高跟丝袜美女 | 在线不卡长片av | 精品亚洲成a人片在线观看 精品亚洲成a人在线观看青青 | 性行为视频无码 | 日本高清成本人视频一区 | 亚洲国产成人精品女久久久 | 精品无人区乱码一区二区三区手机 | 无码国模国产在线无码精品 | 国产精品综合av一区二区 | 亚洲无码久久av | 欧美一区二区亚洲 | 女子口述第一次被按摩师进入身体 | 亚洲av成人综合网久久 | 精品久久久久久久久中文字幕 | 久久99国产精品 | 国产在线视频在线观看 | 国产黄大片在线观看画质优化 | 97av| 亚洲精品自偷自拍无码忘忧 | 色视频免费网 | 亚洲国产精品99久久久久久 | 国产乱码在线精品可播放 | 日本动漫在中国大陆传播分析 | 91精选日韩综合永久入口 | 国产一区二av | 中文国产欧美在线观看 | 福利视频综合一区二区三区四区 | 成人自拍视频免费在线观看 | 成人拍拍拍免费视频网站 | www国产精品黄色 | 亚洲av永久无码精品视色密 | 欧美日韩高清一区二区三区 | 97超开公碰在线视频 | 午夜亚洲精品福利一区二区 | 中文字幕人妻少妇伦伦伦 | 国内精品伊人久久久久妇 | 国产av国产精品白丝jk制服 | 性欧美巨大乳 | 91精品国产高清久久久久久99 | 日韩精品制服丝袜一区 | 成人无码区免费aⅴ片在线观看 | 办公室爆乳女秘 | 亚洲欧美日韩精品久久 | 国产对白刺激 | 国产日韩一区二区三区 | 亚洲国产成人久久精品软件 | 精品91av福利在线观看 | 日本一二三不卡免费视频 | 人妻精品日韩一区二区三区 | 亚洲鲁起秋霞a | 欧美日韩国产精品va | 人人曰人人做人人 | 91福利视频免费 | 欧美日韩一区二区三区精品播放 | 97热久久免费频精品99 | 中文午夜乱理片无码aⅴ | 在线看不卡 | 91极品女神私人尤物在线播放 | 熟女丰满:丰盈之美 | 亚洲sss整片av在线播放 | 91短视频版高清在线观看免费 | 精品人妻视频一区二区三区 | 91亚洲精品无码久久久久 | 无遮挡很爽很污很黄的网站 | 人人妻人人澡人人爽人人精品电影 | 精品免费观看 | 亚洲综合色成在线播放 | 欧美亚洲性爱在线看 | 国精品无码一区二区三区在线 | 中文字幕在线不卡一区二区 | 亚洲国产专区 | 国产区精品高清在线观看 | 亚洲精品线在线观看 | 中文字幕无码乱码人妻系列 | 午夜在线亚洲男人午 | 午夜亚洲福利在线老司机 | 麻豆福利 | 91啪国自产在线高清观看 | 国产人妻人伦精品1国产丝袜 | 人妻福利三级视频 | 91久久精品在这里色伊人6884 | 亚洲成a人片77777国产 | 欧美福利影院 | 97国产婷婷视频 | 中日精品无码一本二本三本 | 国产精品乱码一区二区毛片 | 亚洲综合精品一区二区三区中文 | 国产成人av一区二区三区不卡 | 91精品一区二区三区在线观看 | 午夜福利理论片在线观看 | 黄色午夜精品视 | 欧美日韩在线精品一区二区三区 | 亚洲男人的天堂在线aⅴ视频 | 无码免费中文字幕视频 | 婷婷在线视频 | 97精品久久久久久久久久久 | 99久久久无码国产精品免费 | 久久爱评论库第12章第1页 | 美奶福利视频一区二区三区 | 免费无码午夜精品电影 | 日本一区四区不卡视频 | 日韩精品欧美高清区 | 欧美va亚洲va国产综合 | 91在线亚洲精品专 | 揄揄撸一区 | 91香蕉污 | 黄色片在线免费观看 | 国产精品亚洲一区二区三区在线 | 日本久久免费大片 | 午夜成人性视频在线观看 | 欧美一区二区三区日韩精品 | 91大神大战丝袜美女 | av喷水高潮喷水在线观看 | 国产午夜福利在线观看红一片 | 国产免费丝袜调教视频 | 亚洲午夜福利av一区二区无码 | 国产精品毛片一区二区三区 | 国产精品午夜一区二区 | 日韩系列精品自拍不卡视频 | 99这里只有精品在线 | av在线中文观看 | 丰满少妇被猛烈进入高清播放 | 欧美熟妇乱子hdsex粗 | 人妻无码αv中文字幕久久 人妻无码不卡在线看 | 国产精品综合久久第一页 | 日韩欧美中| 精品久久久久久亚洲综合网 | 不卡一区二区视频日本 | 在线精品亚洲第一区焦香 | av在观线观看男人的天堂 | 精品视频午夜 | 性欧美69| 毛茸茸性xxxx毛茸茸毛茸茸 | 国产剧情无码在线精品 | 精品综合久久久久久97 | 亚洲中文字幕第30页 | 亚洲av日韩精品久久久久久 | 日本精品成人一区二区三区视频 | 国产三级网站 | 国内免费 | 三级片视频在线观看 | 免费无遮挡又黄又爽网站 | 在线观看激情无码成人av | 婷婷欧美成人在线 | 欧美人与动物zozo | 香蕉久久夜色精品国产app | 97se狠狠狠狠狼亚洲综合网 | 国产亚洲欧洲 | 91免费无码国产在线观看 | 色色福利 | 国产丝袜无码一区二区三区视 | 国产日韩精品一区二区在线播放 | 亚洲欧美日韩国产精品 | 日韩欧美综合 | 91桃色午夜福利国产在线观看 | 丰满少妇人妻无码区 | a免费不卡观看 | 国产热re99久久6国产精品首 | 欧美久久天天高清精品 | 中文字幕无码av在线 | 97亚洲欧美日韩中字二区 | 无码人妻人妻经 | 精品一区二区三区四区 | 欧美日韩视 | 果冻传媒在线视频完整版电影在线 | 欧美精品黑人粗大 | 国产精品成人第一区二区三区 | 欧美熟妇av欧差aa片 | 无码av免费精品一区二区三区 | 97中文人妻免费观看 | 亚洲av无码一区二区三区网站 | 亚洲欧美日韩国产高清在线播放 | 国产一区二区三区不卡观 | 国产一区二区三区日韩精品 | 国产精品无码久 | 欧美色欲成人一 | 国产精品兄妹在线观看麻豆 | 国产办公室秘书 | 国产精品无遮挡永久视频 | 国产aⅴ激情无码久久久无码 | 欧美中文综合在线观看 | 精品人妻大屁股白浆无码下载 | 久久93精品国产91久久综合 | 香蕉免费在线一区二区三区 | 国产高清超清在线播放 | 欧美日韩精品在线视频 | 97无码人妻视频在线 | 国产精品自产拍在线观看 | 人人爽人人爽人人片av免费 | 国产高清不卡一区二区在线视频 | 香蕉久久夜色精品国产app | 亚洲一区二区三区一六视频在线 | 极品无码一区二区三区 | 互换精品一区二区 | 专区中文字幕视频专区 | 一区二区三区av波多野结衣 | 少妇真人直播免费视频 | 四虎精品国产永久在线观看 | 亚洲毛片无 | 亚洲日韩在线影院 | 伊人网综合 | 亚洲午夜理论片在线观看 | 中无码人妻丰满熟妇啪啪 | 国产极品精品免费视频久久 | 精品国产免费人成网站 | 亚洲欧美日韩综合一区在线观看 | 亚洲女v在线免费观看 | 国产精品亚洲精品日韩已方 | 国产一区二区三区樱花动漫 | 日本一本免费一区二区三区免 | 亚洲高潮痉挛中文 | 国产自在现偷国产精品国产日韩 | 欧美一区精品视频一区二区 | 91精品手机国产在线播放 | 国产男女猛烈无遮挡免费视频网站 | 91麻豆精品激情在 | 国产va在线观看免费 | 在线观看黄色小视频 | 国产原创中文av | 91啪国自产在线高清观看 | av成人无码国产 | 尤物精品无码视频专区 | 中文字幕久久精品乱码乱码 | 99久久精品国产免费看 | 国产精品自拍视频网站 | 精品国产一区二区三区不卡在线 | 亚洲日本1区2区3区二区 | 国产性夜夜春夜夜爽18 | 亚洲日韩精品看片无码 | 白丝爆浆18禁一区 | 亚洲无码高潮喷吹在线 | 波多野结衣人妻无码潮喷av | 国产精品成人一区二区三区电影 | 岛国大片在线观看 | 国内精品九九久久久精品 | 国产传媒在线观看 | 亚洲精品熟女国产 | 日韩av蜜桃永久无码精品 | 婷婷色中文在线观看 | 欧美生活大片在线观看 | 国产成人av大片大片在线播放 | 亚洲视频一区二区在线观看 | 欧美日韩 | 日韩毛片在 | 国产h版大片在线 | 91精品全国免费观看 | 亚洲精品无码久久久久av麻豆 | 国产aⅴ无码久久丝袜美腿 国产aⅴ无码专 | 国产91av在线播放 | 97se狠狠狠狠狼亚洲综合网 | 国产v片在线播放免费观 | 亚洲欧美日韩综合久久 | 自拍偷自拍亚洲精品被多人伦好爽 | 日产国产亚洲系列 | 午夜a级理论电影 | 无码专区在线观看韩国 | 欧美一区二区久久精品 | 国产男女猛烈无遮挡a片 | 国产不卡在线观看 | 亚洲国产午夜精品理论片 | 99久久 | 极品国产尤 | 亚洲精品aa片在线观看 | 在线观看一区二区精品视频 | 亚洲国产精品热久久 | 精品久久久久无码专区 | 99亚洲乱人伦aⅴ精品 | 国产强天天躁夜 | 亚洲日韩欧洲无码v夜夜摸 亚洲日韩手机在线专区 | 国产精品一区二区不卡小说 | 午夜爽爽爽男女免费观看影院 | 日韩人妻无码一区二区三区久久99 | 欧美一区二区三区激情啪啪 | 97理论片电影在线观看 | 久久超碰精品一 | 国产激情无码一 | 国产精品白嫩在线观看 | 99r在线精品视频在线播放 | 麻豆成人久久精品二区三区免费 | 黄色免费网址在线观看 | 午夜福利精品无码福利 | 天天拍夜夜添久久精品 | 精品久久久无码中字 | 国产v亚洲v天堂无码久久久91 | 97人妻人人做人碰人人爽免费下载 | 丰满人妻熟妇乱又伦精品软件 | 国产国产午夜精华免费 | 欧美a级片免费观看 | 日韩av一级精品 | 国产aⅴ精品福利一区二区三区 | 内射一区二区精品视频在线观 | 麻豆成人91精品二区三区 | 91桃色短视频app | 中文国产成人精品久久不卡 | 亚洲www永久成人网站 | 97制片厂爱豆传媒视频高清 | 97国产成人精品免费视频 | 日韩精品免费无码一区二区 | 久久97精品久久久久久久不卡 | 黄片视频一 | 国产精品无码av无码 | 国产在线自在拍91 | 欧美成人午夜免费福利785 | 国精产品999国精产品官网 | 麻豆国产女教师一区二区三区 | 色欲天天久久久久 | 国产v亚洲v天堂无码卡通 | 亚洲国产精品看片在线观看 | 91久久无码99精品高潮久 | 99九九成人免费视频精品 | 丰满的瑜伽老师bd三级免费全集 | 丝袜国产高跟在线一区 | 国产精品综合久久新视频 | 妖精色av无码国产在线看 | 99久久综合狠狠综 | 无码国模大尺度视频在线观看 | 中文字幕日产乱码一区 | 午夜福利合集 | 国产不卡在线观看视频 | 日韩人妻不卡一区二区三区 | 91一区二区三区四区五区 | 91福利第一导航 | 卡通动漫精品综 | 国产一本一道久久香蕉 | 国产无线乱码一区二三区 | 91久久偷偷做嫩草影院免费看 | 亚洲av永久无码精品秋霞电影影 | 国产欧美va天 | 欧美成人免费观看 | 午夜精品久久久久久99热蜜桃 | 97精品伊人久久久大 | 精品国产一区二区三区四不卡在线 | 不卡中文av在线 | 99在线精品国自产拍中文字幕 | 91香蕉成人污污污 | 亚洲精品高清国产麻豆专区 | 久久www精品成人 | 亚洲熟妇无码一区二区三区导航 | 97人人添人澡人人爽超碰 | 波多野结衣中文字幕一区二区 | 国产欧美日韩va另类 | 日韩精品无码综合一区二区 | 日韩欧美自| 国产男女综 | 日本永久精品视频在线观看 | 在线天堂新版资源www在线 | 无码精品人妻一区二区三区爱剪 | 午夜精品一区二区三区av | 亚洲国产一区二区在线 | 尤物精品无码视频专区 | 国人国产免费观看av在线 | 日本人hdxxxx | 国产成人av无码片在线观看 | 日韩成人毛片高清视频免费看 | 精品国产一区av天美传媒 | 国产91色综合久久麻豆 | 欧美日韩 | 国产在线观看黄av免费 | 99热这里只有精品 | 91高清国产经典在线观看 | 国产丝袜不卡一区二区 | 国产欧美亚洲精品下载第二区 | 人人曰人人做 | 97甜桃品种介绍 | 午夜理论片在线观看免费 | 亚洲va欧美va | 中文字幕在线免费观看 | 国产亚洲3p无码一区 | 国产成人无卡在线观看 | 综合欧美一区二区三区 | 黄页成人免费网站 | 激情内射亚州一区二区三区爱妻 | 无码av久久久久久久久 | 午夜福利在线视频性色 | 特级丰满少妇一级aaaa爱毛片 | 在线播放真实国产乱子伦 | 人人看人人摸欧美 | 国产白丝jk捆绑束缚调教视频 | 国产探花在线观看 | 国产高清无码一区二区 | 亚洲日韩aa特黄毛片试看 | 麻豆国产av巨作国产剧情 | 无码乱码av天堂一区二区 | 精品国产在天天在线 | 97精品国产高清自在线 | 国产人妻久久精品二 | 国产av中文字幕乱码高清 | 日韩精品视频在线第一区 | 亚洲av无码免费成人av | 97se亚洲国产综合自在线尤物 | 日韩亚洲经典视频 | 91精品一区国产高清在线 | 97密桃75hd中字在线观看 | 精品尹人在线观看 | 日本一区午夜爱爱 | 色婷婷六月亚洲6月中文字幕 | 天天看片亚洲欧美国产 | 无码精品人妻一区二区 | 国产一区二区三区在线观看视频 | 丝兔女郎m开腿sm调教室 | 在线亚洲精品福利网址导航 | 久久福利青草精品资源 | 国产成人无码精品不卡 | 国产高清无码一区二区 | 国产免费不卡av在线播放 | 国产精品亚洲欧美大片在线观看 | 91欧美激情一区二区三区 | 国产精品网红尤物福利在线观看 | 精品熟女少妇av免费久久 | 97视频app下载 | 亚洲av网站 | 三级黄色爱情片 | 欧美精品日韩 | 婷婷在线视频 | 国产精品一区二区av片福利 | 国产精品黄在线观看免费网站 | 国精品午夜福利视频不卡麻豆 | 91麻豆精品国产综合久久久 | 无遮挡又黄又刺激又爽的视频 | 九九自拍视频 | 9ⅰ精品人妻一区二区三区蜜桃 | 亚洲成av人片一区 | 亚洲欧美日韩、中文字幕不卡 | 国产一级高清免费观看 | 国产黄色大片 | 日韩精品电影亚洲一区 | 国产剧情三级片在线观看 | 中文字幕 | 人人揉人人爽五月天视频 | 色一情一乱一乱一区91av | 91久久香蕉国产熟女线看 | 亚洲免费人成视频在线观看 | 在线观看中出内射人和动物 | 国产区视频在线观看 | 麻豆精品秘国产传媒mv | 国产午夜无码片在线观看影院 | 欧美多人顶级午夜寂寞影院 | 成人美女黄网站色大免费的 | 午夜福利视频 | 无码av免费一区二区三区 | 成年女人黄网站18禁 | 久草视频 | 日韩人妻系列无码专 | 亚洲欧美日本综合一区二区 | 91九色熟女 | 一区二区视频在线观看 | 国产内地激情精品毛片在线一 | 国产午夜福利免费看片 | 国产一级一级毛片真人视频 | 亚洲一区二区三区不卡在线播放 | 中文字幕久久久久久精品 | 91精选国产 | 91久久久久久 | 日韩超清无码 | 香蕉久久精品 | 国产乱妇无乱码大黄aa片 | 少妇与子乱毛片 | 在线观看黄网视频免费播放 | 日韩av在线中文字幕高清 | 国产女人乱 | 无码激情做a爰片毛片av片 | 婷婷久久亚洲综合国产 | 成人涩涩小片视频日本 | 亚洲国产一成久久精品国产成人综合 | 99爱在线精品视频免费观看9 | 91久久精品无码一区二区 | 国产一区福利 | 欧美一区二区三区在线观看 | 亚洲成a人片在线观看无码专区 | 开裆裤羞辱调教高h绳子 | 精品动漫一区二区三区 | 成人国产aⅴ一级毛片无码 成人国产第一区在线观看 成人国产经典 | 91老司机深夜福利精品视频在线 | 国产旗袍丝袜在线观看 | 日韩国产欧美亚洲一区不 | 91在线精品视频 | 丰满大屁股美女一级毛片 | 黄瓜视频在线观看 | 91精品成人国产app下载 | 欧美成人午夜免费福利785 | 精品欧美一区二区在线观看欧美熟 | 国精产品一区二区三区四区糖 | 无码国产69精品久久 | 91av.com| 人人妻人 | 国产麻豆一区二区三区精品视频 | 国内精品91少妇在线播放 | 99精品国产九九国产精品 | 精品二区中文字幕播放 | 国产午夜福利精品集在线观看 | 国产三级电影在线观看 | 91蜜桃传媒精品久久久一区 | 亚洲av成本人无 | 香蕉视频草莓视频 | 亚洲成av | 日韩十八禁在线1区2区3区不卡 | 午夜免费免费啪视频观看 | 国内精品少妇久久精品 | 国产欧美日韩亚洲一区二区三区 | 亚洲精品亚洲人成在线观看麻豆 | 日韩av一区二区在线电影 | 人人妻人人澡人人爽人人精品97 | 精品午夜福利在线视在亚洲 | 无码特级毛片免费看 | 国产午夜福利精品一区二区三区 | 国产高清黄网站全免费 | 国产成人久久久无码精品 | 在线观看免费午夜大片 | 欧美性xxxxx极 | 国产99视 | 精品久久久久久综合另类小说 | 国产高清不卡在线观看 | 欧美日韩在线视频一区 | 国产午夜福利精品一区二区三区 | 成人精品视频99 | 91精品全国免费观看 | 国产v一区| 人人爽人人爽人人片a免费 人人爽人人爽人人爽 | 国产在线91精品入口首页 | 中文字幕第1页精品一区 | 99在线热视频只有精品免费电影 | 亚洲国产成人精品女 | 亚洲成av人在| 国产成人av一区二区三区中文精品 | 国产一卡二卡三卡四高清 | 国产人成视频免费看 | 午夜日韩欧美在线观看 | 亚洲av成人影片在线观看 | 日韩v午夜视频在线观看 | 国产精品亚洲а∨无码播放麻豆 | 色视频在线观看免费视频 | 91精品久久久久久久久入口 | 国产亚洲免费在线观看 | 日本在线观看精品 | 69精品丰满人妻无码视频a片 | 精品一区二区三区四区五区六己 | 国产不卡一区二区三区視频。 | 国产精品亚洲一 | 国产在线观看无遮挡 | 三级三级三级a级全黄三电影 | 日日干夜夜骑 | 无码av免费精品一区二区三区 | 国产一区二区在线观看app | 亚洲av无码一区二区三区dv | 亚洲一区二区三区不卡在线播放 | 亚洲aⅴ无码专区在线观看 亚洲aⅴ一区二区三区四区 | 日本激情女教师一区 | 国产永久观看在线 | 四虎永久在线精品国产馆v视 | 日韩夜夜高潮夜夜爽无码 | 成人a免费大片在线看 | 亚洲老熟女av一区二区在线播放 | 国产欧美一区二区久久 | 日韩人妻精品一区二区三区视频 | 99热视热频这里只有精 | 91极品蜜桃臀在线播放 | 中文字幕亚洲情99在线 | 亚洲韩国欧美一区二区三区 | 午夜三级a三级三点窝 | 亚洲精品中文字幕无码久久久久久 | 亚洲av无码专区亚洲av桃花岛 | 国产真人无码作爱免费视频 | 91午夜精品久久久久精品 | 国产91在线精品国自产拍 | 韩国精品一区二区三区在线观看 | 91精产品一永久下载安装免费 | 国产午夜激情视频自拍 | 国产精品综合久久第一页 | 亚洲一区二区+在线播放 | 97人人爽人人爽人人一区二区 | 国产欧美久久久精品影院 | 午夜三级毛片欧美国 | 日本免費黃色視頻 | 国产对白普 | 国产白丝喷水娇喘视 | 欧美伦理一区二区 | av天堂电影网 | 午夜视频久久久久一区 | 国产精品91av在线观看 | 97超频在线看视频公开 | 深夜二个少妇精油按摩到高潮 | 91久久精品国产91久久性色t | 91国内揄拍国内精品对白 | www.国产欧美| 少妇免费三级在线观看 | 99久久久免费 | 国产精品91天 | 91尤物免费在线观看精品 | 亚洲国产精品亚洲欧美 | 欧美激情一区二区久久久 | 日韩精品一区二区三区四区免费 | 日韩插啊免费视频 | 波多野结衣电影在线完整版在线播放 | 日日操操干干 | 一区二区三区久久久av | 中文字幕高清在线中文字幕 | 欧美一区二区三区精品不卡 | 国产精品视频平台推出全新 | 精品国产免费人成网站 | 国产97在线观看 | 午夜a级理论电影在线播放 午夜a级理论片在线 | 99热国产亚洲精品 | 人妻熟妇久久久久久xxx | 国产高潮抽出娇喘喷水视频在线 | 欧美日韩亚洲动漫在线 | 亚洲精品第一页 | 欧美在线一级精品 | 久久成人国产精品免费软件 | 国产成人精品麻豆视频 | 欧美成人免费观看 | 亚洲国产欧美一区二区三区 | 日韩经典欧美一区二区三区 | 成人a毛片免费全部播放 | 国产成人精品无码播放 | 91在线码无精品秘入口是什么 | 99精品 | 天天操人人操 | 在线亚洲午夜理论av大片 | 日本在线看片免费人成视频100 | 国产午夜精品久久久久九九电影 | 九九精品亚洲一 | 内射后入在 | 亚洲国产成人99精品激情在线 | 亚洲av无码一区二区三区在线高 | 国产精品无遮挡永久视频 | 日本高清视频在线www色 | 91无人区卡一卡二卡三乱码下载 | 国产精品欧美久久久久三级 | 国产尤物在线观看视频 | 亚洲av无码片在线观看 | 亚洲另类无码春色首页 | 日日橹狠狠爱欧美超碰 | 暴虐sm灌浣| 九九精品成人免费国产片 | 亚洲精品大 | 国产成人a在线观看视频 | 暴力变态强奷在线系列 | 国内精品国语自产拍在线观看91 | 中文国产欧美在线观看 | 91天堂素人精品系列全集亚洲 | 国产一级a爱做片免费看 | 成人香蕉| 色窝网站在线播放 | 精品国产福利片在线观看 | 97久久超碰极品视觉盛宴 | 在线观看av | 欧美一区二区三区无码大象视频 | 成人免费无 | av国内精品久久久久影院 | 亚洲欧美久久美女香蕉视频 | 在线人成免费视频69国产 | 91免费版看片 | 精品91专区视频在线 | a级毛片人 | 亚洲av最新在线网址 | 无码久久久久冒白浆 | 变态另类清 | 91新地址永久入口安全检测 | 国内亚洲综合自拍110页 | 成人精品动漫一区二区三区 | 91网址 | 99精品国产在热久久无毒不卡 | 国内9l视频自拍 | 亚洲成a无码在线观看 | 精品免费久久久国产一区 | 亚洲av纯肉无码精品网站 | 综合色区亚洲熟妇另类 | 亚洲av日韩aⅴ永久无码 | 欧美日韩精品在线视频 | 亚洲日韩欧美精品 | 少妇高潮毛片色欲ava片 | 国产女人高潮视频在线观看 | 麻豆av免费网站在线观看 | 中文字幕在线中文字幕一区 | 中文字幕无码av在线 | 国产精品成熟 | 国产公开免费人成视频 | 中文字幕在线精品乱码高 | 国产伦子沙发午休系列资源曝 | 羞羞影院午夜男女爽爽 | 中文字幕日韩欧美一区二区 | 亚洲av无码一区二区三区在线 | 99麻豆久久久国产精品免费 | 国产精品综合网 | 99久久无码免费国产 | 亚洲精品久久久久久一区二区 | 亚洲精品午夜久久aaa级久久久 | 国产伦精品一区 | 国产精品一区久久久久久 | 国产乱人偷精品视频不卡 | 成人精品国产 | 精品国产一级在 | 欧美高清精品一区二区 | 日本一区二区三区免费播放视频站 | 91精品国产91热久久久福 | 精品人妻av无码系列 | 国产精品十一区 | 国产传媒一二三区av | 午夜精品福利视频 | 国产成人麻豆精品午夜福利在 | 加勒比在线东京热在线中文字幕 | 国产精品一区二区久久精品 | 午夜大胆裸体a级人体片 | 国产精品99久久99久久久动漫 | 99爱国产精品免费精品在线 | 国精产品一区二区三区四区糖 | 欧美一区二区三区无码大象视频 | 97精品国产一区 | 午夜福利视频合集1000 | 亚洲视频东京热无码二区 | 无码精品人妻一区二区三区影院 | 日本精品成人一区二区三区视频 | 午夜视频在线观看免费完 | 精品国产亚洲一区二区三区在线 | 天天影视人人综合日韩欧美mv | 亚洲av成人精品一区二区三区 | 国产亚洲人成网站在线观看 | 欧美日韩亚洲人人夜夜澡 | 91大神精品视频动漫在线观看 | 香蕉视频官网 | 亚洲av无码影院达达兔 | 日本成a人片在线播放 | 日韩精品一区二区三区免费在线 | av天堂午夜精品一区 | 国产成人精品三级麻豆 | 无码日韩精品一区二区免费 | 无码中文字幕a | 亚洲av极品视觉盛宴分类 | 久久97精品 | 91香蕉视频在线 | 韩国三级在线播久 | 日本在线观看视频一区二区 | 久9视频这里只有精品手机版观看 | 国产一区二区三区水蜜桃 | 性生交大片免费看 | 国产免费久久精品99re丫 | 韩国三级在线播久 | 亚洲国产日韩精品在线观看色欲视 | 四虎成人网址 | 韩国激情一区二区无码在线 | 99久久婷婷国产青草精品 | 中文字幕无码免费久久99 | 国产成人无码免费视频97 | 在线观看91精品国产 | 亚洲国产成人久久综合野外 | 成年人高级| 欧美日韩午夜精 | 国产电视剧排行榜推荐 | 午夜理理伦a级毛片天天看 午夜理理伦电影a片无码 | 国产精品jizz视频 | 97碰碰碰人妻无码免费看 | 自拍偷自拍亚洲精品情侣 | 无码人妻aⅴ一区二区三区 无码人妻aⅴ一区二区三区日本 | 偷拍视频无码在线播放 | 麻豆成人91精品二区三区 | 国产欧美日本精品视频 | 日韩+欧美+亚洲 | 国产a久久| 日本www一道久久久免费 | 一级特黄aaa大片 | 在线欧美中文亚洲精品 | 人妻无码aⅴ不卡 | 日本啪视频在线观看精品综合 | 欧美视频三区 | 国产男女猛烈无遮挡免费视频网站 | 成人拍拍拍免费视频网站 | 午夜成人理论无码电影在线播 | 国产99欧美精品久久精品 | 国产精品精品综合在线网 | 精品一二区 | 日韩精品高清一区二区三区 | 久久高清精品一区二区三区 | 日韩激情五码视频中文字幕 |