最近有朋友問:“把‘*.page’與‘*.html’完全分開,靜態頁面自己就是一個完整的項目,但Tapestry預設情況下是找不到的,有什麼方法才能做到呢?”。
解決的方法很簡單,Tapestry內部已經支援了這種做法,只是估計由於Tapestry的作者不是精選這種做法所以沒有介紹這種方法。在Tapestry3和Tapestry4中解決這個問題的方法都一樣。在定義檔案中定義一個特殊以"$template"命名的資源就可以了。比方說以Tapestry4為例,通過如下的定義就可以將一個定義檔案與一個模版檔案聯絡起來。
<page-specification >
<asset name="$template" path="context:WEB-INF/pageName.html"/>
</page-specification >
另外,Tapestry4是可以使用路徑加定義檔案來搜尋網頁面或組件。比方說我有如此一個分頁檔"WEB-INF/pages/hawk.page", 那麼如果我不在*.applicaton 檔案中定義這個頁面的話,可以使用"pages/hawk"作為頁面的名稱。在我需要在頁面調用該頁面可以用“<a jwcid=‘@PageLink’ page=‘pages/hawk’>...</a>”等形式。
Tapestry4在架構的擴充性方面做了很多工夫,可以說現在它的擴充性是很強了。如果果真程式需要使用比較特別的方法定義定義檔案和模板檔案的話可以使用架構的擴充點來擴充模板讀取的策略。當然,這個也需要有對Tapestry更深入的瞭解。比如模板檔案放在資料庫中或著是運行時動態產生,那麼可以用如下形式在*.application 中添加一個合適的模版檔案讀取的代理類。當架構使用預設的模板讀取方式無法讀取到檔案的時候就會調用自訂的方式來讀模數板。
<extension name="org.apache.tapestry.template-source-delegate " class="implement of org.apache.tapestry.engine.ITemplateSourceDelegate"/>
總的來說,頁面的定義檔案是最為重要的(當然Tapestry4對這個定義作了擴充,可以使用JAVA5的注釋類型)。通過它將java類和模版聯絡起來。它除了可以指定對應的java類,也可以指定對應的摸板檔案。Tapestry認識一個頁面也首先是從這個定義檔案開始的。