Tapestry綁定的作用與實現

    Binding是Tapestry一個非常重要的組成部分,同時也是開發者很少接觸的部分。綁定是用於爲組件實例定義的參數提供數據的機制。有了綁定機制,組件就不必知道數據的來源,它需要的只是在必要的時候可以獲取數據。
    綁定在包含該組件的定義文件或模版文件內設置。綁定可以是靜態的,或動態的(這不是由組件自身決定的)。組件也可能使用綁定將一個值寫回其它對象(典型的是寫回某一個組件)。
    簡單點說,綁定是頁面和組件(確切的說是組件與其容器)的橋樑。頁面通過幫定將數據通過綁定傳遞給組件,組件通過綁定將獲取所需要的數據。特別是如果一個組件允許使用非正式參數的時候,綁定就必不可缺了。所有的非正式參數都會作爲綁定賦給組件。binding

    上圖描述了綁定的所處的地位。以及一些實現了的綁定規則。
    Tapestry組件的使用是通過模板或定義文件完成的。當頁面生成的時候頁面識別出某個組件,並完成該組件的生成工作之後會根據不同的綁定規則生成不同的綁定實例,並將其設置給組件。比如說常用的"asset:","ognl:","listener:"等。上圖中AssetBinding和Expessing就是對應於"asset",和"ognl:"兩種綁定。
    Tapestry4對綁定生成的組織是很靈活的,程序員可以分方便的爲框架提供新的綁定規則。比方說我在《使用tapestry-prop提高Tapestry運行效率》提到的"prop:"綁定就是通過通過增加一個幫定規則,來完成類似於"ognl:"綁定的功能。但是這種綁定採用的是代碼生成技術而不是採用動態調用。
   在《Tapestry改進運行效率的方法》一文中,我分析了Tapestry4內部是如何提高應用效率的,並留下了一個問題,如果能解決監聽方法不需要動態調用的話就基本上可以將動態調用降低到最少(我發現的只有<bean>標籤的動態調用不容易解決,但是<bean>並不是非用不可的)。最近,我就在着力解決這個問題,編寫了一個叫做 "delegate:"的綁定規則。這個綁定使用的是代碼生成的方式來調用目標函數,而不是"listener:"綁定使用的動態調用方式。而且更一步的是程序員可以更加精確的定義響應方法了(listener method)。比方說可以有如下的形式"delegate:method", "delegate:method(String)", "delegate:(IRequestCycle cycle, String ,int)", "delegate:method(java.lang.String)"。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章