第一,頁面是頁面,頁面跳轉(zhuǎn)的時(shí)候,需要清空properties數(shù)據(jù),否則,這些數(shù)據(jù)保存在session里面,很容易造成bug。打個(gè)比方說吧,initialize()這個(gè)方法,的確,在頁面表現(xiàn)的時(shí)候,執(zhí)行兩次。頁面表現(xiàn)之前,初始化你的頁面,然后頁面表現(xiàn)你的業(yè)務(wù)邏輯,比如你要顯示什么新聞呀等等。。。最后,頁面在結(jié)束表現(xiàn)之前,再次執(zhí)行這個(gè)方法,將你的properties還原為初始值,這樣,在你的下次再訪問該頁面的時(shí)候,不會因?yàn)?properties的值已經(jīng)改變而造成意想不到的錯(cuò)誤。
第二,提交一般是指表單,也就是formSubmit。如果你希望這個(gè)表單在提交之前就有初始值,也很容易,將ognl對應(yīng)的get方法對應(yīng)的成員變量初始化一個(gè)值就可以。比如說用initialize()來初始化。在你submit之后,ognl會自動調(diào)用properties相應(yīng)的set方法賦值,你在form對應(yīng)的監(jiān)聽方法進(jìn)行數(shù)據(jù)處理就可以了。
第三,其它的Tapestry自帶方法就不說了。什么validate()等等,都不提,只講這5個(gè)方法:
initialize()
detach()
attach()
pageBeginRender()
pageAfterRender()
它們的執(zhí)行是有先后順序的,其中只有initialize()方法會執(zhí)行兩次,其它的都執(zhí)行一次。這些特點(diǎn),足夠你利用來做很多事。
頁面在表現(xiàn)(render)的時(shí)候,我只以direct service舉例:
1)執(zhí)行initialize(),初始化該頁面的properties,這些properties都應(yīng)該是客戶端的瞬時(shí)狀態(tài)。
2)執(zhí)行attach(IEngine value),獲取你的engine。所以,你可以利用這個(gè)方法往你的web容器里面加載服務(wù)。
3)執(zhí)行pageBeginRender(),同樣是用來在頁面表現(xiàn)之前,給你希望的變量賦值。。比如說,我基本上是用這個(gè)方法來獲取Visit對象中儲存的session值。
4)頁面表現(xiàn)業(yè)務(wù)邏輯。你的什么Foreach啊,等等,現(xiàn)在才開始執(zhí)行。
5)執(zhí)行pageEndRender()。在你的頁面業(yè)務(wù)邏輯表現(xiàn)完之后,如果你希望有什么后續(xù)工作,可以在這里執(zhí)行。
6)執(zhí)行detach()的super(),也就是執(zhí)行AbstractPage里面Tapestry自己的detach(),目的是為了清空該頁面所調(diào)用的engine,visit,requestCycle。因?yàn)槿绻磺蹇盏脑挘热缡裁从脩粜畔⒌脑挘涂赡軙孤丁_@個(gè)方法的存在是 Tapestry基于安全性的考慮。
7)執(zhí)行initialize(),再次將你的properties恢復(fù)為初始值。
8)執(zhí)行detach()里面,你自己寫的內(nèi)容。。
以上僅僅最簡單的情況下,這5種方法的執(zhí)行順序。。。