ActionLink組件
頁面響應時,創建了一個鏈接。如果觸發了鏈接時,組件ActionLink得到一個監聽器(通過調用方法actionTriggered())。
DirectLink組件
DirectLink組件涉及到session,與ExternalLink組件的區別有兩個:
第一: DirectLink涉及session,DirectLink擁有一個boolean類型的stateful參數來選擇stateful或stateless,該參數默認為true,即stateful。而ExternalLink卻不涉及session,ExternalLink僅僅是stateless,不能夠選擇。
第二:非常重要的是,DirectLink與ExternalLink參數傳遞方式不一樣。DirectLink通過listener監聽方法將參數“扔”給下一個頁面。而ExternalLink通過在下一個頁面實現IExternalPage接口以及activateExternalPage方法“接收”參數。
為了實現分頁功能,我們使用DirectLink組件實現。在下面的例子,每個頁面我們只顯示10條數據,那么HQL就只從數據庫中查詢出10條數據。對于頁面來說,就需要實現“下一頁”(或“上一頁”)頁面跳轉,以及向我們的業務邏輯層方法傳遞分頁參數(即當前頁碼,以及每頁顯示數據數)。
請看對應的HTML文件中相關代碼:
<span jwcid="@Conditional" condition="ognl:firstDisable">
<span jwcid="first">首頁</span>
<span jwcid="previous">上一頁</span>
</span>
第 <span jwcid="@Insert" value="ognl:pageNo" /> 頁
<span jwcid="@Conditional" condition="ognl:lastDisable">
<span jwcid="next">下一頁</span>
<span jwcid="last">尾頁</span>
</span>
共 <span jwcid="@Insert" value="ognl:total" /> 頁
在page文件中聲明相關組件:
<component id="first" type="DirectLink">
<binding name="listener" expression="listeners.changePage"/>
<binding name="parameters" expression="new java.lang.Object[]{first,maxResult}"/>
</component>
<component id="previous" type="DirectLink">
<binding name="listener" expression="listeners.changePage"/>
<binding name="parameters" expression="new java.lang.Object[]{previous, maxResult}"/>
<binding name="disabled" expression="previousDisable"/>
</component>
<component id="next" type="DirectLink">
<binding name="listener" expression="listeners.changePage"/>
<binding name="parameters" expression="new java.lang.Object[]{next, maxResult}"/>
<binding name="disabled" expression="nextDisable"/>
</component>
<component id="last" type="DirectLink">
<binding name="listener" expression="listeners.changePage"/>
<binding name="parameters" expression="new java.lang.Object[]{last,maxResult}"/>
</component>
DirectLink組件表現為一個HTML<a>元素,用來提供一個URL,當用戶點擊時,觸發頁面中一個特定的監聽方法。
在實現分頁頁面跳轉的四個組件里,都聲明為同一個listener監聽方法。請看相應java中的對應監聽方法changePage的代碼:
public void changePage(IRequestCycle cycle) {
//Tapestry4.0已經deprecated了cycle.getListenerParameters()
Object[] parameters = cycle.getServiceParameters();
//獲取當前頁碼
Integer ig1 = (Integer) parameters[0];
int i1 = ig1.intValue();
setPageNo(i1);
//獲取每頁最大顯示數目
Integer ig2 = (Integer) parameters[1];
int i2 = ig2.intValue();
setMaxResult(i2);
}
對于DirectLink,parameters參數的賦值方式于ExternalLink一樣。這里獲取的是一個數組,這個數組包含了兩樣信息:即將跳轉的頁碼數,以及即將跳轉的頁面顯示多少條數據。
在前面,我們提到過,頁面的java文件在完成頁面表現所需數據的處理后,應該將其所有成員變量(頁面property)還原為初始值。所以,“當前頁碼”以及“每頁最大顯示數據”這兩個數據,我們將它們“保存”在頁面上。當點擊觸發監聽方法后,再由頁面來提供下一個頁面的“頁碼”和“每頁最大顯示數目”。然后再查詢新的maxResult條數據。
運行效果圖如下:

ExternalLink組件
ExternalLink組件使用的是Tapestry的9種service中的external service。該組件使用External Service 創建繼承了IExternalPage接口的一個鏈接。下面用一個例子說明它的用法。
<a jwcid="@ExternalLink" page="SuccessPage" parameters='ognl:new java.lang.Object[]{"This is Success Page!", item.id}'disabled="ognl:item.Isable"></a>
page="SuccessPage"這個參數的作用,就是指定了將要跳轉的頁面名稱,ExternalLink組件的page參數根據配置文件tapestry.application文件中的配置找到對應的page文件:
<page name="SuccessPage" specification-path="/WEBINF/SuccessPage.page"/>
然后在SuccessPage.page文件中,根據:
<page-specification class="com.ce.tapestry.Success">
找到對應的Success.java文件。在Success.java文件中,我們發現該類繼承了IExternalPage接口:
public abstract class Success implements IExternalPage
以及實現了activateExternalPage(Object[],IRequestCycle)方法。
對于ExternalLink組件,它必須繼承IExternalPage接口,并實現public void activateExternalPage(Object[] parameters,IRequestCycle cycle)方法。該方法的參數Object[]來自該組件的parameters參數的值。 disabled參數默認為false,當為true時,不能被“點擊”。
GenericLink組件
組件GenericLink通常用于跳轉到應用程序范圍以外的鏈接。 雖然GenericLink可以用其他組件也能完成,但是GenericLink更靈活:它可以設置為disabled,象DirectLink或者ActionLink一樣也能包含Rollover組件。
使用方法如下:
<a jwcid="@GenericLink" href="ognl:item.homepage" disabled="false"/>
Href參數:其作用很明顯,就是提供一個鏈接地址。從上例可知:從item.homepage取出地址。
disabled參數:該參數默認為false,當為true時,不能被“點擊”。關于disabled參數,所有link類組件都有,作用均相同。
PageLink組件
PageLink組件非常簡單,只需要在page參數中指明需要跳轉到下一個頁面的名字。相當于不帶參數的ExternalLink。不過需要注意的是,PageLink和ExternalLink使用的不是同一個service,該組件使用了Page Service創建了另外一個鏈接URL。
使用方法請見例子:
<a jwcid="@PageLink" page="Infos"><img src="images/lyb.gif" width="50" height="18" border="0">
</a>
跳轉到以下的URL:http://localhost:8080/hello/helloworld?service=page/Upload
ServiceLink組件
創建任意不帶有參數的引擎服務,ServiceLink組件用法與ActionLink,PageLink和DirectLink等組件相似,但常常與具體的應用服務一起使用。Service參數是要調用的EngineService對象的名稱。(Body)
以上的Link類組件,都需要在Body組件范圍內使用。
posted on 2006-01-27 22:25
yyp 閱讀(1237)
評論(2) 編輯 收藏 所屬分類:
Tapestry