书签、breadcrumbs 和 Back 按钮
Tapestry 和 Wicket 使用自己的格式生成 URLs,这看起来似乎不能使用书签功能。这导致很难引用页面。但是这个框架也提供了这种情况的解决方案。
在 Tapestry 中,从外部引用的页面应该实现 IExternalPage 接口,如下所示:
清单 23. Tapestry 实现 IExternalPage
public abstract Integer getItemId();
public abstract void setItemId(Integer itemId);
public void activateExternalPage(Object[] params, IRequestCycle cycle) {
setItemId((Integer) params[0]);
}
public void pageBeginRender(PageEvent pageEvent) {
ActionItem todo = getActionItemManager().getActionItemByItemId(getItemId());
}
}
此外,页面可以通过以下网址引用 http://host/webapp/tapestryapp?page=ViewActionItem&service=external&sp=123。 然而这不是直接访问 Tapestry 页面的惟一方法。我们可以采用 HiveMind 服务编码器 — 页面服务编码器 — 这个编码器能够把页面名字编码成一些在 URL 中可读的内容。
清单 24. HiveMind 配置:hivemodule.xml
<contribution configuration-id="tapestry.url.ServiceEncoders">
<page-service-encoder id="page" extension="html" service="page"/>
</contribution>
</module>
不要忘记将扩展名 .html 的 servlet 映射添加到 web.xml 中,如下所示:
清单 25. 在 hivemodule.xml 中添加 servlet 映射
<servlet-name>TodolistApplication</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
从现在开始,每个应用程序页面都可以被访问,比如, http://host/webapp/ListActionItems.html。可以对它添加书签。注意,不能以这种方式提供请求参数 — 页面可以在没有参数的情况下调用(或使用默认参数)。
在 Wicket 中,应该只将具有 PageParameters 的页面构造函数定义为参数,如下所示:
清单 26. Wicket 和 PageParameters
public ListActionItems(PageParameters parameters) {
int id = parameters.getInt("id");
// do something
}
}
稍后,这个页面可以引用为 http://host/webapp/wicketapp/?wicket:bookmarkablePage=%3Acom.ibm.cit.tvw.wicket.page.ViewActionItem&id=123。你也可以将页面挂载到理想的路径,如下所示:
清单 27. 在 Wicket 中将页面挂载到理想路径
protected void init() {
mountBookmarkablePage("/apath/login.html", Login.class);
}
}
当操作页面 URL 时,上述方法能实现最大的灵活性。
现在我们开始讨论 breadcrumbs。breadcrumbs 是客户机的操作历史。Wicket 有两个接口针对 breadcrumbs: IBreadCrumbModel 和 IBreadCrumbParticipant,其中模型使用一个活动的 breadcrumbs 将参与者表示为一个列表。模型接口 BreadCrumbBar 的一个有用的实现包含一个 breadcrumbs 参与者堆栈。如果还没有开始一个新的参与者,则它将被放入堆栈的顶部 — 在本例中,对新参与者关闭了堆栈。
另一方面,Tapestry 并没有为 breadcrumbs 提供任何现成的解决方案。
接下来,我们开始讨论 Back 按钮。Web 浏览器的 Back 按钮一直以来都是 Web 应用程序开发人员想要消除的东西,希望以此避免使用它带来的意想不到的影响。但它仍然存在,因此应用程序应该对任何相关事件正确响应。
在这种上下文中,Wicket 因为使用页面版本管理(page-version management)而大放异彩,如果启用了页面版本化,可以很轻松地将页面状态恢复到以前的版本。页面状态由 VersionManager 管理,状态改变保存在用户的会话中。但是要慎用这些特性。
那么 Tapestry 能提供什么呢?Tapestry 中没有什么简单的方法实现上述功能,应用客户端持久性是一种选择,但这是一个很难处理的问题,需要进行一些特殊的考虑。