如何使用Navigator管理Vaadin中的uri

del*_*nce 4 java uri navigator vaadin

Vaadin提供了一个Navigator来在页面之间导航,但我不喜欢它编写url的方式,例如/VaadinApp/#!login.如何将URI更改为/VaadinApp/login.有没有人试图这样做?

Rol*_*ger 6

在编写自定义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接口.


Ale*_*kov 5

您需要扩展UriFragmentManager和覆盖getState()以及setState()方法:

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

public String getState() {
   return getFragment() != null ? getFragment() : "";
}
Run Code Online (Sandbox Code Playgroud)