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 阅读(1232)
评论(2) 编辑 收藏 所属分类:
Tapestry