【问题标题】:How to manage uri in Vaadin with the Navigator如何使用 Navigator 在 Vaadin 中管理 uri
【发布时间】:2014-04-28 16:19:53
【问题描述】:

Vaadin 提供了一个导航器来在页面之间导航,但我不喜欢它编写 url 的方式,例如/VaadinApp/#!login。如何将该 URI 更改为 /VaadinApp/login。有人试过吗?

【问题讨论】:

    标签: java uri vaadin navigator


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你的回答,但是哪个类应该扩展UriFragementManager?使用导航器的主类已经扩展了UI
    【解决方案2】:

    在编写自定义 UriFragmentManager 之前请稍等。您确定要使用像 /VaadinApp/login 这样的 URI 吗?如果您只想摆脱 URI 片段中的!,您可以按照 Alexey 的建议编写自定义 UriFragmentManager。但 Vaadin 使用 shebang #! 表示 URI 片段 (look here) 是有充分理由的。

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

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

    Navigator(UI ui, NavigationStateManager stateManager, ViewDisplay display)

    UriFragmentManager 实现了NavigationStateManager 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2015-09-03
      • 2019-11-07
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多