Vaadin提供导航器在页面之间导航,但我不喜欢它编写网址的方式,例如/VaadinApp/#!login
。如何将该URI更改为/VaadinApp/login
。有没有人试过这样做?
答案 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() : "";
}