Tapestry的函數的執行順序 [轉] 對之前的該文章進(jìn)行了一些修正,主要是針對finishLoad()方法。
我覺(jué)得對初學(xué)者會(huì )有一些幫助。
下面這幾個(gè)函數是我在使用的,它們的執行順序依次從上到下。
1.protected void finishLoad() {} ***
2.public void pageValidate(PageEvent event) {}
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
4.public void pageBeginRender(PageEvent event) {}
// 如果有表單提交,則將form中的各字段的值賦給頁(yè)面類(lèi)
5. ...... 賦值
6.public void submit() // 表單提交等用listenter:調用的方法
7.protected void prepareForRender(IRequestCycle cycle) {}
----------------------------------------------------
1.protected void finishLoad() {}
這個(gè)函數最先執行,但是它實(shí)際上沒(méi)有什么用處(我感覺(jué))。因為:
這個(gè)函數只在頁(yè)面池中沒(méi)有某一個(gè)頁(yè)面類(lèi)、需要生成一個(gè)新的頁(yè)面對象時(shí)才調用。這里就有一個(gè)陷阱:如果你的tomcat啟動(dòng)時(shí)使用了-Dorg.apache.tapestry.disable-caching=true(為了調試方便而設),那么你每次刷新頁(yè)面時(shí),它都會(huì )執行(因為每個(gè)request都會(huì )新生成一個(gè)頁(yè)面類(lèi)對象),造成了它總是執行的假象。在實(shí)際的部署時(shí),會(huì )使用caching,則這個(gè)函數執行的機會(huì )很少。所以要注意。
初始化的代碼放在4 pageBeginRender()中
2.public void pageValidate(PageEvent event) {}
如果實(shí)現了PageValidateListener接口,則可以在這里進(jìn)行驗證,比如訪(fǎng)問(wèn)權限等。執行完1后,它就開(kāi)始執行。
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
如果實(shí)現了IExternalPage接口,則可以從這里取得由外面傳過(guò)來(lái)的參數。執行2后,執行到這里。在這里可以把那些參數取出,賦給頁(yè)面類(lèi)。
4.public void pageBeginRender(PageEvent event) {}
執行完3后,將執行本函數。但是這時(shí)從客戶(hù)端傳過(guò)來(lái)的參數還沒(méi)有被賦值(如果提交了表單的話(huà))。這里可以進(jìn)行一些初始化操作。
5.執行完4后,如果有表單提交,在這里將會(huì )取出那些值,賦給對應的字段。(注意:只是將表單中有的值賦過(guò)來(lái))
6.public void submit()
如果有表單提交的話(huà),在這里將進(jìn)行對應的操作。因為此時(shí)各字段已經(jīng)取好值了,所以可以拿來(lái)直接用。
7.protected void prepareForRender(IRequestCycle cycle) {}
最后才執行這個(gè)方法。我們可以在其中進(jìn)行為了在頁(yè)面上顯示數據而進(jìn)行的操作,比如取得什么對象什么的,因為這里頁(yè)面類(lèi)的屬性賦值已經(jīng)結束,可以直接拿來(lái)使用了。
注意:如果執行了6,則還要執行4,再執行7。如果沒(méi)有6,4完了就直接是7。
以上是我所總結的執行順序,不當之處請指出。
-----------------------------------------------------
最開(kāi)始學(xué)tapestry的時(shí)候,覺(jué)得“怎么有這么多地方需要持久啊”。原來(lái)以前只知道pageBeginRender這個(gè)函數,什么初始化操作都放在它里面??墒撬窃谫x值之前執行,所以拿到的字段多都是空的,卻都以為是沒(méi)有持久化的緣故。所以在客戶(hù)端里放了一大堆的@Hidden,或者session中持久,非常麻煩,,,對tapestry也產(chǎn)生的懷疑?,F在才知道那些需要取得客戶(hù)端傳來(lái)的參數的代碼,最好放在prepareForRender里,很多不必要的持久都可以省掉了。