在编写自定义UriFragmentManager之前,请等待一秒钟.你确定,你想使用像这样的URI /VaadinApp/login吗?如果您只想删除!URI片段,可以按照Alexey的提议编写自定义UriFragmentManager.但是有一个很好的理由为什么Vaadin使用shebang #!作为URI片段(看这里).
如果你真的不想使用哈希标记,请三思而后行.这基本上意味着根本没有URI片段,这不是你想要使用像Vaadin这样的单页应用程序框架旅行的道路.Vaadin应用程序在单个页面上运行,任何用户操作和导航都通过轻量级Ajax请求进行处理.如果您使用的URL结构是怎样的/VaadinApp/login,/VaadinApp/profile,/VaadinApp/main等你Vaadin的应用程序将最终做用户所做的每个导航步骤后全部重新加载.这将导致不可接受的闪烁效果,因为重新加载Vaadin应用程序意味着浏览器通过相对较慢的JavaScript引擎完全重新呈现页面内容.请务必重新阅读Book of Vaadin中有关导航器组件的部分.此外,即使不推荐,也不能通过使用自定义来实现此解决方案UriFragmentManager.
这就是说,如果你想实现阿列克谢的解决方案,您写的子类com.vaadin.navigator.Navigator.UriFragmentManager有两个methodes getState()并setState()如上图所示(本次拟实现只是内放弃感叹号对比原执行).然后将此自定义片段管理器的实例传递给Navigator的构造函数中的以下一个:
Navigator(UI ui, NavigationStateManager stateManager,
ViewDisplay display)
UriFragmentManager实现NavigationStateManager接口.
您需要扩展UriFragmentManager和覆盖getState()以及setState()方法:
public void setState(String state) {
setFragment(state);
}
public String getState() {
return getFragment() != null ? getFragment() : "";
}
Run Code Online (Sandbox Code Playgroud)