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

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

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

    Tapestry的rewind一直是學(xué)習(xí)和使用Tapestry的難點(diǎn),rewind是用來處理表單提交的,表單默認(rèn)使用的是DirectService來提交。在詳細(xì)介紹之前,先說明下此文中需要用到的一些概念,首先是表單組件,我這里指的是指繼承自AbstractFormComponent類的組件,例如:TextField、TextArea、Checkbox等,而不是具體的Form組件,表單組件使用時必須在Form組件中,這些組件在rewind時調(diào)用繼承自AbstractFormComponent的rewindFormComponent來讀取數(shù)據(jù),并將數(shù)據(jù)賦值給容器或者頁面。
    我們來看一下最簡單的TextField組件,組件定義如下
    Java代碼 復(fù)制代碼
    1. <input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="價格" class="input_text"/>  

    再看一下TextField中的rewindFormComponent組件方法
    Java代碼 復(fù)制代碼
    1. protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {   
    2.        //從請求中得到參數(shù)值   
    3.         String value = cycle.getParameter(getName());   
    4.   
    5.         try {   
    6.              //用translator來轉(zhuǎn)換值   
    7.             Object object = getTranslatedFieldSupport().parse(this, value);   
    8. //用validators來驗(yàn)證值   
    9.             getValidatableFieldSupport().validate(this, writer, cycle, object);   
    10.             //賦值給容器或者頁面   
    11.             setValue(object);   
    12.         } catch (ValidatorException e) {   
    13.             getForm().getDelegate().record(e);   
    14.         }   
    15.     }  

    可以看到在rewindFormComponent中,主要是從請求中取得用戶輸入的值,然后進(jìn)行處理,最后賦值給容器或者頁面,上面的例子中會調(diào)用頁面類的getPicture().setPrice(“用戶輸入的值”)來進(jìn)行賦值。這樣整個表單的提交就可以理解為所有的表單組件讀取用戶輸入的值并賦值給頁面的過程。
    整個表單提交的詳細(xì)處理過程如下:
      * initialize():頁面初始化
      * pageBeginRender() ("rewind"):getRequestCycle().isRewinding()為true
      * rewind of the form / setting of properties:所有表單組件調(diào)用rewindFormComponent來取值賦值
      * Deferred listeners (for Submit components):調(diào)用Submit組件的listener
      * Form's listener:調(diào)用Form組件的listener
      * pageEndRender() ("rewind"): getRequestCycle().isRewinding()為true
      * pageBeginRender() (normal): getRequestCycle().isRewinding()為false
      * pageEndRender() (normal): getRequestCycle().isRewinding()為false
    我們可以看到pageBeginRender和pageEndRender被調(diào)用了兩次,兩次中的區(qū)別為RequestCycle().isRewinding,因?yàn)槲覀冊谑褂脮r經(jīng)常利用pageBeginRender的初始化值,所以這里有很多使用上的誤區(qū),如果在pageBeginRender中從數(shù)據(jù)庫讀取數(shù)據(jù)來初始化跟表單提交無關(guān)的變量的話,就可能被調(diào)用兩次,這個是應(yīng)該避免的。什么叫跟表單提交無關(guān)的變量呢,就是表單組件中跟賦值無關(guān)的,例如上邊提到的value="ognl:picture.price",這時picture就是與表單提交相關(guān)的變量,如果你沒有初始化,那么在賦值時調(diào)用getPicture().setPrice()就會出現(xiàn)空指針異常,因?yàn)檫@是的picture為null。我們舉個例子來看一下表單無關(guān)的變量,假如這個picture頁面會顯示一個創(chuàng)建picture的表單和所有picture的列表,那這個picture的列表就是與表單提交無關(guān)的變量,如果你在pageBeginRender中初始化的話,就需要區(qū)分是否rewind,否則表單提交時就會被初始化兩次,讓我們看一下代碼:
    Java代碼 復(fù)制代碼
    1. public abstract void setPictures(List<Picture> pictures);   
    2. public abstract void setPictureInList();//用于For中的value   
    3. public abstract void setPicture(Picture picture);//用于表單創(chuàng)建   
    4. public abstract Picture getPicture();   
    5. public void pageBeginRender(PageEvent event) {   
    6. if(getPicture()==null){   
    7. setPicture(new Picture());   
    8. }   
    9. setPictures(getPictureService().findAll());   
    10. }  
    判斷picture是否為null并賦值在頁面顯示和rewind中都是需要的,因?yàn)轫撁骘@示時,需要調(diào)用getPicture().getPrice(),頁面rewind時,需要調(diào)用getPicture().setPrice(),這兩個階段中的picture都不能為null。但setPictures會在表單提交時被調(diào)用兩次,在rewind階段初始化它是沒有用處的,所以這時就要對是否rewind進(jìn)行判斷。修改后的代碼如下:
    Java代碼 復(fù)制代碼
    1. public void pageBeginRender(PageEvent event) {   
    2. if(getPicture()==null){   
    3. setPicture(new Picture());   
    4. }   
    5. if (!event.getRequestCycle().isRewinding()) {   
    6. setPictures(getPictureService().findAll());   
    7. }   
    8. }  
    這樣就可以避免在rewind時對pictures進(jìn)行不必要的賦值。這里還要提到的一點(diǎn)是頁面顯示和提交后的頁面很可能不是同一個頁面類的實(shí)例,大家都知道頁面類的實(shí)例是從實(shí)例池取到的,用戶打開頁面顯示表單完后的頁面類實(shí)例和用戶提交表單時的用來rewind的頁面類實(shí)例不一定是同一個,即使是一個實(shí)例,也是被重新初始化過的,不要想當(dāng)然的認(rèn)為顯示表單后再提交那個實(shí)例應(yīng)該保存原來顯示的東西,這個應(yīng)該理清楚。

    原文地址:http://www.javaeye.com/article/41724
    posted on 2008-03-08 16:03 LifeNote 閱讀(688) 評論(0)  編輯  收藏 所屬分類: HibernateSpringTapestryJavascript
     
    主站蜘蛛池模板: 久久精品国产亚洲AV电影| 亚洲av中文无码乱人伦在线咪咕| 久久精品国产亚洲AV忘忧草18| 免费一区二区三区| 久久久久亚洲Av无码专| 一级毛片免费观看不卡视频| 久久久久亚洲av无码专区| 亚洲视频在线免费播放| 亚洲人成网站在线观看播放青青| 91成人免费观看网站| 亚洲色偷偷偷综合网| 国产免费爽爽视频免费可以看| 边摸边脱吃奶边高潮视频免费| 免费人成无码大片在线观看| 在线视频免费国产成人| 国产成人va亚洲电影| 色久悠悠婷婷综合在线亚洲| 久操视频在线免费观看| 亚洲无砖砖区免费| 国产精品酒店视频免费看| 国产成人无码精品久久久免费| 国产亚洲一区二区三区在线| 99免费在线观看视频| 亚洲人成www在线播放| 亚洲第一区精品日韩在线播放| 中文在线观看国语高清免费| 亚洲精品永久www忘忧草| 女人18毛片水最多免费观看 | 国产精品美女自在线观看免费 | 亚洲夂夂婷婷色拍WW47| 免费A级毛片无码久久版| 免费人成黄页在线观看日本| 亚洲一区二区三区在线观看网站| 亚洲精品无码日韩国产不卡?V| 男人都懂www深夜免费网站| 亚洲综合色丁香婷婷六月图片| 亚洲精品无码专区久久同性男| 99久久人妻精品免费二区| 日韩亚洲翔田千里在线| 亚洲毛片在线观看| 免费少妇a级毛片人成网|