<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
    Ajax雖是“舊酒裝新瓶”,但其威力著實不小。近兩年來可謂紅透半邊天,它之所以能為大眾接受,其中一個很大的原因就是提高了用戶瀏覽體驗,能更逼真的模擬出GUI界面。好了,Ajax的益處就說到這里,下面讓我們看下Grails是如何幫助我們方便地應用Ajax的:

    如果您對下面說設計的內容有點不解,那么您可以先看一下
    Groovy輕松入門——Grails實戰基礎篇,然后開始我們的Ajax之旅。

    1, 在命令行中輸入:“grails create-app AjaxDemo”(注意:不帶引號“”)創建一個Grails project,我將它命名為AjaxDemo:

    D:\Temp\grails_apps>grails?create-app?AjaxDemo

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

    Base?Directory:?D:\Temp\grails_apps
    Environment?set?to?production
    Note:?No?plugin?scripts?found
    Running?script?D:\D\MY_DEV\grails-0.5\scripts\CreateApp.groovy
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\src
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\src\java
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\src\groovy
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\src\test
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\controllers
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\jobs
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\services
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\domain
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\taglib
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\utils
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\views
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\views\layouts
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\i18n
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-app\conf
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\grails-tests
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\scripts
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\js
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\css
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\images
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\classes
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\META-INF
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\lib
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\spring
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\hibernate
    [propertyfile]?Creating?new?property?file:?D:\Temp\grails_apps\AjaxDemo\application.properties
    ?????[copy]?Copying?2?files?to?D:\Temp\grails_apps\AjaxDemo
    ?????[copy]?Copying?2?files?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF
    ?????[copy]?Copying?5?files?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\tld
    ?????[copy]?Copying?119?files?to?D:\Temp\grails_apps\AjaxDemo\web-app
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-app\conf
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-app\conf
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-app\conf
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-app\conf
    ?????[copy]?Copying?13?files?to?D:\Temp\grails_apps\AjaxDemo\grails-app
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\plugins\core\grails-app\taglib
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\plugins\core\grails-app\utils
    ?????[copy]?Copying?7?files?to?D:\Temp\grails_apps\AjaxDemo\plugins\core\grails-app\taglib
    ?????[copy]?Copying?4?files?to?D:\Temp\grails_apps\AjaxDemo\plugins\core\grails-app\utils
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\spring
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo
    [propertyfile]?Updating?property?file:?D:\Temp\grails_apps\AjaxDemo\application.properties
    Created?Grails?Application?at?D:\Temp\grails_apps/AjaxDemo
    D:\Temp\grails_apps>


    2,“cd AjaxDemo”,進入AjaxDemo目錄,輸入“grails create-domain-class User”,創建一個域類User:
    D:\Temp\grails_apps\AjaxDemo>grails?create-domain-class?User

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

    Base?Directory:?D:\Temp\grails_apps\AjaxDemo
    Environment?set?to?production
    Running?script?D:\D\MY_DEV\grails-0.5\scripts\CreateDomainClass.groovy
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-app\domain
    Created??for?User
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\grails-tests
    Created?Tests?for?User
    D:\Temp\grails_apps\AjaxDemo>

    3,“grails generate-all User”,生成scaffolding code(如:list.gsp等):
    D:\Temp\grails_apps\AjaxDemo>grails?generate-all?User

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

    Base?Directory:?D:\Temp\grails_apps\AjaxDemo
    Environment?set?to?production
    Running?script?D:\D\MY_DEV\grails-0.5\scripts\GenerateAll.groovy
    Compiling?sources?
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\lib
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\spring
    ?????[copy]?Copying?34?files?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\lib
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\grails-app\i18n
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\grails-app\views
    ?????[copy]?Copying?2?files?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\grails-app\views
    ????[mkdir]?Created?dir:?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\templates\scaffolding
    ?????[copy]?Copying?5?files?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\templates\scaffolding
    [native2ascii]?Converting?7?files?from?D:\Temp\grails_apps\AjaxDemo\grails-app\i18n?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\grails-app\i1
    8n
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\spring
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\classes
    ?????[copy]?Copying?1?file?to?D:\Temp\grails_apps\AjaxDemo\web-app\WEB-INF\classes
    Generating?views?for?domain?class?[User]
    Generating?list?view?for?domain?class?[User]
    list?view?generated?at?D:\Temp\grails_apps\AjaxDemo\.\grails-app\views\user\list.gsp
    Generating?show?view?for?domain?class?[User]
    Show?view?generated?at?D:\Temp\grails_apps\AjaxDemo\.\grails-app\views\user\show.gsp
    Generating?edit?view?for?domain?class?[User]
    Edit?view?generated?at?D:\Temp\grails_apps\AjaxDemo\.\grails-app\views\user\edit.gsp
    Generating?create?view?for?domain?class?[User]
    Create?view?generated?at?D:\Temp\grails_apps\AjaxDemo\.\grails-app\views\user\create.gsp
    Generating?controller?for?domain?class?[User]
    Controller?generated?at?.\grails-app\controllers\UserController.groovy
    D:\Temp\grails_apps\AjaxDemo>

    4,修改AjaxDemo\grails-app\controllers\UserController.groovy的內容為:
    ????????????
    class ?UserController?{
    ????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?
    = ?{
    ????????[?user?:?User.get(?params.id?)?]
    ????}

    ????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.save())?{
    ????????????????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()
    ????????user.properties?
    = ?params
    ????????
    if (user.save())?{
    ????????????redirect(action:show,id:user.id)
    ????????}
    ????????
    else ?{
    ????????????render(view:
    ' create ' ,model:[user:user])
    ????????}
    ????}

    ????
    // ?自己添加的Closure?ajax定義
    ????def?ajax? = ?{}
    ????
    ????
    // ?自己添加的Closure?sayHello定義
    ????def?sayHello? = ?{
    ????????render?
    " [${new?Date()}]?Hello,?${params.name} "
    ????}

    }
    添加sayHello閉包的目的很明顯,因為客戶端需要調用。那為什么還要添加ajax這個閉包呢?其實添加 ajax 這個閉包的目的是使http://localhost:8080/AjaxDemo/user/ ajax 這個請求合法化,否則會發生404錯誤,找不到頁面:

    HTTP ERROR: 404

    Not Found

    RequestURI=/AjaxDemo/user/ajax

    Powered by Jetty://


    所以被客戶端請求的 每個 gsp頁面,都需要在相應的Controller中添加以gsp文件名為變量名的Closure,如上面的ajax.gsp和ajax = {}所示,其中Closure中可以添加相關代碼,我們這里僅僅是做Ajax的演示,所以就不需要代碼



    5,在AjaxDemo\grails-app\views\user目錄下,新建ajax.gsp,用來演示remoteLink的用法,內容為:

    < g:javascript? library ="prototype" ? />


    < div? id ="hello" > Content?will?be?displayed?here </ div >

    < g:remoteLink? action ="sayHello" ?params ="[name:'BlueSUN']" ?update ="hello" >Say Hello </ g:remoteLink >
    params表示要傳遞的參數,而update表示返回結果顯示的地方,注意update="hello"中的hello對應于div的id,表示結果將顯示于div所在處。

    點擊鏈接后的界面:
    [Fri May 11 17:46:47 CST 2007] Hello, BlueSUN
    Say Hello

    6,修改AjaxDemo\grails-app\views\user\ ajax.gsp,演示formRemote的用法,內容為:
    <g:javascript?library="prototype"?/>


    <div?id="hello">Content?will?be?displayed?here</div>
    <div?id="error"></div>

    <g:remoteLink?action="sayHello"?params="[name:'BlueSUN']"?update="hello">Say?Hello</g:remoteLink>

    <hr?/>

    <g:formRemote?name="test"?url="[controller:'user',action:'sayHello']"?update="[success:'hello',failure:'error']">
    ????
    <input?type="text"?name="name"?value="BlueSUN"?/>
    ????
    <input?type="submit"?value="Say?Hello"?/>
    </g:formRemote?>
    原本用params傳遞的參數,現在可以以form的形式傳遞了,將想傳遞的內容輸入name的textfield中即可。

    默認值我設為BlueSUN,現在我將值改為terry,點擊Say Hello按鈕,結果如下:
    [Fri May 11 18:16:17 CST 2007] Hello, terry
    Say Hello


    7,修改AjaxDemo\grails-app\views\user\
    ajax.gsp和AjaxDemo\grails-app\controllers\UserController.groovy,演示remoteField的用法:
    ajax.gsp:
    <g:javascript?library="prototype"?/>


    <div?id="hello">Content?will?be?displayed?here</div>
    <div?id="error"></div>

    <g:remoteLink?action="sayHello"?params="[name:'BlueSUN']"?update="hello">Say?Hello</g:remoteLink>

    <hr?/>

    <g:formRemote?name="test"?url="[controller:'user',action:'sayHello']"?update="[success:'hello',failure:'error']">
    ????
    <input?type="text"?name="name"?value="BlueSUN"?/>
    ????
    <input?type="submit"?value="Say?Hello"?/>
    </g:formRemote?>

    <hr?/>

    <g:remoteField?action="sayHello2"?update="hello"??name="name"?value=""?/>

    UserController.groovy:
    ????????????
    class?UserController?{
    ????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?
    =?{
    ????????[?user?:?User.get(?params.id?)?]
    ????}

    ????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.save())?{
    ????????????????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()
    ????????user.properties?
    =?params
    ????????
    if(user.save())?{
    ????????????redirect(action:show,id:user.id)
    ????????}
    ????????
    else?{
    ????????????render(view:
    'create',model:[user:user])
    ????????}
    ????}

    ????
    //?自己添加的Closure?ajax定義
    ????def?ajax?=?{}
    ????
    ????
    //?自己添加的Closure?sayHello定義
    ????def?sayHello?=?{
    ????????render?
    "[${new?Date()}]?Hello,?${params.name}"
    ????}
    ????
    ????
    //?自己添加的Closure?sayHello2定義
    ????def?sayHello2?=?{
    ????????render?
    "[${new?Date()}]?Hello,?${params.value}"
    ????}

    }
    由于
    用remoteField傳遞過來的參數名為value,又為了保留以前的演示,所以再定義一個sayHello2閉包,注意是params.value而非params.name


    輸入“BlueSUN”
    ,請注意輸入時頁面的相應更新效果,結果界面:
    輸入到一半,即輸入“Blue”
    [Fri May 11 18:34:03 CST 2007] Hello, Blue
    Say Hello



    緊接著輸入“SUN”
    [Fri May 11 18:32:42 CST 2007] Hello, BlueSUN
    Say Hello



    8,修改AjaxDemo\grails-app\views\user\ ajax.gsp,演示remoteFunction的用法,內容為:
    <g:javascript?library="prototype"?/>


    <div?id="hello">Content?will?be?displayed?here</div>
    <div?id="error"></div>

    <g:remoteLink?action="sayHello"?params="[name:'BlueSUN']"?update="hello">Say?Hello</g:remoteLink>

    <hr?/>

    <g:formRemote?name="test"?url="[controller:'user',action:'sayHello']"?update="[success:'hello',failure:'error']">
    ????
    <input?type="text"?name="name"?value="BlueSUN"?/>
    ????
    <input?type="submit"?value="Say?Hello"?/>
    </g:formRemote?>

    <hr?/>

    <g:remoteField?action="sayHello2"?update="hello"??name="name"?value=""?/>

    <hr?/>

    <button?onClick="${remoteFunction(action:'sayHello',update:[success:'hello',?failure:'error'],?params:'\'name=\'?+?\'BlueSUN\'')}">Say?Hello</button>

    點擊Say Hello按鈕后,結果頁面:
    [Fri May 11 18:48:37 CST 2007] Hello, BlueSUN
    Say Hello






    9,Grails也可以利用Ajax異步顯示Server端返回的頁面,新建頁面AjaxDemo\grails-app\views\user\result.gsp:
    < html >
    ????
    < head >
    ?????????
    < meta? http-equiv ="Content-Type" ?content ="text/html;?charset=UTF-8" />
    ?????????
    < meta? name ="layout" ?content ="main" ? />
    ?????????
    < title > Result?Page </ title >
    ????
    </ head >
    ????
    < body >
    ????????
    < div? class ="nav" >
    ????????????
    < span? class ="menuButton" >< a? href ="${createLinkTo(dir:'')}" > Home </ a ></ span >
    ????????
    </ div >
    ????????
    < div? class ="body" >
    ???????????
    < h1 > ${name} </ h1 >
    ????????
    </ div >
    ????
    </ body >
    </ html >

    修改AjaxDemo\grails-app\controllers\UserController.groovy:
    ????????????
    class ?UserController?{
    ????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?
    = ?{
    ????????[?user?:?User.get(?params.id?)?]
    ????}

    ????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.save())?{
    ????????????????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()
    ????????user.properties?
    = ?params
    ????????
    if (user.save())?{
    ????????????redirect(action:show,id:user.id)
    ????????}
    ????????
    else ?{
    ????????????render(view:
    ' create ' ,model:[user:user])
    ????????}
    ????}

    ????
    // ?自己添加的Closure?ajax定義
    ????def?ajax? = ?{}
    ????
    ????
    // ?自己添加的Closure?sayHello定義
    ????def?sayHello? = ?{
    ????????render?
    " [${new?Date()}]?Hello,?${params.name} "
    ????}
    ????
    ????
    // ?自己添加的Closure?sayHello2定義
    ????def?sayHello2? = ?{
    ????????render?
    " [${new?Date()}]?Hello,?${params.value} "
    ????}
    ????
    // ?自己添加的Closure?displayResultPage定義
    ????def?displayResultPage? = ?{
    ????????render(view:
    ' result ' ,?model:[name:params.name])
    ????}
    }

    修改AjaxDemo\grails-app\views\user\ajax.gsp:
    < g:javascript? library ="prototype" ? />


    < div? id ="hello" > Content?will?be?displayed?here </ div >
    < div? id ="error" ></ div >

    < g:remoteLink? action ="sayHello" ?params ="[name:'BlueSUN']" ?update ="hello" > Say?Hello </ g:remoteLink >

    < hr? />

    < g:formRemote? name ="test" ?url ="[controller:'user',action:'sayHello']" ?update ="[success:'hello',failure:'error']" >
    ????
    < input? type ="text" ?name ="name" ?value ="BlueSUN" ? />
    ????
    < input? type ="submit" ?value ="Say?Hello" ? />
    </ g:formRemote? >

    < hr? />

    < g:remoteField? action ="sayHello2" ?update ="hello" ??name ="name" ?value ="" ? />

    < hr? />

    < button? onClick ="${remoteFunction(action:'sayHello',update:[success:'hello',?failure:'error'],?params:'\'name=\'?+?\'BlueSUN\'')}" > Say?Hello </ button >

    < hr? />

    < g:formRemote? name ="test" ?url ="[controller:'user',action:'displayResultPage']" ?update ="[success:'hello',failure:'error']" >
    ????
    < input? type ="text" ?name ="name" ?value ="BlueSUN" ? />
    ????
    < input? type ="submit" ?value ="Say?Hello" ? />
    </ g:formRemote? >

    輸入“terry”,點擊Say Hello按鈕,結果頁面(樣式的丟失是因為在ajax.gsp中沒有聲明css,目的是抓重點,拋開一切瑣碎的內容):



    最后要提醒大家一點,如果要使用中文,請將中文寫在AjaxDemo\grails-app\i18n\messages_zh_CN.properties中,然后用<g:message code="key" />來顯示。


    正如各位所看到的那樣,在Grails中使用Ajax就是那么簡單,此外DWR插件即將出爐,到時利用DWR來開發Ajax應用也將變的十分方便 :)

    如果您急需使用DWR,請參考《 Groovy輕松入門——Grails實戰之遺留框架利用篇

    附:朝花夕拾——Groovy & Grails
    posted on 2007-05-11 19:24 山風小子 閱讀(8504) 評論(9)  編輯  收藏 所屬分類: Groovy & GrailsAjax
    主站蜘蛛池模板: 久久青草亚洲AV无码麻豆| 成人免费一区二区三区| 午夜无码A级毛片免费视频 | 亚洲精品无码久久久久秋霞| 久久久久久免费视频| 亚洲精品伊人久久久久| 成年午夜视频免费观看视频 | 91在线亚洲精品专区| 91精品免费观看| 亚洲日本久久一区二区va| www.999精品视频观看免费| 亚洲中文字幕一区精品自拍| 免费无码又爽又刺激毛片| 美女视频黄.免费网址| 亚洲伊人成无码综合网 | 亚洲va在线va天堂va不卡下载| 久久狠狠躁免费观看2020| 亚洲成年人免费网站| 午夜电影免费观看| 一级中文字幕免费乱码专区| 亚洲国产精品无码久久一区二区 | 污视频在线观看免费| 亚洲人成影院午夜网站| 麻豆成人精品国产免费| 国产精品99爱免费视频| 亚洲?V乱码久久精品蜜桃| av电影在线免费看| 亚洲天堂久久精品| 粉色视频免费入口| 亚洲精品无码不卡在线播HE| 亚洲免费观看网站| 亚洲gv猛男gv无码男同短文| 五月亭亭免费高清在线| 美女被免费视频网站| 亚洲日本在线观看| 日韩免费无砖专区2020狼| 两个人的视频www免费| 亚洲激情视频图片| 最新国产AV无码专区亚洲| 一个人看www在线高清免费看| 免费福利在线观看|