如果在 Vaadin 8 中,您有简单的范围层次结构,分为三个级别。
-
Servlet上下文 https://javaee.github.io/javaee-spec/javadocs/javax/servlet/ServletContext.html
代表您的整个 Vaadin Web 应用程序。
-
VaadinSession https://vaadin.com/api/framework/8.8.6/com/vaadin/server/VaadinSession.html
代表每个用户的工作会话。
-
UI https://vaadin.com/api/framework/8.8.6/com/vaadin/ui/AbstractComponent.html#getCustomAttributes--
代表会话中的每个网络浏览器/选项卡(Vaadin 支持多窗口应用程序,非常棒)。
第一个是每个的标准部分Java小服务程序 https://en.wikipedia.org/wiki/Java_servlet,在规范中定义。
第二个是会话的包装器,也在 Java Servlet 规范中定义。
Vaadin实际上是一个巨大的Servlet,所以它承载了context和session这些特性。
The UI https://vaadin.com/api/framework/8.8.6/com/vaadin/ui/UI.html类是 Vaadin 独有的。它代表 Web 浏览器窗口/选项卡的内容。 Vaadin 支持多窗口应用程序,跟踪所有打开的窗口/选项卡作为会话的一部分,这是 Vaadin 的一个非常好的功能。
要存储全州范围的应用程序,请使用标准ServletContext
目的。它带有一个称为“属性”的键值集合。关键在于String
类型,值为Object https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html类型。调用方法setAttribute
, getAttribute
, and removeAttribute
。将此集合用于您可能需要为任何用户访问的任何对象,访问他们的会话。您可能会了解ServletContextListener https://javaee.github.io/javaee-spec/javadocs/javax/servlet/ServletRequestListener.html顺便说一句,挂钩您的网络应用程序的启动和退出。
The VaadinSession
类携带相同类型的键值集合,具有类似的“属性”方法。使用它来跟踪用户整个工作会话中的项目,包括可能打开/关闭应用程序的多个窗口/选项卡的项目。例如,在会话中,您将存储用户的 Spirit Animal 选择、他们的头像图像以及该人已通过用户名/密码凭据进行身份验证的事实。请参阅手册中的此页,设置和读取会话属性 https://vaadin.com/docs/v8/framework/articles/SettingAndReadingSessionAttributes.html.
如果您想存储每个窗口的设置,例如背景颜色或亮/暗模式的选择,请将某些内容存储在UI
。不幸的是,据我所知,该类没有提供方便的键值存储。所以你需要添加你自己的Map
,或一些其他成员变量到你的UI
子类。
欲了解更多信息,请参阅我的答案 https://stackoverflow.com/a/25586487/642706类似的问题。我在那里做了一些漂亮的图表。这个问题是关于 Vaadin 7 的,但我依稀记得,这些概念在 7 和 8 之间都有延续。
As for VaadinService https://vaadin.com/api/framework/8.8.6/com/vaadin/server/VaadinService.html and VaadinServletService https://vaadin.com/api/framework/8.8.6/com/vaadin/server/VaadinServlet.html,我一直没有确切地理解他们的角色。它们似乎代表了整个 Vaadin 网络在运行时的各个方面。但两者都没有像这样提供方便的键值集合VaadinSession
。 (如果您使用 Vaadin Flow 版本 10+,请参阅VaadinContext
,一个类代表您的整个网络应用程序,并且确实带有方便的“属性”键值集合。)