Tapestry的rewind一直是學(xué)習(xí)和使用Tapestry的難點(diǎn),rewind是用來(lái)處理表單提交的,表單默認(rèn)使用的是
DirectService來(lái)提交。在詳細(xì)介紹之前,先說(shuō)明下此文中需要用到的一些概念,首先是表單組件,我這里指的是指繼承自
AbstractFormComponent類(lèi)的組件,例如:TextField、TextArea、Checkbox等,而不是具體的Form組件,表
單組件使用時(shí)必須在Form組件中,這些組件在rewind時(shí)調(diào)用繼承自AbstractFormComponent的
rewindFormComponent來(lái)讀取數(shù)據(jù),并將數(shù)據(jù)賦值給容器或者頁(yè)面。
我們來(lái)看一下最簡(jiǎn)單的TextField組件,組件定義如下
代碼
- <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組件方法
代碼
- protected?void?rewindFormComponent(IMarkupWriter?writer,?IRequestCycle?cycle)?{??
- ???????//從請(qǐng)求中得到參數(shù)值??
- ????????String?value?=?cycle.getParameter(getName());??
- ??
- ????????try?{??
- ?????????????//用translator來(lái)轉(zhuǎn)換值??
- ????????????Object?object?=?getTranslatedFieldSupport().parse(this,?value);??
- //用validators來(lái)驗(yàn)證值??
- ????????????getValidatableFieldSupport().validate(this,?writer,?cycle,?object);??
- ????????????//賦值給容器或者頁(yè)面??
- ????????????setValue(object);??
- ????????}?catch?(ValidatorException?e)?{??
- ????????????getForm().getDelegate().record(e);??
- ????????}??
- ????}??
可以看到在rewindFormComponent中,主要是從請(qǐng)求中取得用戶(hù)輸入的值,然后進(jìn)行處理,最后賦值給容器或者頁(yè)面,上面的例子中會(huì) 調(diào)用頁(yè)面類(lèi)的getPicture().setPrice(“用戶(hù)輸入的值”)來(lái)進(jìn)行賦值。這樣整個(gè)表單的提交就可以理解為所有的表單組件讀取用戶(hù)輸入的 值并賦值給頁(yè)面的過(guò)程。
整個(gè)表單提交的詳細(xì)處理過(guò)程如下:
- * initialize():頁(yè)面初始化
* pageBeginRender() ("rewind"):getRequestCycle().isRewinding()為true
* rewind of the form / setting of properties:所有表單組件調(diào)用rewindFormComponent來(lái)取值賦值
* 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
代碼
- public?abstract?void?setPictures(List<Picture>?pictures);??
- public?abstract?void?setPictureInList();//用于For中的value??
- public?abstract?void?setPicture(Picture?picture);//用于表單創(chuàng)建??
- public?abstract?Picture?getPicture();??
- public?void?pageBeginRender(PageEvent?event)?{??
- if(getPicture()==null){??
- setPicture(new?Picture());??
- }??
- setPictures(getPictureService().findAll());??
- }??
代碼
- public?void?pageBeginRender(PageEvent?event)?{??
- if(getPicture()==null){??
- setPicture(new?Picture());??
- }??
- if?(!event.getRequestCycle().isRewinding())?{??
- setPictures(getPictureService().findAll());??
- }??
- }??