tapestry-prop介紹
它是一個為Tapestry4.0編寫的擴充包,提供了一個新的綁定首碼"prop:"。這個首碼用於擷取頁面或組件的屬性。
看上去和Tapestry內建的"ognl:"首碼沒有什麼區別,但是低層實際擷取資料的方法和OGNL是完全不同的。它採用了位元組碼產生的方式去擷取使用者類中的那些可以通過名字擷取的屬性。
"prop:"首碼只能擷取簡單屬性或者由路徑代表的屬性(一串用點號隔開的屬性名稱)。比方說 "prop:userName" 或 "prop:identity.admin"。
最後一個屬性如果是唯讀或唯寫的話,在分別對它們更新或讀取的時候就會拋出一個適當的異常。
Tapestry5將預設使用更成熟的"prop:"首碼(OGNL還會保留,但是到寫這篇文章為止還沒有完成)。
使用
所需做的只是將tapestry-prop包放在類路徑下就可以了(典型的,在WAR包的WEB-INF/lib包下)。Maven會為你作好剩下的一切,你要做的僅僅是把tapestry-prop作為一個項目的一個依賴包。
你可以在HTML模板裡面使用"prop:"首碼:
<span jwcid="@Insert" value="prop:userName">Joe User</span>
或者,你也可以在頁面或組件的定義檔案裡面使用:
<component id="userName" type="Insert">
<binding name="value" value="prop:userName"/>
</component>
這個包使用JDK1.3編譯,並與其相容。
與OGNL比較
"prop:"首碼比"ognl:"高效,但是不像它那樣靈活。
優勢是,使用它對效能將會有極大的提升。不僅沒有了反射的開銷,而且也不會有OGNL操作時需要的臨時對象的建立。
缺點是,OGNL總能正確的計算屬性的類型。"prop:"首碼使用的是申明的類型,就想編譯時間被編譯過的Java代碼一樣。如果一個頁面屬性使用介面定義的,那麼你不能用這個介面的實現來擷取屬性(除非那些方法也是用介面定義的)。
OGNL還包含了豐富的類型轉化系統和更豐富的文法。正是OGNL的這種簡單和高效(註:不是指運行效率)使它被Tapestry選用而不依賴於代碼產生的原因。
在效能方面,有了一個顯著的提高:
顯示了在處理簡單情況(簡單屬性)和複雜情況(屬性路徑)下get操作迴圈次數。數字越高表面效能越好(在2秒內的迴圈次數)。
使用純粹的java代碼和使用"prop:"首碼效率幾乎是並駕齊驅的,ONGL就有了明顯的差距。更糟的是,每一個包含在ONGL運算式裡的條件都會有巨大的影響(相反,另外兩種情況下,額外的條件幾乎沒有影響)。考慮到這些因素,在成百上千的Tapestry頁面裡面差距就非常明顯了。
預設使用"prop:"綁定
使用Tapestry的配置屬性org.apache.tapestry.default-binding-prefix可以使頁面或組件的預設綁定規則使用"prop:"。比如:
<page-specification>
<meta key="org.apache.tapestry.default-binding-prefix" value="prop"/>
. . .
</page-specification>
意思是在所有頁面定義的值如果沒有使用明確的首碼則會預設的使用"prop:"而不是"ognl:"。如果把<meta>標籤一道應用的定義檔案(application specification),則會影響到應用中所有的頁面和組件。
下載
beta版的包現在可以在Maven 2 庫裡下載到http://howardlewisship.com/repository/