技术开发 频道

Tapestry 和 Wicket 的比较

  书签、breadcrumbs 和 Back 按钮

  Tapestry 和 Wicket 使用自己的格式生成 URLs,这看起来似乎不能使用书签功能。这导致很难引用页面。但是这个框架也提供了这种情况的解决方案。

  在 Tapestry 中,从外部引用的页面应该实现 IExternalPage 接口,如下所示:

  清单 23. Tapestry 实现 IExternalPage

public abstract class ViewActionItem extends BasePage implements 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

<module id="com.ibm.cit.tvw" version="1.1.0">
    
<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-mapping>
        
<servlet-name>TodolistApplication</servlet-name>
        
<url-pattern>*.html</url-pattern>
    
</servlet-mapping>

  从现在开始,每个应用程序页面都可以被访问,比如, http://host/webapp/ListActionItems.html。可以对它添加书签。注意,不能以这种方式提供请求参数 — 页面可以在没有参数的情况下调用(或使用默认参数)。

  在 Wicket 中,应该只将具有 PageParameters 的页面构造函数定义为参数,如下所示:

  清单 26. Wicket 和 PageParameters

public class ListActionItems extends WebPage {
    
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 中将页面挂载到理想路径

public class ToDoListApplication extends WebApplication {
    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 中没有什么简单的方法实现上述功能,应用客户端持久性是一种选择,但这是一个很难处理的问题,需要进行一些特殊的考虑。

0
相关文章