【发布时间】: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 上看到与VaadinSession 和VaadinContext 上相同的getAttribute 和setAttribute 方法。但是,不,我在UI 上没有看到这样的方法。
➥ 每个UI 对象是否有适当的位置存储状态?
在过去,在前几代 Vaadin 中,我们总是编写自己的 UI 子类。所以我们总是可以通过在我们自己的UI-subclass 上定义成员变量来存储状态。现在,在 Vaadin Flow(v10+,目前为 14)的时代,我们不鼓励(被禁止?)编写 UI 的子类。
在为此类属性提交功能请求之前,我想问一下我是否错过了人们在当前基于 Vaadin 的应用程序中存储其 per-UI 状态的常用位置。
【问题讨论】:
标签: servlets scope vaadin vaadin-flow