<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The important thing in life is to have a great aim , and the determination

    常用鏈接

    統計

    IT技術鏈接

    保險相關

    友情鏈接

    基金知識

    生活相關

    最新評論

    Web Service學習筆記之----JAX-RPC (轉載CN-JAVA)

    導讀
    本文是我對學習jwsdp-1.2時所做筆記的整理,其中主要是一些指導性的內容,并沒有多少概念以及原理的介紹,讀者可能覺得略顯簡單,如果想要學習基本概念可以參考網上有關Web Service的資料。本文例子所使用的開發環境是WindowXP+JWSDP-1.2。

    一.Web Service簡介
    1.定義
    由兩部分組成
    ·SOAP--Web Service之間的基本通信協議。
    ·WSDL--Web Service描述語言,它定義了Web Service做什么,怎么做和查詢的信息。
    2.簡單的Web Service實現
    包含四個基本步驟
    ·創建Web Service的商業邏輯(通常是一些Java類)
    ·將這些Java類部署到一個SOAP服務器上
    ·生成客戶訪問代碼
    ·部署客戶應用
    注意:WSDL等文件的生成通常是利用廠商提供的工具來完成
    3.WSDL解析
    WSDL描述語言一般包含三部分
    ·What部分--包括了type、message和portType元素
    Type:定義了Web Service使用的數據結構(使用XML Schema定義)
    Message:一個Message是SOAP的基本通信元素。每個Message可以有一個或多個Part,每個Part代表一個參數。
    PortType:消息匯總為不同的操作并歸入到一個被稱為portType的實體中。一個portType代表一個接口(Web Service支 持的操作集合),每個Web Service可以有多個接口,它們都使用portType表示。每個操作又包含了input和 output部分。
    ·How部分--包含binding元素
    binding元素將portType綁定到特定的通信協議上(如HTTP上的SOAP協議)
    ·Where部分--由service元素組成
    它將portType,binding以及Web Service實際的位置(URI)放在一起描述
    4.客戶端
    通常Web Service可以有三種類型的客戶
    ·商業伙伴(Business Partner)--包括分發商,零售商以及大型消費者)
    此類客戶通過SOAP、WSDL、ebXML、UDDI等XML技術與Web Service連接
    ·瘦客戶--包括Web瀏覽器、PDA以及無線設備
    該類客戶通常經由輕量協議(如HTTP)與Web Service連接
    ·肥客戶--包括Applet、各類應用以及現存系統
    通常使用重量級協議(如IIOP)連接Web Service

    二.使用JAX-RPC開發Web Service
    1.JAX-RPC支持的數據類型
    JAX-RPC除了支持Java的基本數據類型外還支持一些自定義對象,但這些對象有一些條件限制
    ·有缺省構造函數的對象
    ·沒有實現java.rmi.Remote接口
    ·字段必須是JAX-RPC支持的類型
    ·公有字段不能聲明為final或transient
    ·非公有字段必須有對應的setter和getter方法
    2.使用JAX-RPC創建Web Service
    ·基本步驟
    A. 編寫服務端接口并實現
    一個服務的end-point有一些規定:必須實現java.rmi.Remot接口而且每個方法需要拋出RemoteException異常。
    B. 編譯、生成并且將所有服務需要的類和文件打包成WAR文件
    C. 部署包含服務的WAR文件
    ·如何創建服務
    A. 編譯服務所需的類文件
    B. 生成服務所需文件
    可以使用wscompile工具生成model.gz文件,它包含了描述服務的內部數據結構命令如下
    wscompile -define -d build -nd build -classpath build config.xml
    -model build/model.gz
    define標志告訴工具讀取服務的 endpoint接口并且創建WSDL文件。-d和-nd標志告訴工具將輸出文件寫入指定的目錄build。工具需要讀以下的config.xml文件
    <?xml version=”1.0” encoding=”UTF-8”?>
    <configuration xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/config”>
    <service
    name=”HelloService”
    targetNamespace=”urn:Star”
    typeNamespace=”urn:Star”
    packageName=”helloservice”>
    <interface name=”helloservice.HelloIF”/>
    </service>
    </configuration>
    該文件告訴wscompile創建model文件所需的信息
    ·服務名稱:MyHelloService
    ·WSDL名字空間:urn:Star
    ·HelloService的所有類在包helloservice中
    ·服務的端點(endpoint)接口:helloservice.HelloIF
    C. 將服務打包為WAR文件
    WEB-INF/classes/hello/HelloIF.class
    WEB-INF/classes/hello/HelloImpl.class
    WEB-INF/jaxrpc-ri.xml
    WEB-INF/model.gz
    WEB-INF/web.xml
    jaxrpc-ri.xml文件如下所述
    <?xml version=”1.0” encoding=”UTF-8”?>
    <webServices xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/dd”
    version=”1.0”
    targetNamespaceBase=”urn:Star”
    typeNamespaceBase=”urn:Star”
    urlPatternBase=”webservice”>
    <endpoint name=”Hello”
    displayName=”HelloWorld Service”
    description=”A simple web service”
    interface=”helloservice.HelloIF”
    model=”/WEB-INF/model.gz”
    implementation=”helloservice.HelloImpl”/>
    <endpointMapping endpointName=”Hello” urlPattern=”/hello”/>
    </webServices>
    D. 處理WAR文件
    使用命令行
    wsdeploy -o hello-jaxrpc.war hello-jaxrpc-original.war
    wsdeploy工具完成以下幾個任務
    ·讀 hello-jaxrpc-original.war作為輸入
    ·從jaxrpc-ri.xml文件中獲得信息
    ·為服務生成tie classes
    ·生成名為HelloService.wsdl的WSDL文件
    ·將tie classes和HelloService.wsdl文件打包到新的war文件中
    E. 在服務器上部署服務
    如果你使用的是TOMCAT,你可以將WAR文件拷貝到webapps目錄下,然后可以在
    <http://localhost:8080/[context]/[servicename>上看是否配置成功
    ·如何使用JAX-RPC創建Web Service客戶端
    通常有三種類型的客戶:Static Stub、Dynamic Proxy和Dynamic Invocation Interface(DII)
    Static Stub客戶
    ·生成Stub
    通過使用config-wsdl.xml和wscompile工具,可以生成stub
    wscompile -gen:client -d build -classpath build config-wsdl.xml
    config-wsdl.xml文件如下
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
    <wsdl location="http://localhost:8080/helloWS/hello?WSDL"
    packageName="staticstub"/>
    </configuration>
    wscompile工具讀取服務器上的WSDL文件并生成stub
    ·編寫靜態客戶代碼
    Stub stub=(Stub)(new HelloService_Impl().getHelloIFPort());
    HelloIF hello=(HelloIF)stub;
    Hello.sayHello(“starchu”);
    注意:HelloService_Impl類由wscompile生成
    ·編譯代碼
    ·運行客戶端(需要包含saaj API和JAX-RPC API運行)
    Dynamic Proxy客戶
    ·生成接口
    通過使用config-wsdl.xml文件和wscompile工具,可以生成客戶所需的接口
    wscompile -import -d build -classpath build config-wsdl.xml
    config-wsdl.xml和前面列出的文件內容相同。
    ·編寫動態客戶代碼
    ServiceFactory factory=ServiceFactory.newInstance();
    URL wsdlUrl=new URL(“<your web service wsdl url>”);
    Service service=factory.createService(wsdlUrl,
    new QName(“urn:Star”,”HelloService”));
    HelloIF hello=(HelloIF)service.getPort(
    new QName(“urn:Star”,”HelloIFPort”),HelloIF.class);
    Hello.sayHello(“starchu”);
    注意:這里不再需要靜態客戶代碼的HelloService_Impl類
    ·編譯代碼
    ·運行客戶端(需要包含saaj API和JAX-RPC API運行)
    Dynamic Invocation Interface客戶
    這個方法為我們提供了更有彈性的客戶調用方式,客戶代碼不在需要由wscompile工具生成的運行時類,當然這種代碼更加復雜。具體步驟如下:
    ·創建ServiceFactory實例
    ServiceFactory factory=ServiceFactory.newInstance();

    ·創建Service(利用服務名的Qname)
    Service service=factory.createService(new QName(“HelloService”));

    ·創建Call對象(使用端點接口的Qname)
    Call call=service.createCall(new QName(“HelloIF”));

    ·設置端點的地址和一些Call對象屬性
    call.setTargetEndpointAddress(args[0]);
    call.setProperty(Call.SOAPACTION_USE_PROPERTY,new Boolean(true));
    call.setProperty(Call.SOAPACTION_URI_PROPERTY,””);
    call.setProperty(“javax.xml.rpc.encodingstyle.namespace.uri”,
    “http://schemas.xmlsoap.org/soap/encoding/”);

    ·設置遠程調用的返回類型、操作名和參數
    QName stringType=new Qname(“http://www.w3.org/2001/XMLSchema”,”string”)
    call.setReturnType(stringType);
    call.setOperationName(new Qname(“urn:Star”,”sayHello”));
    call.addParameter(“String_1”,stringType,ParameterMode.IN);

    ·調用call的invoke方法
    String [] param={ “ starchu “ };
    String retValue=call.invoke(param);

    ·編譯代碼并對Main方法設置<http://localhost:8080/helloWS/hello參數(服務器需有效>)

    3.SOAP Message Handler的例子
    通常使用JAX-RPC建立的Web Service并不需要開發人員自己處理SOAP消息,但是JAX-RPC提供了一種機制可以使程序員獲得這種處理能力,這就是所謂的消息處理器。總的來說,像日志和加解密功能可以通過SOAP消息處理器實現,除此之外,你根本不需要處理SOAP消息。
    ·基本Handler處理過程
    SOAP請求
    ·客戶端處理器在請求消息發送到服務器前被調用
    ·服務端處理器在請求消息分發到端點前被調用
    SOAP應答
    ·服務端處理器在應答消息發送回客戶前被調用
    ·客戶端處理器在應答消息轉換成Java方法返回前被調用
    SOAP錯誤
    處理過程與SOAP應答的方式一樣
    注意:處理器可以在任意端組成處理器鏈
    A.Handler基本編程模型
    服務端
    ·編寫服務端點接口代碼、實現服務并且實現服務端處理器類
    ·創建jaxrpc-ri.xml文件,以便wscompile使用,其中包含了Handler的信息
    ·創建web.xml文件
    ·編譯所有代碼
    ·將文件打包為WAR文件
    ·用wsdeploy工具將原始war文件替換為完整可部署的war文件
    ·在服務器上部署war文件
    客戶端
    ·編寫客戶程序以及客戶端處理器代碼
    ·創建config.xml文件以便wscompile使用,它包含了客戶端處理器的信息
    ·編譯代碼
    ·運行wscompile生成服務端點接口和客戶類
    ·編譯所有代碼,并運行客戶應用

    B.建立客戶端處理器
    處理器必須擴展javax.xml.rpc.handler.GenericHandler類并且提供至少兩個方法的實現init和getHandlers。此外,你可以利用handleXXX方法處理請求、應答和錯誤SOAP消息。基本步驟如下
    ·編寫客戶端處理器代碼
    Public class ClientHandler extends GenericHandler{
    Public void init(HandlerInfo info){
    This.info=info;
    }
    public QName[] getHeaders(){
    return info.getHeaders();
    }
    public boolean handleRequest(MessageContext context){
    SOAPMessageContext smc=(SOAPMessageContext)context;
    SOAPMessage message=smc.getMessage();
    file://You can use SOAP API to implement your own logic
    file://such as logging and encrypt
    ……
    file://Set a logger element in the SOAPHeader
    SOAPHeaderElement loggerElement=
    header.addHeaderElement(envelope.createName(“loginfo”,
    “ns1”,”urn:Star:headprops”));
    loggerElement.setMustUnderstand(true);
    loggerElement.setValue(“10”);
    file://Set a name element in the SOAP Header
    SOAPHeaderElement nameElement=
    Header.addHeaderElement(envelope.createName(“client”,
    “ns1”,”urn:Star:headprops”));
    nameElement.addTextNode(“Star chu”);
    }
    }
    ·編輯config.xml文件
    <?xml version=”1.0” encoding=”UTF-8”?>
    <configuration xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/config”?>
    <wsdl location=”http://localhost:8080/handlerWS/handler?WSDL
    packageName=”client”>
    <handlerChains>
    <chain runAt=”client”>
    <handler className=”client.ClientHandler”>
    <property name=”name” value=”client handler”/>
    </handler>
    </chain>
    </handlerChains></wsdl></configuration>
    ·編寫靜態客戶
    C.建立服務端處理器
    ·編寫服務端處理器(與客戶端結構類似)
    Public boolean handleRequest(MessageContext context){
    SOAPMessageContext smc=(SOAPMessageContext)context;
    ……
    Iterator it=header.examineAllHeaderElements();
    While(it.hasNext()){
    SOAPElement element=(SOAPElement)it.next();
    If(element name is loginfo and must understand it){
    element.getValue();
    element.detach();
    file://Invoke only when the setMustUnderstand(true)
    }
    }
    }
    detach方法用來移除元素,這個需求僅當一個元素設置了mustUnderstand屬性在必要。
    ·編輯jaxrpc-ri.xml文件
    <?xml version=”1.0” encoding=”UTF-8”?>
    <webServices xmlns=”http://java.sun.com/jax-rpc/config/ri/dd”
    version=”1.0”
    targetNamespaceBase=”urn:Star:wsdl”
    typeNamespaceBase=”urn:Star:types”
    urlPatternBase=”/handler”>
    <endpoint name=”HandlerTest”
    displayName=”Handler Test”
    description=” … …”
    interface=”service.HandlerTest”
    model=”/WEB-INF/model.gz”
    implementation=”service.HandlerTestImpl”>
    <handlerChains>
    <chain runAt=”server”>
    <handler className=”service.LoggerHandler”
    headers=”ns1:loginfo”
    xmlns:ns1=”urn:Star:headerprops”>
    <property name=”name” value=”Logger”/>
    </handler>
    <handler className=”service.NameHandler”>
    <propery name=”name” value=”Name”/>
    </handler>
    </chain>
    </handlerChains>
    </endpoint>
    <endpointMapping endpointName=”HandlerTest”
    urlPattern=”/handler”/>
    </webServices>
    在第一個處理器中,XML使用了屬性 headers描述頭信息。這是因為客戶代碼告訴服務端,logger頭必須被理解,否則客戶將收到SOAP錯誤消息
    ·生成WAR文件并部署到服務器上
    4.源代碼
    ·HelloIF.java(endpoint接口)
    package helloservice;

    import java.rmi.RemoteException;
    import java.rmi.Remote;

    public interface HelloIF extends Remote{
    public String sayHello(String target) throws RemoteException;
    }
    ·HelloImpl.java
    package helloservice;

    public class HelloImpl implements HelloIF{
    private String message="Hello";
    public String sayHello(String target){
    return message+target;
    }
    }
    ·StaticClient.java
    package staticstub;
    import javax.xml.rpc.Stub;
    public class StaticClient{
    private static String endpointAddress;
    public static void main(String [] args){
    if(args.length!=1){
    System.err.println("Usage : java HelloClient [endpoint address]");
    System.exit(-1);
    }
    endpointAddress=args[0];
    System.out.println("Connect to :"+endpointAddress);
    try{
    Stub stub=createStub();
    stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,
    endpointAddress);
    HelloIF hello=(HelloIF)stub;
    System.out.println(hello.sayHello(" Starchu!"));
    }catch(Exception e){System.err.println(e.toString());}
    }
    private static Stub createStub(){
    return (Stub)(new HelloService_Impl().getHelloIFPort());
    }
    }
    ·DynamicClient.java
    package dynamicproxy;
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.Service;
    import javax.xml.rpc.ServiceFactory;
    import javax.xml.rpc.JAXRPCException;
    import staticstub.HelloIF;

    public class DynamicClient{
    private static String wsdl;
    private static String namespaceUri="urn:Star:wsdl";
    private static String serviceName="HandlerService";
    private static String portName="HandlerTestPort";

    public static void main(String [] args){
    if(args.length!=1){
    System.err.println("Usage : java DynamicClient [server Url]");
    System.exit(-1);
    }
    System.out.println("Connect to :"+args[0]);
    helloWsdl=args[0]+"?WSDL";
    try{
    URL wsdlUrl=new URL(wsdl);
    ServiceFactory serviceFactory=ServiceFactory.newInstance();
    Service service=
    serviceFactory.createService(wsdlUrl,
    new QName(namespaceUri,serviceName));
    HandlerTest proxy=(HandlerTest)service.getPort(
    new QName(namespaceUri,portName),HandlerTest.class);
    proxy.test();
    }catch(Exception e){
    System.err.println(e.toString());
    }
    }
    }
    ·DIIClient.java
    package dii;
    import javax.xml.rpc.*;
    import javax.xml.namespace.*;

    public class DIIClient{
    private static String qnameService = "HelloService";
    private static String qnamePort = "HelloIF";
    private static String BODY_NAMESPACE_VALUE ="urn:Star";
    private static String ENCODING_STYLE_PROPERTY ="javax.xml.rpc.encodingstyle.namespace.uri";
    private static String NS_XSD ="http://www.w3.org/2001/XMLSchema";
    private static String URI_ENCODING ="http://schemas.xmlsoap.org/soap/encoding/";

    public static void main(String [] args){
    try{

    ServiceFactory factory=ServiceFactory.newInstance();
    Service service=factory.createService(new QName(qnameService));
    QName port=new QName(qnamePort);
    Call call=service.createCall(port);
    call.setTargetEndpointAddress(args[0]);
    call.setProperty(Call.SOAPACTION_USE_PROPERTY,new Boolean(true));
    call.setProperty(Call.SOAPACTION_URI_PROPERTY,"");
    call.setProperty(ENCODING_STYLE_PROPERTY,URI_ENCODING);
    QName qnameTypeString=new QName(NS_XSD,"string");
    call.setReturnType(qnameTypeString);
    call.setOperationName(new QName(BODY_NAMESPACE_VALUE,"sayHello"));
    call.addParameter("String_1",qnameTypeString,ParameterMode.IN);
    String [] params = { "Starchu" };
    System.out.println((String)call.invoke(params));
    }catch(Exception e){
    System.err.println(e.toString());
    }
    }
    }
    ·Ant文件build.xml
    <project name="helloWS" basedir="." default="deploy">
    <property file="build.properties"/>
    <property name="build" value="build"/>
    <property name="dist" value="${build}\classes"/>
    <property name="lib" value="${build}\lib"/>
    <property name="src" value="src"/>
    <property name="etc" value="${src}\etc"/>

    <target name="clean">
    <delete dir="${build}"/>
    </target>

    <target name="init">
    <mkdir dir="${build}"/>
    <mkdir dir="${dist}"/>
    <mkdir dir="${lib}"/>
    </target>

    <path id="classpath">
    <fileset dir="${tomcat.home}">
    <include name="jaxrpc/**/*.jar"/>
    <include name="jaxb/**/*.jar"/>
    <include name="jaxp/**/*.jar"/>
    <include name="saaj/**/*.jar"/>
    <include name="jwsdp-shared/lib/**/*.jar"/>
    </fileset>
    <pathelement path="${dist}"/>
    <pathelement location="${lib}"/>
    </path>

    <target name="compile-service" depends="init">
    <javac srcdir="${src}" destdir="${dist}" includes="HelloService/**/*.java"/>
    </target>

    <target name="generate-sei-service" depends="compile-service">
    <exec executable="wscompile.bat">
    <arg line="-define -d ${build} -nd ${build} -classpath ${dist} ${etc}\config-interface.xml -model ${build}\model.gz"/>
    </exec>
    <copy todir="${build}">
    <fileset dir="${etc}" includes="*.xml"/>
    </copy>
    </target>

    <target name="package-service" depends="generate-sei-service">
    <war warfile="${build}\${ant.project.name}-portable.war"
    webxml="${build}\web.xml">
    <webinf dir="${build}" includes="*.xml,*.gz,*.wsdl" excludes="web.xml"/>
    <classes dir="${dist}" includes="**/*.class" defaultexcludes="no"/>
    </war>
    </target>

    <target name="process-war" depends="package-service">
    <exec executable="wsdeploy.bat">
    <arg line="-o ${ant.project.name}.war ${build}\${ant.project.name}-portable.war"/>
    </exec>
    </target>

    <target name="deploy">
    <copy file="${ant.project.name}.war" todir="${server}"/>
    </target>

    <target name="undeploy">
    <delete file="${server}\${ant.project.name}.war"/>
    </target>

    <!-- Generating Static Client -->
    <target name="generate-stubs" depends="init">
    <exec executable="wscompile.bat">
    <arg line="-gen:client -d ${dist} -classpath ${dist} ${etc}\config-wsdl.xml"/>
    </exec>
    </target>

    <target name="compile-client" depends="generate-stubs">
    <javac srcdir="${src}" destdir="${dist}" includes="StaticStub/**/*.java">
    <classpath refid="classpath"/>
    </javac>
    </target>

    <target name="package-client" depends="compile-client">
    <jar destfile="${lib}\client.jar" basedir="${dist}" excludes="HelloService/**/*.class"/>
    </target>

    <target name="run-client" depends="package-client">
    <java classname="staticstub.HelloClient"
    classpathref="classpath"
    fork="true">
    <sysproperty key="endpoint" value="${endpoint}"/>
    <arg value="${server.port.url}"/>
    </java>
    </target>

    <!-- Generating Dynamic Client -->
    <target name="generate-interface" depends="init">
    <exec executable="wscompile.bat">
    <arg line="-import -d ${dist} -classpath ${dist} ${etc}\config-wsdl.xml"/>
    </exec>
    </target>

    <target name="compile-dynamic-client" depends="generate-interface">
    <javac srcdir="${src}" destdir="${dist}" includes="DynamicProxy/**/*.java">
    <classpath refid="classpath"/>
    </javac>
    </target>

    <target name="package-dynamic-client" depends="compile-dynamic-client">
    <jar destfile="${lib}\client.jar" basedir="${dist}" includes="**/HelloIF.class,**/DynamicClient.class"/>
    </target>

    <target name="run-dynamic-client" depends="package-dynamic-client">
    <java classname="dynamicproxy.DynamicClient"
    classpathref="classpath"
    fork="true">
    <sysproperty key="endpoint" value="${endpoint}"/>
    <arg value="${server.port.url}"/>
    </java>
    </target>

    <!-- Generating Dynamic Invocation Interface -->

    <target name="compile-dii">
    <javac srcdir="${src}" destdir="${dist}" includes="DII/**/*.java">
    <classpath refid="classpath"/>
    </javac>
    </target>

    <target name="run-dii" depends="compile-dii">
    <java classname="dii.DIIClient"
    classpathref="classpath"
    fork="true">
    <sysproperty key="endpoint" value="${endpoint}"/>
    <arg value="${server.port.url}"/>
    </java>
    </target>

    </project>
    ·屬性文件(build.xml文件使用)
    server=C:/Java/jwsdp-1.2/webapps
    tomcat.home=C:/Java/jwsdp-1.2
    endpoint=http://localhost:8080/helloWS/hello
    server.port.url=http://localhost:8080/helloWS/hello

    參考資料
    1. Developing Web Service Series <http://www.theserverside.com/resources/article.jsp?l=Systinet-web-services-part-1> www.theserverside.com
    2. JWSDP-1.2 Tutorial java.sun.com

    posted on 2007-05-18 15:24 鴻雁 閱讀(747) 評論(0)  編輯  收藏 所屬分類: IT技術相關

    主站蜘蛛池模板: 久久免费看少妇高潮V片特黄| 一级做a爰片久久免费| 人妻丰满熟妇无码区免费| 亚洲综合精品香蕉久久网| WWW国产成人免费观看视频| 亚洲AV无码一区二三区| 午夜成人无码福利免费视频| 亚洲AV中文无码乱人伦| 全部在线播放免费毛片| 亚洲综合久久夜AV | 二区久久国产乱子伦免费精品| 亚洲中文字幕无码久久综合网| 国产成人无码精品久久久免费 | 亚洲成a人片在线观看日本| 二个人看的www免费视频| 亚洲av无码国产精品色午夜字幕| 毛片在线播放免费观看| 亚洲国产美国国产综合一区二区| **一级毛片免费完整视| 自拍偷区亚洲国内自拍| 国产一级做a爱免费视频| 国产成人无码精品久久久久免费| 亚洲AV电影院在线观看| 在线观看AV片永久免费| 在线观看亚洲网站| 亚洲熟妇av一区二区三区 | 一级毛片大全免费播放下载| 亚洲综合日韩久久成人AV| 亚洲免费观看在线视频| 国产精品亚洲专区无码牛牛 | 亚洲另类自拍丝袜第1页| 妞干网免费观看视频| 夜夜爽妓女8888视频免费观看| 亚洲国产三级在线观看| 亚洲成在人线aⅴ免费毛片| 污视频网站在线免费看| 亚洲高清美女一区二区三区| 日本高清免费网站| 两个人看的www高清免费观看| 亚洲国产成a人v在线观看 | 亚洲国产一区在线|