如何使用Navigator管理Vaadin中的uri

时间:2014-04-28 16:19:53

标签: java uri vaadin navigator

Vaadin提供导航器在页面之间导航,但我不喜欢它编写网址的方式,例如/VaadinApp/#!login。如何将该URI更改为/VaadinApp/login。有没有人试过这样做?

2 个答案:

答案 0 :(得分:6)

在编写自定义UriFragmentManager之前,请等待一秒钟。您确定要使用/VaadinApp/login之类的URI吗?如果您只想删除URI片段中的!,可以按照Alexey的提议编写自定义UriFragmentManager。但是,Vaadin使用shebang #!作为URI片段(look here)是有充分理由的。

如果你真的不想使用哈希标记,请三思而后行。这基本上意味着根本没有URI片段,这不是你想要使用像Vaadin这样的单页应用程序框架旅行的道路。 Vaadin应用程序在单个页面上运行,任何用户操作和导航都通过轻量级Ajax请求进行处理。如果您使用/VaadinApp/login/VaadinApp/profile/VaadinApp/main等网址结构,则您的Vaadin应用最终会在用户执行每个导航步骤后进行完全重新加载。这将导致不可接受的闪烁效果,因为重新加载Vaadin应用程序意味着浏览器通过相对较慢的JavaScript引擎完全重新呈现页面内容。请务必重新阅读有关Navigator component in the Book of Vaadin的部分。此外,即使不推荐,也可以使用自定义UriFragmentManager 来实现此解决方案。

也就是说,如果你想实现Alexey的解决方案,你可以编写一个com.vaadin.navigator.Navigator.UriFragmentManager的子类,其中包含两个方法getState()setState(),如上所示(这个提议的实现只是放弃了感叹号与原始实施相反)。然后将此自定义片段管理器的实例传递给Navigator的构造函数中的以下一个:

Navigator(UI ui, NavigationStateManager stateManager, ViewDisplay display)

UriFragmentManager实现了NavigationStateManager接口。

答案 1 :(得分:5)

您需要扩展UriFragmentManager并覆盖getState()setState()方法:

public void setState(String state)  {
   setFragment(state);
}

public String getState() {
   return getFragment() != null ? getFragment() : "";
}