【问题标题】:Where to store `UI`-object scoped state in a Vaadin 14 app?在 Vaadin 14 应用程序中在哪里存储“UI”对象范围状态?
【发布时间】:2019-08-19 22:38:28
【问题描述】:

上下文(网络应用)

要存储可供整个 Vaadin 应用程序使用的状态,我们可以在运行时获取并设置 VaadinContext 对象上的“属性”,该对象代表我们整个基于 Vaadin 的 Web 应用程序。这些属性充当键值集合,其中键的类型为String,值的类型为Object

我们通过调用UI.getCurrent().getSession().getService().getContext() 来访问上下文。

会话(每个用户)

要存储任何用户会话可用的状态,我们可以类似地获取和设置 VaadinSession 对象的“属性”。

我们通过调用UI.getCurrent().getSession() 访问会话。

UI(网络浏览器窗口/标签)

这两个级别的范围,上下文和会话,是它们在Java Servlet 规范中定义的等价物的包装器。但 Vaadin 实际上拥有第三层,更精细的范围。 Vaadin 支持多窗口应用程序,其中每个 Web 浏览器窗口(或选项卡)都有自己的内容,由 UI 对象处理。如果用户在我们的 Vaadin 应用程序中打开了三个窗口,则该用户在服务器上拥有三个 UI 对象实例,这些实例位于单个 VaadinSession 对象中。

因此,似乎一个常见的需求是按UI(Web 浏览器窗口/选项卡)存储状态。所以我希望在UI 上看到与VaadinSessionVaadinContext 上相同的getAttributesetAttribute 方法。但是,不,我在UI 上没有看到这样的方法。

➥ 每个UI 对象是否有适当的位置存储状态?

在过去,在前几代 Vaadin 中,我们总是编写自己的 UI 子类。所以我们总是可以通过在我们自己的UI-subclass 上定义成员变量来存储状态。现在,在 Vaadin Flow(v10+,目前为 14)的时代,我们不鼓励(被禁止?)编写 UI 的子类。

在为此类属性提交功能请求之前,我想问一下我是否错过了人们在当前基于 Vaadin 的应用程序中存储其 per-UI 状态的常用位置。

【问题讨论】:

标签: servlets scope vaadin vaadin-flow


【解决方案1】:

在 Vaadin Flow 中有 ComponentUtil 帮助类,它具有使用组件和 UI 存储数据的方法。

查看一对ComponentUtil.setData 方法,一个taking a Class 作为键,另一个taking a String 作为键,就像VaadinContextVaadinSession 上的getAttribute/setAttribute 方法一样。

【讨论】:

  • 感谢您的回复和解决方案。我确实继续打开功能请求ticket # 6287
  • 错误?您的方法失败了,因为 UI 对象正在一次又一次地快速且莫名其妙地重新实例化。以“Plain Java Servlet”风格创建一个新的 Vaadin 14 应用程序。附上VaadinServiceInitListener的一个实现,然后如手册所示为UIInitEvent添加一个监听器。在该侦听器中拨打System.out.println 电话。即使您单击默认应用程序的“单击我”按钮,您也会看到正在生成新的 UI 实例。 UI 对象不应该在浏览器窗口/选项卡打开的整个过程中保持稳定吗?
  • 我在 Vaadin 论坛上发布了一个示例应用程序,展示了这种看似疯狂的 UI 类行为:vaadin.com/forum/thread/17810577
  • 是的,它不应该是那样的,它会引起一些头痛,请参阅github.com/vaadin/spring/issues/473
猜你喜欢
  • 2020-01-23
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2010-09-23
相关资源
最近更新 更多