多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > htmlcss > [JavaScript] 7.JS JSON

[JavaScript] 7.JS JSON

來源:程序員人生   發布時間:2016-06-04 16:15:03 閱讀次數:4634次

是甚么?

JSON 的全稱是 JavaScript Object Notation,是1種輕量級的數據交換格式。JSO N 與 XML 具有相同的特性,例如易于人編寫和瀏覽,易于機器生成和解析。但是 JSON 比 XML 數據傳輸的有效性要高出很多。JSON 完全獨立與編程語言,使用文本格式保存。

JSON 數據有兩種結構:

Name-Value 對構成的集合,類似于 Java 中的 Map。

Value 的有序列表,類似于 Java 中的 Array。

1個 JSON 格式的數據示例: 

{ "Name": "Apple", "Expiry": "2007/10/11 13:54", "Price": 3.99, "Sizes": [ "Small", "Medium", "Large" ] }

更多關于 JSON 數據格式的說明參看 JSON 官方網站:http://www.json.org(中文 內容看:http://www.json.org/json-zh.html)

GWT 與 JSON

GWT 中支持的客戶端服務器端方法調用和數據傳遞的標準格式是 RPC。 JSON 其實不 是 GWT 支持的標準的數據傳遞格式。那末如何使用 JSON 來作為 GWT 的數據傳遞格式 呢?需要以下幾步。 

第1,援用 HTTP 和 JSON 支持。 第2,在客戶端創建 JSON 數據,提交到服務器

第3,在服務器上重寫數據格式解析的代碼,使之支持 JSON 格式的數據 第4,在服務器上組織 JSON 格式的數據,返回給客戶端。 第5,客戶端解析服務器傳回的 JSON 數據,正確的顯示

援用 HTTP 和 JSON 支持

找到.gwt.xml文件,在其中的

<inherits name='com.google.gwt.user.User'/>

在以后添加以下的內容:

<inherits name="com.google.gwt.json.JSON"/> <inherits name="com.google.gwt.http.HTTP"/>

其中 com.google.gwt.json.JSON 指的是要使用 JSON,com.google.gwt.http.H TTP 值得是通過 HTTP 調用服務器上的服務方法。

客戶端構造 JSON 數據

客戶端需要使用 com.google.gwt.json.client 包內的類來組裝 JSON 格式的數據, 數據格式以下:

數據類型                                    說明

JSONArray                   JSONValue 構成的數組類型


JSONBoolean              JSON boolean的值


JSONException           訪問 JSON 結構的數據出錯的情況下可以拋出此異常


JSONNull                     JSON Null根式的數據

 

JSONNumber              JSON Number 類型的數據

 

JSONObject                 JSON Object 類型的數據

 

JSONParser                將 String 格式的 JSON 數據解析為 JSONValue 類 型的數據


JSONString                 JSON String 類型的數據

 

JSONValue                 所有 JSON 類型值的超級類型

組合1個簡單的 JSON 數據:

JSONObject input = new JSONObject(); JSONString value = new JSONString("mazhao"); input.put("name", value);

JSON 數據格式為:{name: "mazhao"}

組合1個包括數組類型的復雜 JSON 數據:

JSONObject input = new JSONObject(); JSONString value = new JSONString("mazhao"); input.put("name", value); JSONArray arrayValue = new JSONArray(); arrayValue.set(0, new JSONString("array item 0")); arrayValue.set(1, 
new JSONString("array item 1")); arrayValue.set(2, new JSONString("array item 2")); input.put("array", arrayValue);

JSON 數據格式為:

{name: "mazhao", array: {"array item 0", "array item 1", "array item 2"}}

注意上述的 JSON 類型的數據,使用的都是 com.google.gwt.json.client 包內的類 型。這些類型終究會被編譯為JavaScrip t 履行。

服務端重寫數據解析代碼,支持 JSON 格式的數據

服務器上,需要使用 JSON Java 支持類才能將 JSON 格式的數據轉換為各種類型 的數據,固然也能夠自己寫1些解析用的代碼。這里我們使用了 www.json.org上的代碼 來完成。這組代碼與 com.google.gwt.json.client 的代碼很類似,只是在 org.json 包內部。

怎樣解析 JSON 術訣呢?針對上述中的復雜的 JSON 數據:

{name: "mazhao", array: {"array item 0", "array item 1", "array item 2"}}

可使用以下的方式解析:

JSONObject jsonObject = new JSONObject(payload); String name = jsonObject.getString("name"); System.out.println("name is:" + name); JSONArray jsonArray = jsonObject.getJSONArray("array"); for(int i = 0; i < jsonArray.length(); i++) { System.out.println("item " + i + ":" + jsonArray.getString(i)); }

其中 payload 指的是上述的JSON 格式的數據。

那末如何寫 GWT 的 Service 來得到 Payload 的數據呢?需要兩點,第1,需要建立 1個Service 類,第2,覆蓋父類的 processCall 方法。

示例代碼:

package com.jpleasure.gwt.json.server; import com.google.gwt.user.client.rpc.SerializationException; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.jpleasure.gwt.json.client.HelloWorldService; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject /** * Created by IntelliJ IDEA. * User: vaio * Date: 2007⑼⑷ * Time: 22:08:31 * To change this template use File | Settings| File Templates. */ public class HelloWorldServiceImp l extends RemoteServiceServlet implements HelloWorldService { public String processCall(String payload) throws Serializat ionException { try { JSONObject jsonObject = new JSONObject(payload); String name = jsonObject.getString("name"); System.out.println("name is:" + name); JSONArray jsonArray = jsonObject.getJSONArray("array"); for(int i = 0; i < jsonArray.length(); i++) { System.out.println("item " + i + " :" + jsonArray.getString(i)); } } catch (JSONException e) { e.printStackTrace(); //To change bodyof catch statement use File | Settings |File Templates. } return "success"; } }

服務器上組織 JSON 格式的數據,返回給客戶端

同上

客戶端解析服務器傳回的 JSON 數據,正確的顯示 同上

包需求

Struts2返回json需要jsonplugin-0[1].25的包

Java 代碼

然后我們的配置文件中需要繼承 json-default

1. <?xml version="1.0" encoding="UTF⑻" ?> 2. <!DOCTYPE struts PUBLIC 3. "-//Apache Software Foundation//DTD Struts Configuration 2.0// EN" 4. "http://struts.apache.org/dtds/struts⑵.0.dtd"> 5. 6.<struts> 7. 8. <package name="com.act ion.testJson" extends="json-default" nam espace="/" > 9. <action name="jsonUser" class="com.act ion.testJson.JsonAction " method="testUser"> 10. <result type="json"/> 11. </action> 12. <!-- Add actions here --> 13. </package> 14.</struts> <?xml version="1.0" encoding="UTF⑻" ?> <!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts⑵.0.dtd"> <struts> <package name="co m.act ion.testJson" extends="json-default" namespace="/" > <action name="jsonUser" class="com.act ion.testJson.JsonAction" method="testUser"> <result type="json"/> </action> <!-- Add actions here --> </package> </struts>

然后我們的 Action 中需要返回的 json 信息需要加上注解

Java 代碼

1. //pizza 2. package com.action.testJson; 3. 4. import java.util.ArrayList; 5. import java.util.List; 6. 7. import com.googlecode.jsonplugin.annotations.JSON; 8. import com.opensymphony.xwork2.ActionSupport; 9. 10.public class JsonAction extendsActionSupport { 11. 12. private static final long serialVersionUID = - 4082165361641669835L; 13. 14. Users user=new Users(); 15. List userList=new ArrayList(); 16. 17. 18. public String testUser(){ 19. System.out.println("in the json Acton"); 20. userInit(); 21. userList.add(user); 22. return SUCCESS; 23. } 24. 25. public void userInit(){ 26. user.setAge(1); 27. user.setName(" 張峰"); 28. user.setPassword("nofengPassword"); 29. } 30. 31. @JSON(name="userString") 32. public Users getUser() { 33. return user; 34. } 35. 36. @JSON(name="userList") 37. public ListgetUserList() { 38. return userList; 39. } 40. 41. public void setUser(Users user) { 42. this.user = user; 43. } 44. 45. public void setUserList(List userList) { 46. this.userList = userList; 47. } 48. 49. 50.}

JSON Plugin的說明

 

Name

 JSON Plugin

 

Publisher

 

MusachyBarroso

 

License

 

Open Source (ASL2)

 

Version

 0.30

 

Compatibility

 

Struts 2.0.6 or later

 

Homepage

 

http:/  /code.google.com/p/jsonplugin/

 

Download

 

http:/   /code.google.com/p/jsonplugin/downloads/list


 

Name

 

JSON Plugin

 

Publisher

 

MusachyBarroso

 

License

 

Open Source (ASL2)

 

Version

 0.30

 

Compatibility

 

Struts 2.0.6 or later

 

Homepage

 

http:/  /code.google.com/p/jsonplugin/

 

Download

 

http:/   /code.google.com/p/jsonplugin/downloads/list

 


Overview 

The JSON plugin provides a "json"result type that serializes actions into JSON. The serializa tion process is recursive, meaning that the whole object graph, starting on the action class (base class not included) will be serialized (root object can be customized using the "root" attribute). If the interceptor is used, the action will be populated from the JSON content in the request, these are the rules of the interceptor: 

1. The "content-type" must be "application/json"

2. The JSON content must be well formed, see json.org  for grammar.

3. Action must have a public "setter" method for fields that must be populated.

4. Supported types for population are: Primitives (int,long...String), Date, List,Map, Primitive Arrays, Other class (more on this later), and Array of Other class.

5. Any object in JSON, that is to be populated inside a list, or a map, will be of type Map

(mapping from properties to values), any whole number will be of type Long, any decimal number will be of type Double, and any array of typeList.

Given this JSON string:

{ "doubleValue": 10.10, "nestedBean": { "name": "Mr Bean" }, "list": ["A", 10, 20.20, { "firstName": "El Zorro" }], "array": [10, 20] }

The action must have a "setDoubleValue" method, taking either a "float" or a "double" argument (the interceptor will convert the value to the right one). There must be a "setNestedBean" whose argument type can be any class, that has a "setName" method taking as argument an "String". There must be a "setList" method thattakes a "List" as argument, that list will contain: "A" (String), 10 (Long), 20.20 (Double), Map ("firstName" -> "ElZorro"). The "setArray" method can take as parameter either a "List", or any numeric array.

Installation

This plugin can be installed by copying the plugin jar into your application's /WEB-INF/lib

directory. No other files need to be copied or created.

To use maven, add this to your pom:

<dependencies> ... <dependency> <groupId>com.googlecode</groupId> <artifactId>jsonplugin</artifactId> <version>0.26</version> </dependency> ... </dependencies> <repository> <id>Maven Plugin Repository</id> <url>http://struts2plugin-maven- repo.googlecode.com/svn/trunk/</url> <snapshots><enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository>

Customizing Serialization and Deserialization 

Use the JSON annotation to customize the serializa tion/deseriali za tion process. Available JSON annotation fields:

 

Name

 

Description

 

Default Value

 

Serialization

 

Deserialization

 

name

 

Customize field name

 

empty

 

yes

 

no

 

 

serialize

 

Include in serializa tion

 

 

true

 

 

yes

 

 

no

 

 

deserialize

 

Include in deserializa tion

 

 

true

 

 

no

 

 

yes


 

format

 

Format used to format/parse a Date field

 

 

 

"yyyy-MM-dd'T'HH:mm:ss"

 

 

 

yes

 

 

 

yes

Excluding properties

A comma-delimited list of regular expressions can be passed to the JSON Result and Interceptor, properties matching any of these regular expressions will be ignored on the serializa tion process:

<!-- Resultfragment --> <result type="json"> <paramname="excludeProperties"> login.password,studentList.*\.sin </param> </result> <!-- Interceptor fragment --> <interceptor-ref name="json"> <param name="enableSMD">true</param> <paramname="excludeProperties"> login.password,studentList.*\.sin </param> </interceptor-ref>

Including properties

A comma-delimited list of regular expressions can be passed to the JSON Result to restrict which properties will be serialized. ONLY properties matchingany of these regular expressions will be included in the serialized output.

Note 

Exclude property expressions take precedence over includeproperty expressions. That is, if you use include and excludeproperty expressions on the same result, include property expressions will not be applied if an exclude excludeproperty expression matches a propertyfirst.

<!-- Result fragment --> <result type="json"> <paramname="includeProperties"> ^entries\[\d+\]\.clientNumber, ^entries\[\d+\]\.scheduleNumber, ^entries\[\d+\]\.createUserId </param> </result>

Root Object

Use the "root" attribute(OGNL expression) to specify the root object to be serialized.

<resulttype="json"> <param name="root"> person.job </param> </result>

The "root" attribute(OGNL expression) can also be used on the interceptor to specifytheobject that must be populated,make sure thisobject is not null.

<interceptor-refname="json"> <paramname="root">bean1.bean2</param> </interceptor-ref>

Wrap with Comments

wrapWithComments can  turn safe  JSON text  into dangerous  text.  For example, 

["*/ alert('XSS'); /*"] 

Thanks to Douglas Crockford for the tip!

If the "wrapWithC omments" (false by default) attribute is set to true, the generated JSON is wrapped with comments like:

/* { "doubleVal": 10.10, "nestedBean": { "name": "Mr Bean" }, "list": ["A", 10, 20.20, { "firstName": "El Zorro" }], "array": [10, 20] } */

This can be used to avoid potential Javascript Hijacks.To strip those comments use:

varresponseObject = eval("("+data.substring(data.indexOf("\/\*")+2,data.lastIndexOf("\*\/"))+")");

Base Classes

By default properties defined on base classes of the "root" object won't be serialized, to serialize properties in all base classes (up to Object) set "ignoreHierarchy" to false in the JSON result:

<resulttype="json"> <param name="ignoreHierarchy">false</param> </result>

Enumerations

By default, an Enum is serialized as a name=value pair where value = name().

publicenum AnEnum { ValueA, ValueB } JSON: "myEnum":"ValueA"

Use the "enumAsBean" result parameter to serialize Enum's as a bean with a special property

_name with value name(). All properties of the enum are also serialized 

publicenum AnEnum { ValueA("A"), ValueB("B"); private String val; public AnEnum(val) { this.val = val; } public getVal() { return val; } }

JSON: myEnum:{ "_name":"ValueA", "val": "A" }

Enable this parameter through struts.xml:

<resulttype="json"> <param name="enumAsBean">true</param> </result>

Compressing the output

Set the enableGZIP attribute to true to gzip the generated json response. The request must

include "gzip "in the "Accept-Encoding" header for this to work.

<resulttype="json"> <param name="enableGZIP" >true</param> </result>

Example

Setup Action

This simple action has some fields:

Example:

import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.Action; public class JSONExample { private String field1 = "str"; private int[] ints = {10,20}; private Map map = new HashMap(); private String customName = "custom"; //'transient' fields are not serialized privatetransient Stringfield2; //fields without getter method are notserialized privateString field3; publicStringexecute(){ map.put("John", "Galt"); return Action.SUCCESS; } public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public int[] getInts() { return ints; } public void setInts(int[] ints) { this.ints = ints; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } @JSON(name="newName") public String getCustomName() { return this.customName; } }

Write the mapping for the action 

1. Add the map inside a package that extends "json-default"

2. Add a result of type "json" 

Example:

<?xmlversion="1.0" encoding="UTF⑻"?> <!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts⑵.0.dtd"> <struts> <package name="example" extends="json-default"> <actionname="JSONExample"class="example.JSONExample"> <resulttype="json"/> </action> </package> </struts>

JSON example output

{ "field1" : "str", "ints": [10, 20], "map": { "John":"Galt" }, "newName": "custom" }

JSON RPC

The json plugin can be used to execute action methods from javascriptand return the output. This featurewasdeveloped with Dojo in mind, so it uses SimpleMethod Definitionto advertise the remote service. Let's work it out with an example(useless as most examples).

First write the action:

package smd;

import com.googlecode.jsonplugin.annotations.SMDMethod;

import com.opensymphony.xwork2.Action;

public class SMDAction { public String smd() { return Action.SUCCESS; } @SMDMethod public Bean doSomething(Bean bean, int quantity) { bean.setPrice(quantity * 10); return bean; } }

Methods that will be called remotely must be annotated with the SMDMethodannotation, for security reasons. Themethod will take a bean object, modify its price and return it. The action can be annotated with the SMD annotation to customize the generated SMD (more on that soon), and parameters can be annotated with SMDMethodParameter. As you can see, we have a "dummy", smd method. This method will be used to generatethe Simple Method Definition (a definition of all the servicesprovided by this class), using the "json" result. 

The bean class: 

package smd; publicclassBean { private String type; private int price; public String getType() { return type; } public void setType(String type) { this.type = type; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }

The mapping: 

<packagename="RPC" namespace="/nodecorate"extends="json-default"> <actionname="SMDAction"class="smd.SMDAction" method="smd"> <interceptor-ref name="json"> <param name="enableSMD">true</param> </interceptor-ref> <resulttype="json"> <paramname="enableSMD">true</param> </result> </action> </package>

Nothing special here, except that both the interceptor and the result must be applied to the action, and "enableSMD" must be enabled for both.

Now the javascript code:

<s:url id="smdUrl"namespace="/nodecorate"action="SMDAction"/> <script type="text/javascript"> //load dojo RPC dojo.require("dojo.rpc.*"); //createservice object(proxy) using SMD (generated by the json result) var service = new dojo.rpc.JsonService("${smdUrl}"); //function called when remote methodreturns varcallback =function(bean) { alert("Price for " + bean.type + " is" + bean.price); }; //parameter varbean = {type: "Mocca"}; //execute remotemethod var defered =service.doSomething(bean, 5); //attach callback to defered object defered.addCallback(callback); </script>

Dojo's JsonService will make a request to the action to load the SMD, which will return a JSON object with the definition of the availableremote methods, using that information Dojo createsa "proxy" for those methods. Because of the asynchronous natureof the request, when the method is executed, a deferred object is returned, to which a callback functioncan be attached. The callback function will receive as a parameterthe object returned from your action. That's it.

Proxied objects

(V0.20) As annotations are not inherited in Java, some user might experienceproblems while trying to serialize objects that are proxied.eg. when you have attached AOP interceptors to your action.

In this situation, the plugin will not detect the annotations on methods in your action.

To overcome this, set the "ignoreInterfaces" result parameter to false (true by default) to request that the plugin inspects all interfacesand superclasses of the action for annotations on the action's methods.

NOTE: This parameter should only be set to false if your action could be a proxy as there is a performance cost caused by recursion through the interfaces

<action name="contact"class="package.ContactAction"method="smd">

<interceptor-ref name="json">

<param name="enableSMD">true</param>

<param name="ignoreSMDMethodInterfaces">false</param>

</interceptor-ref>

<result type="json">

<param name="enableSMD">true</param>

<param name="ignoreInterfaces">false</param>

</result>

<interceptor-ref name="default"/>

</action>

在 Struts2 中使用JSonajax支持

JSON 插件提供了1種名為 json 的 ResultType,1旦為某個 Action 指定了1個類型為 json 的 Result,則該 Result 無需映照到任何視圖資源。由于 JSON 插件會負責將 Action 里的狀態信息序列化成 JSON 格式的數據,并將該數據返 回給客戶端頁面的 JavaScr ipt 。

簡 單 地 說 ,JSON 插件允許我們在JavaScript 中異步調用 Action,而 且 Action 不再需要使用視圖資源來顯示該 Action 里的狀態信息,而是由 JSON 插件負責 將 Action 里的狀態信息返回給調用頁面——通過這類方式,就可以夠完成 Ajax 交互。

Struts2 提供了1種可插拔方式來管理插件,安裝 Struts2 的 JSON插件和安 裝普通插件并沒有太大的區分,相同只需要將 Struts2 插件的 JAR 文檔復制到 Web 利用的 WEB-INF/lib 路徑下便可。

安裝 JSON 插件按以下步驟進行:

(1)登 陸 http://code.google.com/p/jsonplugin/dow nloads/ list 站點,下載 Struts2 的 JSON 插件的最新版本,當前最新版本是 0.7,我們能夠下載該版本的 JSON 插件。

(2)將下載到的 jsonplugin-0.7.jar 文檔復制到 Web 利用的 WEB-INF 路徑下,便可完成 JSON 插件的安裝。 實現 Actio 邏輯假定 wo,en 輸入頁面中包括了3個表單域,這3個表單域對3個要求參 數,因此應當使用Action 來封裝這3個要求參數。3個表單域的 name 分別為 field1 、field2 和 field3 。

處理該要求的 Action 類代碼以下:

public class JSONExample { //封裝要求參數的3個屬性 private String field1; private transient String field2; private String field3; //封裝處理結果的屬性 private int[] ints = {10, 20}; private Map map = new HashMap(); private String customName = "custom"; //3個要求參數對應的 setter 和 getter 方法 public String getField1() { return field1; } public void setField1(St ring field1) { this.field1 = field1; } //此處省略了 field1 和 field2 兩個字段的 setter 和 getter 方法 ... //封裝處理結果的屬性的 setter 和 getter 方法 public int[] getInts() { return ints; } public void setInts(int[] ints) { this.ints = ints; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } //使用注釋語法來改變該屬性序列化后的屬性名 @JSON(name="newName") public String getCustomName() { return this.customName; } public String execute() { map.put("name", "yeek u"); returnAction.SUCCESS; } }

在上面代碼中,使用了 JSON 注釋,注釋時指定了 name 域,name 域指定 Action屬性被序列化成 JSON對象的屬性名。除此以外,JSON注釋還支持以下幾個域:

serialize :配置是不是序列化該屬性。                           

deserialize :配置是不是反序列化該屬性。 

format:配置用于格式化輸出、解析日期表單域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。

配置該 Action 和配置普通 Action存在小小的區分,應當為該 Action 配置 類型為 json 的 Result。而這個 Result 無需配置任何視圖資源。

配置該 Action 的 struts.xml 文檔代碼以下:

<?xml version="1.0" encoding="G BK"? > <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http:/ /struts.apache.or g/dtds/st ruts⑵.0.dtd" > <struts > <consta nt name="struts.i18n.encod ing" value="U TF⑻"/> <package name="exa mple" extends="json-default" > <action name="JSON Example" class="lee.JSONExample" > <result type="json"/> </action> </package> </struts>

在上面配置文檔中有兩個值得注意的地方:

第1個地方是配置 struts.i18n.encod ing 常量時,不再是使用 GBK 編碼,而 是 UTF⑻ 編碼,這是由于 Ajax的 POST 要求都是以 UTF⑻的方式進行編碼的。

第2個地方是配置包時,自己的包繼承了 json-default 包,而不再繼承默許 的 default 包,這是由于只有在該包下才有 json 類型的 Result。

業務思想

Json的對象的作用遠不止于此,個人初步理解程度,demo中展現的只是json部份理解,歡迎交換學習。

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久99中文字幕伊人 | 牛和人交videos欧美冫3d | freexxx性欧美hd男 | 精品伊人久久久大香线蕉欧美 | 午夜性a一级毛片 | 综合色在线观看 | 国内精品久久久久影 | 国产偷v国产偷v亚洲偷v | 亚洲国产欧美精品一区二区三区 | free性vido另类重口 | 欧美第五页| 国产一区二区三区视频在线观看 | 久久最新| 精品精品国产高清a毛片牛牛 | 色吊丝中文字幕 | 私人毛片免费高清影视院 | 国产三区视频李宗瑞 | 日韩欧美精品中文字幕 | 成人夜夜嗨 | 亚洲免费观看在线视频 | 欧美性受xxxx白人性爽 | 在线观看的黄色网址 | 免费成年人在线观看视频 | 国产高清视频在线播放 | 亚洲一区二区视频 | 欧美一区二区在线观看视频 | 波多野结衣综合 | 亚洲国产成人久久精品图片 | 一区二区三区鲁丝不卡麻豆 | 亚洲精品国产一区二区在线 | 免费xx视频| 国产欧美另类久久精品91 | 一区二区三区视频在线 | 激情视频在线观看网站 | 精品久久久久久无码中文字幕 | 亚洲国产成a人v在线观看 | 久久国产精品一国产精品 | 上海一级毛片 | 日本久久网 | 最近中文字幕免费高清mv | 在线观看视频网站 |