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

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

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

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評論-1047  文章-0  trackbacks-0

    在學習任何東西之前,最重要的是培養興趣,Groovy世界最耀眼的技術之一--Grails相信大家早已耳聞,我將通過Grails實戰系列文章向您展現Grails的迷人風采,使您感受到Grails的魅力,以至瘋狂地愛上Grails,并墜入Groovy的愛河。學Groovy,Grails與學Java一樣,在實戰之前需要搭建開發環境,您可以在 Groovy輕松入門--搭建Groovy開發環境 學習到如何搭建Groovy環境,之后我會講一下如何搭建Grails環境,然后手把手地寫個Demo程序告終,我還會抽空寫篇“Groovy輕松入門--Grails實戰之進階篇”

    一,搭建Grails環境
    0,下載Grails(?http://dist.codehaus.org/grails/grails-bin-1.0.zip,請留意朝花夕拾——Groovy & Grails中的“最新版本”提示)并解壓到自己指定位置(我的位置是D:\D\MY_DEV\grails)
    1,設置環境變量GRAILS_HOME(注意大寫),過程與“設置環境變量GROOVY_HOME”相似
    2,將%GRAILS_HOME%\bin添加到環境變量path中,過程與“將GROOVY_HOME目錄下的bin追加到環境變量path中”相似
    (如果只想進行Grails開發,可以不設GROOVY_HOME)

    二,創建Grails Demo程序
    3,打開“命令行”,選擇當前目錄(我的為D:\Temp\grails_apps),在黑底白字的窗口中輸入“grails create-app demo”,不包括雙引號“”,在您的屏幕中可以看到類似下面的輸出結果:

    D:\_DEV\grails_apps>grails create-app demo

    Welcome to Grails 1.0 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: D:\D\MY_DEV\grails-1.0

    Base Directory: D:\_DEV\grails_apps
    Environment set to development
    Note: No plugin scripts found
    Running script D:\D\MY_DEV\grails-1.0\scripts\CreateApp.groovy
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\src
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\src\java
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\src\groovy
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\controllers
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\services
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\domain
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\taglib
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\utils
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\views
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\views\layouts
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\i18n
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\conf
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\test
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\test\unit
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\test\integration
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\scripts
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\js
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\css
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\images
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\WEB-INF\classes
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\META-INF
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\lib
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\conf\spring
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\grails-app\conf\hibernate
    [propertyfile] Creating new property file: D:\_DEV\grails_apps\demo\application.properties
    ???? [copy] Copying 2 files to D:\_DEV\grails_apps\demo
    ???? [copy] Copying 2 files to D:\_DEV\grails_apps\demo\web-app\WEB-INF
    ???? [copy] Copying 5 files to D:\_DEV\grails_apps\demo\web-app\WEB-INF\tld
    ???? [copy] Copying 87 files to D:\_DEV\grails_apps\demo\web-app
    ???? [copy] Copying 17 files to D:\_DEV\grails_apps\demo\grails-app
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo
    [propertyfile] Updating property file: D:\_DEV\grails_apps\demo\application.properties
    Created Grails Application at D:\_DEV\grails_apps/demo
    D:\_DEV\grails_apps>

    通過“grails create-app”這個命令,Grails自動幫我們創建了開發所需的工程環境。其實您現在就已經擁有了一個可運行的Web應用程序,
    然后進入demo目錄(“cd demo”),輸入“grails run-app”,回車,啟動這個‘五臟俱全’的程序雛形,打開瀏覽器,輸入 http://localhost:8080/demo ,回車,看到了吧 :) 讓我們繼續吧,請停止這個程序(Ctrl + C)

    4,在“命令行”中輸入“cd demo”,回車,以進入demo目錄,然后再輸入“grails create-domain-class User”創建domain class即類似于pojo的pogo,它對應MVC中的Model,不過由Grails自動創建的pogo是空的,需要自己添加屬性,約束(constraints)等。輸出結果如下所示:

    D:\_DEV\grails_apps\demo>grails create-domain-class User

    Welcome to Grails 1.0 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: D:\D\MY_DEV\grails-1.0

    Base Directory: D:\_DEV\grails_apps\demo
    Environment set to development
    Note: No plugin scripts found
    Running script D:\D\MY_DEV\grails-1.0\scripts\CreateDomainClass.groovy
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo\grails-app\domain
    Created? for User
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo\test\integration
    Created Tests for User
    D:\_DEV\grails_apps\demo>

    5,進入D:\Temp\grails_apps\demo\grails-app\domain(這個目錄中存放著所有的domain class),打開User.groovy,修改為如下內容:
    class ?User?{?
    ????String?name
    ????String?password
    ????
    ????String?toString()?{
    ????????
    " $name?:?$password " ????
    ????}
    ????
    ????
    static ?constraints? = ?{
    ????????name(blank:?
    false )????
    ????????password(blank:?
    false ,?size:? 6 .. 16 )
    ????}
    }????
    contraints這個類變量是定義一些約束的,比如name不能為空白,password不能為空白而且長度在6到16之間(包括6和16)

    6,在“命令行”中輸入“grails generate-all User”,為User產生所有CRUD操作需要的代碼(如控制器UserController.groovy)和頁面(如list.gsp),輸出結果如下所示:
    D:\_DEV\grails_apps\demo>grails generate-all User

    Welcome to Grails 1.0 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: D:\D\MY_DEV\grails-1.0

    Base Directory: D:\_DEV\grails_apps\demo
    Environment set to development
    Note: No plugin scripts found
    Running script D:\D\MY_DEV\grails-1.0\scripts\GenerateAll.groovy
    ??? [mkdir] Created dir: D:\_DEV\grails_apps\demo\web-app\WEB-INF\lib
    ??? [mkdir] Created dir: C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\classes
    ? [groovyc] Compiling 7 source files to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\classes
    ??? [mkdir] Created dir: C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\resources\grails-app\i18n
    [native2ascii] Converting 10 files from D:\_DEV\grails_apps\demo\grails-app\i18n to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\re
    sources\grails-app\i18n
    ???? [copy] Copying 1 file to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\classes
    ???? [copy] Copying 1 file to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\resources
    ???? [copy] Copying 1 file to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo
    [0] spring.GrailsWebApplicationContext Refreshing org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@2b2057: display name [org
    .codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@2b2057]; startup date [Tue Feb 05 23:26:45 CST 2008]; root of context hierarch
    y
    [16] spring.GrailsWebApplicationContext Bean factory for application context [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationConte
    xt@2b2057]: org.springframework.beans.factory.support.DefaultListableBeanFactory@eebf17
    Generating views for domain class User ...
    Generating controller for domain class User ...
    Finished generation for domain class User
    D:\_DEV\grails_apps\demo>


    7,修改demo\grails-app\controllers\UserController.groovy的內容為:
    ????????????
    class?UserController?{

    ????def?loginService?
    //?新增的代碼
    ????
    ????def?index?
    =?{?redirect(action:list,params:params)?}

    ????
    //?the?delete,?save?and?update?actions?only?accept?POST?requests
    ????def?allowedMethods?=?[delete:'POST',?save:'POST',?update:'POST']

    ????def?list?
    =?{
    ????????
    if(!params.max)?params.max?=?10
    ????????[?userList:?User.list(?params?)?]
    ????}

    ????def?show?
    =?{
    ????????def?user?
    =?User.get(?params.id?)

    ????????
    if(!user)?{
    ????????????flash.message?
    =?"User?not?found?with?id?${params.id}"
    ????????????redirect(action:list)
    ????????}
    ????????
    else?{?return?[?user?:?user?]?}
    ????}

    ????def?delete?
    =?{
    ????????def?user?
    =?User.get(?params.id?)
    ????????
    if(user)?{
    ????????????user.delete()
    ????????????flash.message?
    =?"User?${params.id}?deleted"
    ????????????redirect(action:list)
    ????????}
    ????????
    else?{
    ????????????flash.message?
    =?"User?not?found?with?id?${params.id}"
    ????????????redirect(action:list)
    ????????}
    ????}

    ????def?edit?
    =?{
    ????????def?user?
    =?User.get(?params.id?)

    ????????
    if(!user)?{
    ????????????flash.message?
    =?"User?not?found?with?id?${params.id}"
    ????????????redirect(action:list)
    ????????}
    ????????
    else?{
    ????????????
    return?[?user?:?user?]
    ????????}
    ????}

    ????def?update?
    =?{
    ????????def?user?
    =?User.get(?params.id?)
    ????????
    if(user)?{
    ????????????user.properties?
    =?params
    ????????????
    if(!user.hasErrors()?&&?user.save())?{
    ????????????????flash.message?
    =?"User?${params.id}?updated"
    ????????????????redirect(action:show,id:user.id)
    ????????????}
    ????????????
    else?{
    ????????????????render(view:
    'edit',model:[user:user])
    ????????????}
    ????????}
    ????????
    else?{
    ????????????flash.message?
    =?"User?not?found?with?id?${params.id}"
    ????????????redirect(action:edit,id:params.id)
    ????????}
    ????}

    ????def?create?
    =?{
    ????????def?user?
    =?new?User()
    ????????user.properties?
    =?params
    ????????
    return?['user':user]
    ????}

    ????def?save?
    =?{
    ????????def?user?
    =?new?User(params)
    ????????
    if(!user.hasErrors()?&&?user.save())?{
    ????????????flash.message?
    =?"User?${user.id}?created"
    ????????????redirect(action:show,id:user.id)
    ????????}
    ????????
    else?{
    ????????????render(view:
    'create',model:[user:user])
    ????????}
    ????}

    ????
    //?新增的代碼
    ????def?login?=?{
    ????????
    if?(request.method?==?'POST')?{
    ????????????User?u?
    =?new?User()
    ????????????u.properties?
    =?params
    ????
    ????????????
    if?(!u.validate())?{
    ????????????????render(view:
    'login',?model:[user:u])
    ????????????}
    ????
    ????????????
    if?(params.name?&&?params.password)?{
    ????
    ????????????????def?user?
    =?loginService.check(u)
    ????????????????
    ????????????????
    if?(user)?{
    ??????????????????? flash.message?
    =?"Welcome?${user.name}"?
    ??????????????????? render(view:?
    "ok",?model:?[user:?user])
    ????????????????}?
    else?{
    ??????????????????? flash.error?
    =?"Invalid?${u.name}?with?${u.password}"
    ??????????????????? render(view:?
    "login",?model:?[user:?u])
    ????????????????}????
    ????????????}?
    else?{
    ????????????????render(view:?
    "login",?model:?[user:?u])
    ????????????}
    ????????}
    ????}
    }

    大家或許也看到了LoginService這個類,我將在后面演示創建它,這個LoginService類封裝了所有登陸相關的業務邏輯,Grails會自動將其注入到UserController中

    8,在“命令行”中,輸入“grails create-service Login”,創建LoginService.groovy,輸出:
    D:\_DEV\grails_apps\demo>grails create-service Login

    Welcome to Grails 1.0 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: D:\D\MY_DEV\grails-1.0

    Base Directory: D:\_DEV\grails_apps\demo
    Environment set to development
    Note: No plugin scripts found
    Running script D:\D\MY_DEV\grails-1.0\scripts\CreateService.groovy
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo\grails-app\services
    Created Service for Login
    ???? [copy] Copying 1 file to D:\_DEV\grails_apps\demo\test\integration
    Created ServiceTests for Login
    D:\_DEV\grails_apps\demo>

    9,修改demo\grails-app\services\LoginService.groovy的內容為:
    class?LoginService?{

    ????
    boolean?transactional?=?true

    ????def?check(User?u)?{
    ????????def?user?
    =?User.findWhere(name:?u.name,?password:?u.password)
    ????????
    return?user
    ????}

    }

    10,在demo\grails-app\views\user目錄下創建login.gsp和ok.gsp,它們對應MVC中的View,內容分別為:
    login.gsp (復制demo\grails-app\views\user\create.gsp的內容到login.gsp中,并修改):



    <html>
    ????
    <head>
    ????????
    <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"/>
    ????????
    <meta?name="layout"?content="main"?/>
    ????????
    <!--?將Create?User修改為Login?-->
    ????????
    <title>Login</title>?????????
    ????
    </head>
    ????
    <body>
    ????????
    <div?class="nav">
    ????????????
    <span?class="menuButton"><a?class="home"?href="${createLinkTo(dir:'')}">Home</a></span>
    ????????????
    <span?class="menuButton"><g:link?class="list"?action="list">User?List</g:link></span>
    ????????
    </div>
    ????????
    <div?class="body">
    ????????????
    <!--?將Create?User修改為Login?-->
    ????????????
    <h1>Login</h1>
    ????????????
    <!--?將flash.message修改為flash.error?-->
    ????????????
    <g:if?test="${flash.error}">
    ????????????
    <!--?將class="message"修改為class="errors",?將flash.message修改為flash.error?-->
    ????????????
    <div?class="errors">${flash.error}</div>
    ????????????
    </g:if>
    ????????????
    <g:hasErrors?bean="${user}">
    ????????????
    <div?class="errors">
    ????????????????
    <g:renderErrors?bean="${user}"?as="list"?/>
    ????????????
    </div>
    ????????????
    </g:hasErrors>
    ????????????
    ????????????
    <!--?將action="save"修改為action="login"?-->
    ????????????
    <g:form?action="login"?method="post"?>
    ????????????????
    <div?class="dialog">
    ????????????????????
    <table>
    ????????????????????????
    <tbody>
    ????????????????????????
    ????????????????????????????
    <tr?class="prop">
    ????????????????????????????????
    <td?valign="top"?class="name">
    ????????????????????????????????????
    <label?for="name">Name:</label>
    ????????????????????????????????
    </td>
    ????????????????????????????????
    <td?valign="top"?class="value?${hasErrors(bean:user,field:'name','errors')}">
    ????????????????????????????????????
    <input?type="text"?id="name"?name="name"?value="${fieldValue(bean:user,field:'name')}"/>
    ????????????????????????????????
    </td>
    ????????????????????????????
    </tr>?
    ????????????????????????
    ????????????????????????????
    <tr?class="prop">
    ????????????????????????????????
    <td?valign="top"?class="name">
    ????????????????????????????????????
    <label?for="password">Password:</label>
    ????????????????????????????????
    </td>
    ????????????????????????????????
    <td?valign="top"?class="value?${hasErrors(bean:user,field:'password','errors')}">
    ????????????????????????????????????
    <input?type="text"?maxlength="16"?id="password"?name="password"?value="${fieldValue(bean:user,field:'password')}"/>
    ????????????????????????????????
    </td>
    ????????????????????????????
    </tr>?
    ????????????????????????
    ????????????????????????
    </tbody>
    ????????????????????
    </table>
    ????????????????
    </div>
    ????????????????
    <div?class="buttons">
    ????????????????????
    <!--?將value="Create"修改為value="Login"?-->
    ????????????????????
    <span?class="button"><input?class="save"?type="submit"?value="Login"?/></span>
    ????????????????
    </div>
    ????????????
    </g:form>
    ????????
    </div>
    ????
    </body>
    </html>

    ok.gsp:

    <g:if?test="${flash.message}">
    ????
    <div?class="message">${flash.message}</div>
    </g:if>

    Name:?${user?.name}???
    <br>
    Password:?${user?.password}

    11,修改demo\grails-app\conf\BootStrap.groovy,初始化數據庫:將一個User實例保存到數據庫(grails自帶hsqldb和jetty)中,內容如下:
    class?BootStrap?{

    ?????def?init?
    =?{?servletContext?->
    ????????
    new?User(name:?"demo",?password:?"123456").save()
    ?????}

    ?????def?destroy?
    =?{
    ?????}
    }?

    12,在“命令行”中,輸入“grails run-app”,運行我們的Web應用,輸出如下:
    D:\_DEV\grails_apps\demo>grails run-app

    Welcome to Grails 1.0 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: D:\D\MY_DEV\grails-1.0

    Base Directory: D:\_DEV\grails_apps\demo
    Environment set to development
    Note: No plugin scripts found
    Running script D:\D\MY_DEV\grails-1.0\scripts\RunApp.groovy
    ? [groovyc] Compiling 4 source files to C:\Documents and Settings\Daniel\.grails\1.0\projects\demo\classes
    Running Grails application..
    2008-02-05 23:46:08.912::INFO:? Logging to STDERR via org.mortbay.log.StdErrLog
    2008-02-05 23:46:08.066::INFO:? jetty-6.1.4
    2008-02-05 23:46:08.347::INFO:? No Transaction manager found - if your webapp requires one, please configure one.
    2008-02-05 23:46:09.081:/demo:INFO:? Set web app root system property: 'demo' = [D:\_DEV\grails_apps\demo\web-app\]
    2008-02-05 23:46:09.081:/demo:INFO:? Initializing Log4J from [file:C:\Documents and Settings\Daniel/.grails/1.0/projects/demo/resources/log4j.pro
    perties]
    2008-02-05 23:46:09.113:/demo:INFO:? Initializing Spring root WebApplicationContext
    [0] spring.GrailsWebApplicationContext Refreshing org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@5facbd: display name [org
    .codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@5facbd]; startup date [Tue Feb 05 23:46:14 CST 2008]; parent: org.springframew
    ork.web.context.support.XmlWebApplicationContext@1fef80a
    [0] spring.GrailsWebApplicationContext Bean factory for application context [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContex
    t@5facbd]: org.springframework.beans.factory.support.DefaultListableBeanFactory@aa4c7c
    2008-02-05 23:46:21.590:/demo:INFO:? Initializing Spring FrameworkServlet 'grails'
    2008-02-05 23:46:21.871::INFO:? Started SelectChannelConnector@0.0.0.0:8080
    Server running. Browse to http://localhost:8080/demo

    ?
    13,打開瀏覽器,輸入:http://localhost:8080/demo/user/login?,在Name處輸入demo,Password處輸入123456,點擊‘Login’,跳轉到成功頁面:
    Welcome demo
    Name: demo
    Password: 123456

    如果您對Grails的工程目錄不太熟悉,我這里為大家提供了一張表,詳細地描述了各目錄的用途:

    《Grails權威指南》3-1.Grails工程目錄

    目錄名稱

    相關描述

    grails-app

    此目錄包含了Grails應用程序的核心工件(core artifact)

    + conf

    此目錄包含了諸如DevelopmentDataSource.groovy的配置文件

    + controllers

    此目錄包含了處理請求(request)的控制器(controller)Grails控制器將在第7章中進行講解

    + domain

    此目錄包含了領域模型(domain model),領域模型將在第4章進行講解

    + i18n

    此目錄包含了用于國際化的消息束(message bundle)(譯者注:指的是properties文件,如messages.properties

    + services

    此目錄包含了封裝業務邏輯的service文件,service將在第10章中進行講解

    + taglib

    此目錄包含了輔助頁面生成的動態標簽庫,動態標簽將在第8章中進行講解

    + views

    此目錄包含了Groovy服務器頁面(GSP)以及JSP頁面

    + layouts

    此目錄包含了GSPJSP的布局(layout),這些布局由SiteMesh提供支持,這將在第8章中進行講解

    grails-test

    此目錄包含了應用程序的單元測試

    hibernate

    此目錄包含了可選的Hibernate配置文件,這將在第11章中進行講解

    lib

    此目錄包含了jar文件

    spring

    此目錄包含了可選的Spring配置文件,這將在第11章中進行講解

    src

    此目錄包含了其他GroovyJava資源

    + java

    此目錄包含了待編譯的Java源文件

    + groovy

    此目錄包含了待編譯的Groovy源文件

    web-app

    此目錄包含了Web應用程序的資源(CSSJavaScript等)


    注:Grails1.0已將hibernate和spring兩個目錄移到grails-app\conf目錄下了,
    而grails-test目錄也更名為test,test目錄下有integration目錄和unit目錄,分別存放集成測試代碼和單元測試代碼


    想象一下用您平時做項目時所用的框架組合(比如SSH)來創建同樣的Web應用程序,您立刻會感受,Grails讓我們專注于業務邏輯,而不用浪費時間在那些scaffolding code(如配置文件)上。從今天開始,您不用再羨慕那些Ruby程序員所用的RoR了,您大可以使用Grails來高效開發Web應用。

    您也可以訪問Grails官方網站(http://www.grails.org)進一步學習。

    附:朝花夕拾——Groovy & Grails
    posted on 2007-03-21 00:49 山風小子 閱讀(19542) 評論(31)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 亚洲Av无码精品色午夜| 中文字幕不卡亚洲| 亚洲无砖砖区免费| 国产精品免费观看| 亚洲卡一卡2卡三卡4麻豆| 无码国产精品一区二区免费| 亚洲人成在线播放| 天堂在线免费观看中文版| 亚洲av成人中文无码专区| 免费人成无码大片在线观看| 成年大片免费视频播放一级| 国产亚洲精aa成人网站| a级毛片毛片免费观看久潮| 久久久久亚洲AV无码专区首| 91精品导航在线网址免费| 亚洲另类古典武侠| 国产一区二区三区免费视频| 成人a毛片免费视频观看| 亚洲AV永久青草无码精品| 国产精彩免费视频| 国产精品亚洲专区无码牛牛| 日韩亚洲变态另类中文| 久久久免费的精品| 亚洲国产一区在线观看| jjzz亚洲亚洲女人| 国内精品久久久久影院免费| 国产成人精品日本亚洲网址| 免费乱码中文字幕网站| 久久久久久免费一区二区三区| 亚洲国产成a人v在线| 免费一级毛片一级毛片aa| 日韩免费在线观看视频| 456亚洲人成影院在线观| 爱情岛论坛网亚洲品质自拍| 99久久精品免费视频| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲熟女一区二区三区| 亚洲免费闲人蜜桃| 免费在线观看一区| 亚洲人成电影院在线观看| 亚洲日本韩国在线|