在工作中,我们使用Vaadin开发一个Web应用程序。我是一个相当高级的Java程序员。我对瓦丁也有经验。但是现在我已经到了需要将信息存储在用户会话中的地步。区域设置、用户名等属性。
在Vaadin文档中,他们谈论的是两种不同类型的会话,但我并没有真正理解其中的区别:
- VaadinServletService或VaadinPortletService被描述为用于处理请求的低级定制层。
- VaadinSession 的 UI 使用 getSession() 作为较低级别的会话对象。
有什么区别,当我想在整个UI独立用户会话期间存储属性时,使用哪一个?
如果在Vaadin 8中,您在三个级别上具有简单的范围层次结构。
- ServletContext
表示整个 Vaadin Web 应用程序。 VaadinSession
表示每个用户的工作会话。UI
表示会话中的每个Web浏览器/选项卡(Vaadin支持多窗口应用程序,非常惊人)。
第一个是每个Java Servlet的标准部分,在规范中定义。
第二个是会话的包装器,也在Java Servlet规范中定义。
Vaadin 实际上是一个巨大的 Servlet,因此它承载了上下文和会话的这些特性。
UI
类是瓦丁独有的。它表示 Web 浏览器窗口/选项卡的内容。Vaadin 支持多窗口应用程序,跟踪所有打开的窗口/选项卡作为会话的一部分,这是 Vaadin 的一个非常好的功能。
若要存储状态范围的应用,请使用标准ServletContext
对象。它带有一个称为"属性"的键值集合。键为String
类型,值为Object
类型。调用方法setAttribute
、getAttribute
和removeAttribute
。将此集合用于可能需要为任何用户访问的任何对象,并访问其会话。顺便了解ServletContextListener
,挂接到您的 Web 应用程序启动和退出。
VaadinSession
类携带相同类型的键值集合,具有类似的"属性"方法。使用它来跟踪用户工作会话中的项目,跨这些项目可能会打开/并列应用的多个窗口/选项卡。例如,在会话中,您将存储用户的灵兽选择、他们的头像图像以及该人已通过用户名/密码凭据进行身份验证的事实。 请参阅手册设置和读取会话属性中的此页面。
如果要存储每个窗口的设置,例如他们选择的背景颜色或明/暗模式,请在UI
上存储一些内容。不幸的是,该类没有提供我知道的方便的键值存储。所以你需要将你自己的Map
,或者一些其他成员变量添加到你的UI
子类中。
有关更多信息,请参阅我对类似问题的回答。我在那里做了一些漂亮的图表。这个问题是关于Vaadin 7的,但我依稀记得,这些概念在7和8之间延续。
至于VaadinService
和VaadinServletService
,我从来不了解他们的角色。它们似乎在运行时代表了整个Vaadin Web的各个方面。但两者都不像VaadinSession
那样携带方便的键值集合。(如果您使用 Vaadin Flow 版本 10+,请参阅VaadinContext
,一个表示整个 Web 应用程序的类,并且确实带有方便的"属性"键值集合。