欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
深入理解Tapestry的Rewind Tapestry
深入理解Tapestry的Rewind   作者:  tapestry
關(guān)鍵字:  tapestry rewind    

Tapestry的rewind一直是學(xué)習和使用Tapestry的難點(diǎn),rewind是用來(lái)處理表單提交的,表單默認使用的是DirectService來(lái)提交。在詳細介紹之前,先說(shuō)明下此文中需要用到的一些概念,首先是表單組件,我這里指的是指繼承自AbstractFormComponent類(lèi)的組件,例如:TextField、TextArea、Checkbox等,而不是具體的Form組件,表單組件使用時(shí)必須在Form組件中,這些組件在rewind時(shí)調用繼承自AbstractFormComponent的rewindFormComponent來(lái)讀取數據,并將數據賦值給容器或者頁(yè)面。
我們來(lái)看一下最簡(jiǎn)單的TextField組件,組件定義如下

代碼
  1. <input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="價(jià)格" class="input_text"/>  

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

可以看到在rewindFormComponent中,主要是從請求中取得用戶(hù)輸入的值,然后進(jìn)行處理,最后賦值給容器或者頁(yè)面,上面的例子中會(huì )調用頁(yè)面類(lèi)的getPicture().setPrice(“用戶(hù)輸入的值”)來(lái)進(jìn)行賦值。這樣整個(gè)表單的提交就可以理解為所有的表單組件讀取用戶(hù)輸入的值并賦值給頁(yè)面的過(guò)程。
整個(gè)表單提交的詳細處理過(guò)程如下:
    * initialize():頁(yè)面初始化
    * pageBeginRender() ("rewind"):getRequestCycle().isRewinding()為true
    * rewind of the form / setting of properties:所有表單組件調用rewindFormComponent來(lái)取值賦值
    * Deferred listeners (for Submit components):調用Submit組件的listener
    * Form‘s listener:調用Form組件的listener
    * pageEndRender() ("rewind"): getRequestCycle().isRewinding()為true
    * pageBeginRender() (normal): getRequestCycle().isRewinding()為false
    * pageEndRender() (normal): getRequestCycle().isRewinding()為false
我 們可以看到pageBeginRender和pageEndRender被調用了兩次,兩次中的區別為RequestCycle(). isRewinding,因為我們在使用時(shí)經(jīng)常利用pageBeginRender的初始化值,所以這里有很多使用上的誤區,如果在 pageBeginRender中從數據庫讀取數據來(lái)初始化跟表單提交無(wú)關(guān)的變量的話(huà),就可能被調用兩次,這個(gè)是應該避免的。什么叫跟表單提交無(wú)關(guān)的變量 呢,就是表單組件中跟賦值無(wú)關(guān)的,例如上邊提到的value="ognl:picture.price",這時(shí)picture就是與表單提交相關(guān)的變量, 如果你沒(méi)有初始化,那么在賦值時(shí)調用getPicture().setPrice()就會(huì )出現空指針異常,因為這是的picture為null。我們舉個(gè) 例子來(lái)看一下表單無(wú)關(guān)的變量,假如這個(gè)picture頁(yè)面會(huì )顯示一個(gè)創(chuàng )建picture的表單和所有picture的列表,那這個(gè)picture的列表就 是與表單提交無(wú)關(guān)的變量,如果你在pageBeginRender中初始化的話(huà),就需要區分是否rewind,否則表單提交時(shí)就會(huì )被初始化兩次,讓我們看 一下代碼:
代碼
  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并賦值在頁(yè)面顯示和rewind中都是需要的,因為頁(yè)面顯示時(shí),需要調用getPicture().getPrice (),頁(yè)面rewind時(shí),需要調用getPicture().setPrice(),這兩個(gè)階段中的picture都不能為null。但 setPictures會(huì )在表單提交時(shí)被調用兩次,在rewind階段初始化它是沒(méi)有用處的,所以這時(shí)就要對是否rewind進(jìn)行判斷。修改后的代碼如 下:
代碼
  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時(shí)對pictures進(jìn)行不必要的賦值。這里還要提到的一點(diǎn)是頁(yè)面顯示和提交后的頁(yè)面很可能不是同一個(gè)頁(yè)面類(lèi)的實(shí)例,大家都知 道頁(yè)面類(lèi)的實(shí)例是從實(shí)例池取到的,用戶(hù)打開(kāi)頁(yè)面顯示表單完后的頁(yè)面類(lèi)實(shí)例和用戶(hù)提交表單時(shí)的用來(lái)rewind的頁(yè)面類(lèi)實(shí)例不一定是同一個(gè),即使是一個(gè)實(shí) 例,也是被重新初始化過(guò)的,不要想當然的認為顯示表單后再提交那個(gè)實(shí)例應該保存原來(lái)顯示的東西,這個(gè)應該理清楚。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Tapestry的函數的執行順序
表現層框架Struts/Tapestry/JSF架構比較
Tapestry的介紹
表現層架構的功能和特點(diǎn)
JAVA Web框架比較
Spring MVC初探
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久