ActionLink組件
頁面響應(yīng)時,創(chuàng)建了一個鏈接。如果觸發(fā)了鏈接時,組件ActionLink得到一個監(jiān)聽器(通過調(diào)用方法actionTriggered())。
DirectLink組件
DirectLink組件涉及到session,與ExternalLink組件的區(qū)別有兩個:
第一: DirectLink涉及session,DirectLink擁有一個boolean類型的stateful參數(shù)來選擇stateful或stateless,該參數(shù)默認為true,即stateful。而ExternalLink卻不涉及session,ExternalLink僅僅是stateless,不能夠選擇。
第二:非常重要的是,DirectLink與ExternalLink參數(shù)傳遞方式不一樣。DirectLink通過listener監(jiān)聽方法將參數(shù)“扔”給下一個頁面。而ExternalLink通過在下一個頁面實現(xiàn)IExternalPage接口以及activateExternalPage方法“接收”參數(shù)。
為了實現(xiàn)分頁功能,我們使用DirectLink組件實現(xiàn)。在下面的例子,每個頁面我們只顯示10條數(shù)據(jù),那么HQL就只從數(shù)據(jù)庫中查詢出10條數(shù)據(jù)。對于頁面來說,就需要實現(xiàn)“下一頁”(或“上一頁”)頁面跳轉(zhuǎn),以及向我們的業(yè)務(wù)邏輯層方法傳遞分頁參數(shù)(即當前頁碼,以及每頁顯示數(shù)據(jù)數(shù))。
請看對應(yīng)的HTML文件中相關(guān)代碼:
<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文件中聲明相關(guān)組件:
<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組件表現(xiàn)為一個HTML<a>元素,用來提供一個URL,當用戶點擊時,觸發(fā)頁面中一個特定的監(jiān)聽方法。
在實現(xiàn)分頁頁面跳轉(zhuǎn)的四個組件里,都聲明為同一個listener監(jiān)聽方法。請看相應(yīng)java中的對應(yīng)監(jiān)聽方法changePage的代碼:
public void changePage(IRequestCycle cycle) {
//Tapestry4.0已經(jīng)deprecated了cycle.getListenerParameters()
Object[] parameters = cycle.getServiceParameters();
//獲取當前頁碼
Integer ig1 = (Integer) parameters[0];
int i1 = ig1.intValue();
setPageNo(i1);
//獲取每頁最大顯示數(shù)目
Integer ig2 = (Integer) parameters[1];
int i2 = ig2.intValue();
setMaxResult(i2);
}
對于DirectLink,parameters參數(shù)的賦值方式于ExternalLink一樣。這里獲取的是一個數(shù)組,這個數(shù)組包含了兩樣信息:即將跳轉(zhuǎn)的頁碼數(shù),以及即將跳轉(zhuǎn)的頁面顯示多少條數(shù)據(jù)。
在前面,我們提到過,頁面的java文件在完成頁面表現(xiàn)所需數(shù)據(jù)的處理后,應(yīng)該將其所有成員變量(頁面property)還原為初始值。所以,“當前頁碼”以及“每頁最大顯示數(shù)據(jù)”這兩個數(shù)據(jù),我們將它們“保存”在頁面上。當點擊觸發(fā)監(jiān)聽方法后,再由頁面來提供下一個頁面的“頁碼”和“每頁最大顯示數(shù)目”。然后再查詢新的maxResult條數(shù)據(jù)。
運行效果圖如下:
ExternalLink組件
ExternalLink組件使用的是Tapestry的9種service中的external service。該組件使用External Service 創(chuàng)建繼承了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"這個參數(shù)的作用,就是指定了將要跳轉(zhuǎn)的頁面名稱,ExternalLink組件的page參數(shù)根據(jù)配置文件tapestry.application文件中的配置找到對應(yīng)的page文件:
<page name="SuccessPage" specification-path="/WEBINF/SuccessPage.page"/>
然后在SuccessPage.page文件中,根據(jù):
<page-specification class="com.ce.tapestry.Success">
找到對應(yīng)的Success.java文件。在Success.java文件中,我們發(fā)現(xiàn)該類繼承了IExternalPage接口:
public abstract class Success implements IExternalPage
以及實現(xiàn)了activateExternalPage(Object[],IRequestCycle)方法。
對于ExternalLink組件,它必須繼承IExternalPage接口,并實現(xiàn)public void activateExternalPage(Object[] parameters,IRequestCycle cycle)方法。該方法的參數(shù)Object[]來自該組件的parameters參數(shù)的值。 disabled參數(shù)默認為false,當為true時,不能被“點擊”。
GenericLink組件
組件GenericLink通常用于跳轉(zhuǎn)到應(yīng)用程序范圍以外的鏈接。 雖然GenericLink可以用其他組件也能完成,但是GenericLink更靈活:它可以設(shè)置為disabled,象DirectLink或者ActionLink一樣也能包含Rollover組件。
使用方法如下:
<a jwcid="@GenericLink" href="ognl:item.homepage" disabled="false"/>
Href參數(shù):其作用很明顯,就是提供一個鏈接地址。從上例可知:從item.homepage取出地址。
disabled參數(shù):該參數(shù)默認為false,當為true時,不能被“點擊”。關(guān)于disabled參數(shù),所有link類組件都有,作用均相同。
PageLink組件
PageLink組件非常簡單,只需要在page參數(shù)中指明需要跳轉(zhuǎn)到下一個頁面的名字。相當于不帶參數(shù)的ExternalLink。不過需要注意的是,PageLink和ExternalLink使用的不是同一個service,該組件使用了Page Service創(chuàng)建了另外一個鏈接URL。
使用方法請見例子:
<a jwcid="@PageLink" page="Infos"><img src="images/lyb.gif" width="50" height="18" border="0">
</a>
跳轉(zhuǎn)到以下的URL:http://localhost:8080/hello/helloworld?service=page/Upload
ServiceLink組件
創(chuàng)建任意不帶有參數(shù)的引擎服務(wù),ServiceLink組件用法與ActionLink,PageLink和DirectLink等組件相似,但常常與具體的應(yīng)用服務(wù)一起使用。Service參數(shù)是要調(diào)用的EngineService對象的名稱。(Body)
以上的Link類組件,都需要在Body組件范圍內(nèi)使用。