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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Spring4.3.x 淺析xml配置的解析過程(3)——使用DocumentLoader創(chuàng)建Document對象

2019-11-10 20:13:09
字體:
供稿:網(wǎng)友

準備工作


SPRing的xmlBeanDefinitionReader通過ResourceLoader創(chuàng)建了Resource對象后,又如何處理Resource對象呢?XmlBeanDefinitionReader拿到Resource對象后,會調(diào)用它的loadBeanDefinitions(Resource resource)方法,下面我們就根據(jù)這個方法為入口來探討這個問題,見下面的代碼。

public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException { return loadBeanDefinitions(new EncodedResource(resource)); }

通過上面的代碼我們看到XmlBeanDefinitionReader拿到Resource對象后,首先把它封裝成EncodedResource 對象來調(diào)用它的loadBeanDefinitions(EncodedResource encodedResource)方法,下面是此方法的源碼。

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { Assert.notNull(encodedResource, "EncodedResource must not be null"); if (logger.isInfoEnabled()) { logger.info("Loading XML bean definitions from " + encodedResource.getResource()); } Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get(); if (currentResources == null) { currentResources = new HashSet<EncodedResource>(4); this.resourcesCurrentlyBeingLoaded.set(currentResources); } if (!currentResources.add(encodedResource)) { throw new BeanDefinitionStoreException( "Detected cyclic loading of " + encodedResource + " - check your import definitions!"); } try { // 讀取資源文件輸入流 InputStream inputStream = encodedResource.getResource().getInputStream(); try { InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } // 根據(jù)指定的XML文件加載BeanDefinition return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); } finally { inputStream.close(); } } catch (IOException ex) { throw new BeanDefinitionStoreException( "IOException parsing XML document from " + encodedResource.getResource(), ex); } finally { currentResources.remove(encodedResource); if (currentResources.isEmpty()) { this.resourcesCurrentlyBeingLoaded.remove(); } } }

上面的代碼把Resource對象持有的xml輸入流對象封裝成解析XML文件所需的InputSource對象,這個對象被SAX解析器用來決定怎么讀取xml文件中的內(nèi)容。我們繼續(xù)看doLoadBeanDefinitions方法在XmlBeanDefinitionReader類中的源碼。

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { // 加載Document對象 Document doc = doLoadDocument(inputSource, resource); // 注冊BeanDefinition return registerBeanDefinitions(doc, resource); } catch (BeanDefinitionStoreException ex) { throw ex; } catch (SAXParseException ex) { throw new XmlBeanDefinitionStoreException(resource.getDescr進入doLoadBeanDefinitions方法,也就離我們探討的主題不遠了,doLoadDocument方法返回的正是我們要探討的目標Document對象,下面是XmlBeanDefinitionReader的doLoadDocument方法源碼。

/** * 獲取Document對象 **/ protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception { // 使用DocumentLoader來加載Document對象 return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, getValidationModeForResource(resource), isNamespaceAware()); }

doLoadDocument通過使用DocumentLoader對象來加載Document對象,但這里在使用DocumentLoader對象之前還需要做以下5個準備工作 a. 獲取DocumentLoader對象。 b. 獲取EntityResolver對象。 c. 獲取ErrorHandler對象。 d. 獲取xml驗證模式。 e. 設(shè)置xml命名空間是否敏感 其中DocumentLoader對象默認為DefaultDocumentLoader;ErrorHandler對象默認為SimpleSaxErrorHandler;namespaceAware默認為false,即xml命名空間不敏感。這三個默認對象都可以通過XmlBeanDefinitionReader所提供的setter方法更改。下面來看看EntityResolver對象和xml驗證模式的獲取。 (1) 獲取EntityResolver對象 XmlBeanDefinitionReader通過它的getEntityResolver方法獲取EntityResolver對象,getEntityResolver的代碼如下。

protected EntityResolver getEntityResolver() { if (this.entityResolver == null) { ResourceLoader resourceLoader = getResourceLoader(); if (resourceLoader != null) { this.entityResolver = new ResourceEntityResolver(resourceLoader); } else { this.entityResolver = new DelegatingEntityResolver(getBeanClassLoader()); } } return this.entityResolver; }

如果XmlBeanDefinitionReader持有的EntityResolver對象不為空,則直接返回。 如果XmlBeanDefinitionReader持有的ResourceLoader對象不為空,則返回ResourceEntityResolver對象,否則返回DelegatingEntityResolver對象。

(2)獲取xml驗證模式

protected int getValidationModeForResource(Resource resource) { // 獲取XmlBeanDefinitionReader設(shè)置的驗證模式 int validationModeToUse = getValidationMode(); if (validationModeToUse != VALIDATION_AUTO) { return validationModeToUse; } // 沒有明確的驗證模式,從Resource對象中檢測驗證模式 int detectedMode = detectValidationMode(resource); if (detectedMode != VALIDATION_AUTO) { return detectedMode; } // 返回默認的驗證模式xsd return VALIDATION_XSD; }

上面的代碼中我們來看看從Resource對象中檢測驗證模式的detectValidationMode方法的代碼,如下。

protected int detectValidationMode(Resource resource) { if (resource.isOpen()) { throw new BeanDefinitionStoreException( "Passed-in Resource [" + resource + "] contains an open stream: " + "cannot determine validation mode automatically. Either pass in a Resource " + "that is able to create fresh streams, or explicitly specify the validationMode " + "on your XmlBeanDefinitionReader instance."); } InputStream inputStream; try { inputStream = resource.getInputStream(); } catch (IOException ex) { throw new BeanDefinitionStoreException( "Unable to determine validation mode for [" + resource + "]: cannot open InputStream. " + "Did you attempt to load directly from a SAX InputSource without specifying the " + "validationMode on your XmlBeanDefinitionReader instance?", ex); } try { return this.validationModeDetector.detectValidationMode(inputStream); } catch (IOException ex) { throw new BeanDefinitionStoreException("Unable to determine validation mode for [" + resource + "]: an error occurred whilst reading from the InputStream.", ex); } }

detectValidationMode方法使用驗證模式檢測器來從xml輸入流中檢測,XmlBeanDefinitionReader中默認的驗證模式檢測器為XmlValidationModeDetector。我們來看看XmlValidationModeDetector的detectValidationMode方法的代碼,如下。

public int detectValidationMode(InputStream inputStream) throws IOException { // Peek into the file to look for DOCTYPE. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); try { // dtd驗證模式標志 boolean isDtdValidated = false; String content; while ((content = reader.readLine()) != null) { content = consumeCommentTokens(content); if (this.inComment || !StringUtils.hasText(content)) { continue; } // 判斷當(dāng)前行是否包含DOCTYPE,有則是dtd模式 if (hasDoctype(content)) { isDtdValidated = true; break; } // 判斷當(dāng)前行是否以‘<’+字母開始 if (hasOpeningTag(content)) { break; } } // 聲明:public static final int VALIDATION_XSD = 3; // 聲明:public static final int VALIDATION_DTD = 2; return (isDtdValidated ? VALIDATION_DTD : VALIDATION_XSD); } catch (CharConversionException ex) { return VALIDATION_AUTO; } finally { reader.close(); } }

這段代碼主要是讀取xml文件流的前幾行來判斷是否含有DOCTYPE字符串,如果有則是dtd驗證模式,否則是xsd驗證模式。

使用DocumentLoader對象創(chuàng)建Document對象

前面我們已經(jīng)探討了spring使用DocumentLoader對象前需要做的準備工作,包括獲取解析xml文件中的實體的解析器EntityResolver對象、獲取xml文件的驗證模式、獲取解析xml文件需要的InputSource對象以及獲取處理xml文件解析錯誤的ErrorHandler對象?,F(xiàn)在我們開始探討DocumentLoader的執(zhí)行流程。

Spring提供DocumentLoader接口來加載Document對象。并提供了DocumentLoader的默認實現(xiàn)類DefaultDocumentLoader。下面是DefaultDocumentLoader實現(xiàn)loadDocument方法的源代碼。

@Override public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception { DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware); if (logger.isDebugEnabled()) { logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]"); } DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler); return builder.parse(inputSource); }

loadDocument方法首先創(chuàng)建DocumentBuilderFactory 對象,默認使用com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl。然后使用DocumentBuilderFactory 來創(chuàng)建DocumentBuilder 對象。最后使用DocumentBuilder 對象來解析持有xml輸入流的InputSource對象并返回創(chuàng)建的Document對象。下面我們來看看這三步的執(zhí)行過程。

(1)創(chuàng)建DocumentBuilderFactory 對象 loadDocument方法調(diào)用DefaultDocumentLoader的createDocumentBuilderFactory方法來創(chuàng)建DocumentBuilderFactory 對象,此方法的源碼如下。

protected DocumentBuilderFactory createDocumentBuilderFactory(int validationMode, boolean namespaceAware) throws ParserConfigurationException { // 實例化DocumentBuilderFactory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 下面配置factory factory.setNamespaceAware(namespaceAware); if (validationMode != XmlValidationModeDetector.VALIDATION_NONE) { // 設(shè)置使用驗證模式 factory.setValidating(true); if (validationMode == XmlValidationModeDetector.VALIDATION_XSD) { // xsd強制命名空間敏感 factory.setNamespaceAware(true); try { // 聲明:private static final String SCHEMA_LANGUAGE_ATTRIBUTE = "http://
java.sun.com/xml/jaxp/properties/schemaLanguage"; // 聲明:private static final String XSD_SCHEMA_LANGUAGE = "http://www.w3.org/2001/XMLSchema"; factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE); } catch (IllegalArgumentException ex) { ParserConfigurationException pcex = new ParserConfigurationException( "Unable to validate using XSD: Your JAXP provider [" + factory + "] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? " + "Upgrade to Apache Xerces (or Java 1.5) for full XSD support."); pcex.initCause(ex); throw pcex; } } } return factory; }

createDocumentBuilderFactory方法通過調(diào)用抽象類DocumentBuilderFactory的靜態(tài)方法newInstance()來創(chuàng)建DocumentBuilderFactory對象,默認使用com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl。當(dāng)然jdk還提供了4中方式指定自己定義的DocumentBuilderFactory,這里就不深入探討了。

獲取到DocumentBuilderFactory對象后,createDocumentBuilderFactory方法它做了一些定制設(shè)置。比如,xsd驗證模式強制命名空間敏感。

(2)創(chuàng)建DocumentBuilder 對象 loadDocument方法調(diào)用DefaultDocumentLoader的createDocumentBuilder方法來返回一個DocumentBuilder 對象,這個方法的源代碼如下。

protected DocumentBuilder createDocumentBuilder( DocumentBuilderFactory factory, EntityResolver entityResolver, ErrorHandler errorHandler) throws ParserConfigurationException { DocumentBuilder docBuilder = factory.newDocumentBuilder(); if (entityResolver != null) { docBuilder.setEntityResolver(entityResolver); } if (errorHandler != null) { docBuilder.setErrorHandler(errorHandler); } return docBuilder; }

createDocumentBuilder方法首先使用DocumentBuilderFactory 對象創(chuàng)建DocumentBuilder 對象,然后把EntityResolver 和ErrorHandler 對象設(shè)置給DocumentBuilder 對象。其中我們來看看默認的DocumentBuilderFactory 對象的newDocumentBuilder方法返回的是一個怎么樣的DocumentBuilder 對象,源代碼如下。

public DocumentBuilder newDocumentBuilder() throws ParserConfigurationException { /** Check that if a Schema has been specified that neither of the schema properties have been set. */ // 檢查是否已經(jīng)指定了Schema對象。 if (grammar != null && attributes != null) { // 是否已經(jīng)設(shè)置了schema的屬性 if (attributes.containsKey(JAXPConstants.JAXP_SCHEMA_LANGUAGE)) { throw new ParserConfigurationException( SAXMessageFormatter.formatMessage(null, "schema-already-specified", new Object[] {JAXPConstants.JAXP_SCHEMA_LANGUAGE})); } else if (attributes.containsKey(JAXPConstants.JAXP_SCHEMA_SOURCE)) { throw new ParserConfigurationException( SAXMessageFormatter.formatMessage(null, "schema-already-specified", new Object[] {JAXPConstants.JAXP_SCHEMA_SOURCE})); } } try { // 創(chuàng)建一個com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl對象。 return new DocumentBuilderImpl(this, attributes, features, fSecureProcess); } catch (SAXException se) { throw new ParserConfigurationException(se.getMessage()); } }

newDocumentBuilder方法返回一個com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl對象,DocumentBuilderImpl的上述構(gòu)造方法代碼如下。

DocumentBuilderImpl(DocumentBuilderFactoryImpl dbf, Hashtable dbfAttrs, Hashtable features, boolean secureProcessing) throws SAXNotRecognizedException, SAXNotSupportedException { domParser = new DOMParser(); // 設(shè)置ErrorHandler對象 if (dbf.isValidating()) { fInitErrorHandler = new DefaultValidationErrorHandler(domParser.getXMLParserConfiguration().getLocale()); setErrorHandler(fInitErrorHandler); } else { fInitErrorHandler = domParser.getErrorHandler(); } domParser.setFeature(VALIDATION_FEATURE, dbf.isValidating()); // 設(shè)置命名空間是否敏感 domParser.setFeature(NAMESPACES_FEATURE, dbf.isNamespaceAware()); // 通過DocumentBuilderFactory設(shè)置各種變量 domParser.setFeature(INCLUDE_IGNORABLE_WHITESPACE, !dbf.isIgnoringElementContentWhitespace()); domParser.setFeature(CREATE_ENTITY_REF_NODES_FEATURE, !dbf.isExpandEntityReferences()); domParser.setFeature(INCLUDE_COMMENTS_FEATURE, !dbf.isIgnoringComments()); domParser.setFeature(CREATE_CDATA_NODES_FEATURE, !dbf.isCoalescing()); // 設(shè)置是否支撐XInclude. if (dbf.isXIncludeAware()) { domParser.setFeature(XINCLUDE_FEATURE, true); } fSecurityPropertyMgr = new XMLSecurityPropertyManager(); domParser.setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); fSecurityManager = new XMLSecurityManager(secureProcessing); domParser.setProperty(SECURITY_MANAGER, fSecurityManager); if (secureProcessing) { if (features != null) { Object temp = features.get(XMLConstants.FEATURE_SECURE_PROCESSING); if (temp != null) { boolean value = ((Boolean) temp).booleanValue(); if (value && Constants.IS_JDK8_OR_ABOVE) { fSecurityPropertyMgr.setValue(Property.access_EXTERNAL_DTD, State.FSP, Constants.EXTERNAL_ACCESS_DEFAULT_FSP); fSecurityPropertyMgr.setValue(Property.ACCESS_EXTERNAL_SCHEMA, State.FSP, Constants.EXTERNAL_ACCESS_DEFAULT_FSP); } } } } this.grammar = dbf.getSchema(); if (grammar != null) { XMLParserConfiguration config = domParser.getXMLParserConfiguration(); XMLComponent validatorComponent = null; // 對于Xerces grammars,使用內(nèi)置的schema驗證器 if (grammar instanceof XSGrammarPoolContainer) { validatorComponent = new XMLSchemaValidator(); fSchemaValidationManager = new ValidationManager(); fUnparsedEntityHandler = new UnparsedEntityHandler(fSchemaValidationManager); config.setDTDHandler(fUnparsedEntityHandler); fUnparsedEntityHandler.setDTDHandler(domParser); domParser.setDTDSource(fUnparsedEntityHandler); fSchemaValidatorComponentManager = new SchemaValidatorConfiguration(config, (XSGrammarPoolContainer) grammar, fSchemaValidationManager); } else { /** 對于第三方grammars, 使用JAXP validator模塊. **/ validatorComponent = new JAXPValidatorComponent(grammar.newValidatorHandler()); fSchemaValidationManager = null; fUnparsedEntityHandler = null; fSchemaValidatorComponentManager = config; } config.addRecognizedFeatures(validatorComponent.getRecognizedFeatures()); config.addRecognizedProperties(validatorComponent.getRecognizedProperties()); setFeatures(features); config.setDocumentHandler((XMLDocumentHandler) validatorComponent); ((XMLDocumentSource)validatorComponent).setDocumentHandler(domParser); domParser.setDocumentSource((XMLDocumentSource) validatorComponent); fSchemaValidator = validatorComponent; } else { fSchemaValidationManager = null; fUnparsedEntityHandler = null; fSchemaValidatorComponentManager = null; fSchemaValidator = null; setFeatures(features); } setDocumentBuilderFactoryAttributes(dbfAttrs); // 初始化EntityResolver fInitEntityResolver = domParser.getEntityResolver(); }

(3)創(chuàng)建Document對象 loadDocument方法調(diào)用DocumentBuilder的parse方法來返回一個Document對象,我們來看看com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl的parse方法源碼。

public Document parse(InputSource is) throws SAXException, IOException { if (is == null) { throw new IllegalArgumentException( DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "jaxp-null-input-source", null)); } // 重置schema驗證器 if (fSchemaValidator != null) { if (fSchemaValidationManager != null) { fSchemaValidationManager.reset(); fUnparsedEntityHandler.reset(); } resetSchemaValidator(); } // 使用DomParser對象解析xml文件 domParser.parse(is); // 獲取Document對象 Document doc = domParser.getDocument(); // 刪除與Document創(chuàng)建有關(guān)的引用 domParser.dropDocumentReferences(); return doc; }

關(guān)于這里parse方法,就不過多的探討它。我們只需知道通過它,可以獲取到Document對象就行了。

總結(jié)


(1)Spring默認的DocumentLoader是DefaultDocumentLoader。

(2)DefaultDocumentLoader通過創(chuàng)建DocumentBuilderFactory工廠對象來創(chuàng)建文檔構(gòu)建器DocumentBuilder對象,最后使用DocumentBuilder對象來獲取Document對象。


上一篇:264. Ugly Number II -Medium

下一篇:迷瘴

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美精品videofree1080p| 久久久一区二区三区四区| 欧美性狂猛xxxxxbbbbb| 精品国产一区探花在线观看| 国产va在线| 手机看片福利视频| 妞干网在线视频观看| 国产传媒在线看| 青青久久aⅴ北条麻妃| 中文字幕欧美日韩va免费视频| 极品国产人妖chinesets亚洲人妖| 蜜桃麻豆91| 欧洲美女精品免费观看视频| 天天久久综合网| 邻家有女韩剧在线观看国语| 综合国产第二页| aaa一级黄色片| 一个色综合久久| 国产一级一片免费播放| 成人蜜臀av电影| 国产香蕉精品视频| 日本v片在线高清不卡在线观看| 实拍女处破www免费看| 亚洲一区二区三区久久| 色94色欧美sute亚洲线路一久| 91成人福利视频| 亚洲欧美福利一区二区| 最近2018年中文字幕在线| 久久人体做爰大胆| 污视频网站观看| 国产麻豆永久视频| 国产精品成人在线观看| 亚洲乱码国产乱码精品精98午夜| 波多野结衣一区二区三区四区| 91玉足脚交白嫩脚丫在线播放| 精品少妇人妻av一区二区三区| 国产精品久久久久永久免费看| 自拍偷拍亚洲图片| 国产一区二区成人久久免费影院| 日本伊人色综合网| 91国产在线精品| 亚洲欧美日本一区二区三区| 欧美69视频| av五月天在线| 日韩污视频在线观看| 99视频免费观看| 亚洲图片欧美日产| 欧美成人国产精品高潮| 18黄暴禁片在线观看| 韩国理伦片久久电影网| 欧美一区二区三区视频免费播放| 宅男网站在线免费观看| 可以免费看av的网址| www.国产91| 成人午夜小视频| www.欧美精品| 欧美日韩精品在线观看视频| 91精品啪在线观看国产81旧版| 欧美日本不卡视频| 天堂va蜜桃一区二区三区漫画版| 成人福利网站在线观看11| 在线播放一区二区精品产| 亚洲一区二区四区| 91麻豆免费视频网站| 久久久久亚洲视频| 日韩久久一区| 小小的日本在线观看免费色网| 天天摸天天舔天天操| 国产理论片免费观看| 深夜福利亚洲导航| 日本网站在线免费观看| 亚洲天堂精品在线观看| 一区二区三区在线电影| 国产日本在线观看| 日韩综合在线观看| 一道本在线观看视频| 国产综合久久久久影院| www免费在线观看视频| 裸体武打性艳史| 国产wwwwwww| 欧美一区二区三区观看| 97精品在线观看| 中文字幕在线观看高清| 中文字幕日韩专区| 欧美日韩1区2区| 色爱av美腿丝袜综合粉嫩av| www亚洲国产| 国产成人精品日本亚洲11| 中文字幕日本最新乱码视频| av成人资源| 激情中国色综合| 97久精品国产片一区二区三区| 91成人天堂久久成人| 九九久久成人| 一区二区成人在线观看| 亚洲国产精品久久久久秋霞影院| 国产九色porn网址| 欧美美女视频在线观看| 97天天综合网| 性xxxx奶大欧美高清| 日韩女优一区二区| 青娱乐国产精品| 九色自拍视频在线观看| 国产一区二区三区三区在线观看| 国产日韩v精品一区二区| 国产成人无码精品久久久久| 色网在线免费观看| 性欧美videos白嫩| √天堂资源地址在线官网| 偷拍一区二区| 五月婷婷六月丁香激情| 精品亚洲aⅴ无码一区二区三区| 久色婷婷小香蕉久久| 中国极品少妇videossexhd| 国产情侣激情自拍| 日韩女优视频免费观看| 国产成+人+日韩+欧美+亚洲| 国产日韩欧美一二三区| 91桃色在线观看| 黄a免费视频| 国内精品模特av私拍在线观看| 日韩欧美电影在线观看| 蜜臀精品一区二区三区在线观看| 激情一区二区三区| 2012中文字幕在线视频| 美日韩精品免费视频| 欧美污视频网站| 国产精品美乳一区二区免费| 4438全国亚洲精品在线观看视频| 欧美性猛交丰臀xxxxx网站| 91精品久久久久久久久久久久久久| 日韩久久精品一区| 日韩欧美中文字幕不卡| mm131国产精品| 精品久久香蕉国产线看观看亚洲| 亚洲婷婷噜噜| 伊人影院在线观看视频| 午夜激情av在线| 色综合久久久久无码专区| 国产91视频在线| 日韩电影在线观看中文字幕| av一二三不卡影片| 久久婷婷综合中文字幕| 日韩欧美视频一区二区三区| 欧美日韩国产另类一区| 日韩欧美在线观看强乱免费| 91激情在线| 欧美日韩国产一级二级| 在线看女人毛片| 亚洲aa在线| 色一情一区二区| 一本本久综合久久爱| 91精品亚洲一区在线观看| 日韩综合小视频| 影音先锋在线中文| 欧美另类老肥妇| 欧美精品在线观看91| 精品毛片免费观看| 日本一级理论片在线大全| 亚洲午夜久久| 亚洲午夜精品网| 狠狠色丁香婷婷| 日本不卡一二三| 成人盗摄视频| 日本美女视频一区二区| 被灌满精子的波多野结衣| 天天综合天天综合色| 可以免费观看av毛片| 日本电影一区二区| 国产99久一区二区三区a片| 激情国产一区| 成人毛片在线精品国产| 最新中文字幕免费| 国产午夜精品久久久久免费视| 夜夜骚av一区二区三区| 亚洲人成小说| 性生活免费在线观看| 日韩av二区| 内射中出日韩无国产剧情| 国产日产一区| 久久久av水蜜桃| 91福利精品视频| 国产欧美日产一区| 最近最新mv在线观看免费高清| 欧美精品无码一区二区三区| 中文字幕第六页| 久久久99久久| 超碰在线91| 亚洲女人毛片| 99精品视频一区| 99久久一区三区四区免费| 3751色影院一区二区三区| 91人妻一区二区三区蜜臀| 欧美日韩国产精品自在自线| 黄色一级视频网站| 中文字幕亚洲精品一区| 少妇户外露出[11p]| 91福利视频在线观看| 久草视频免费看| 欧美日韩在线大尺度| 欧美v亚洲v综合ⅴ国产v| 国产精品十八以下禁看| 久久大逼视频| 欧美精品一卡两卡| 日日橹狠狠爱欧美超碰| 性欧美大战久久久久久久免费观看| 国产激情精品一区二区三区| 97色成人综合网站| 日韩精品视频免费在线观看| 99爱精品视频| 久久九九热re6这里有精品| 小小的日本在线观看免费色网| 国产一区玩具在线观看| 91日本在线观看| 婷婷视频在线观看| 欧美2区3区4区| 日本一二区免费| 日韩精品一区二区亚洲av| 亚洲乱码日产精品bd在线观看| 波多野结衣亚洲一区| 蜜桃av成人| 高清视频在线www色| 国产精品免费人成网站酒店| 欧洲av不卡| 男人天堂网在线观看| 在线精品视频在线观看高清| 国产成人av电影在线播放| 另类色图亚洲色图| 在线满18网站观看视频| 再深点灬舒服灬太大了少妇| 日韩欧美在线国产| 欧洲乱码伦视频免费| 亚洲欧美日韩网| 亚洲成人网久久久| 亚洲在线观看一区| 九色福利视频| 亚洲v欧美v另类v综合v日韩v| 日韩精品成人一区二区三区| 成人午夜免费影院| 欧美黄色大片在线观看| 久久久999成人| 国产精品久久观看| 成人黄色在线播放| 国产福利91精品一区二区| 你懂得视频在线观看| 奇米成人av国产一区二区三区| 狠狠色狠狠色综合日日91app| 日日操夜夜爽| 在线观看免费电影| 国产日韩欧美在线视频观看| 天堂√在线中文官网在线| 国产一区白浆| 午夜视频福利在线| 亚洲欧美日韩不卡一区二区三区| 欧美人与性动交α欧美精品济南到| 欧美高潮视频| 极品裸体白嫩激情啪啪国产精品| 中文国产成人精品久久一| 国产经典中年夫妇盗摄| 亚洲欧美日韩精品综合在线观看| 色豆豆成人网| 日本免费一区二区三区等视频| 自拍偷拍福利视频| 日韩一卡二卡在线| 天天操人人爽| 一区二区三区免费视频网站| 裸体一区二区三区| 免费黄网站观看| www日韩在线观看| 91色国产在线| 国产精品国产精品国产| 国产欧美激情| 蜜桃视频无码区在线观看| 成人亚洲欧美激情在线电影| 国产精品一级二级| 狠狠爱免费视频| 91国产在线精品| 国产美女久久久久久| 99九九99九九九99九他书对| 香蕉视频官网在线观看日本一区二区| 国产精品一区久久久久| 少妇av在线| 福利在线网站| 伊人成人在线观看| 欧美日产一区二区三区在线观看| 国产日韩欧美激情| 国产精品久久久久久av公交车| 色噜噜噜噜噜噜| free性欧美高清另类| 日韩精品卡通动漫网站| 国产中文字幕亚洲| 欧美18xxxxx| av电影在线观看一区| 第一次破处视频| 欧美午夜精品久久久久免费视| 国产欧美一区二区精品婷婷| 韩国成人动漫在线观看| 国产精品999| 国产精品久久精品| www精品国产| 国产精选在线| 夜夜躁狠狠躁日日躁2021日韩| 一区二区三区福利| 另类春色校园亚洲| 日韩激情中文字幕| 久久精品视频一区二区三区| 黄色片中文字幕| 亚洲男人第一天堂| www视频免费| 日本网站免费在线观看| 久久国产精品99久久久久久老狼| 国产精品亚洲lv粉色| 女生裸体免费视频| 亚洲码在线观看| 日韩成人一级大片| 免费一级淫片aaa片毛片a级| 毛片在线播放a| www.欧美日韩| 看欧美日韩国产| 欧美亚洲一区二区在线观看| 欧美色综合一区二区三区| 国产一二三四在线| 欧美精品v日韩精品v国产精品| 成人免费看片98| 怡红院av在线| 国产免费一区二区三区香蕉精| 欧美日韩激情在线观看| 婷婷亚洲最大|