如何从 Vaadin 7 应用程序中访问 `ServletContext`?

How to access `ServletContext` from within a Vaadin 7 app?

如何从我的 Vaadin 7 应用程序访问当前 ServletContext

我想使用 ServletContext 对象的 setAttribute, getAttribute, removeAttribute, and getAttributeNames 方法来管理我的 Vaadin 应用程序的一些全局状态。

此外,如果为此目的使用这些方法不适合 Vaadin 应用程序,请解释。

tl;博士

对于 Vaadin 7 和 8,以及 Vaadin Flow(版本 10+):

VaadinServlet.getCurrent().getServletContext()

VaadinServlet

VaadinServlet class inherits a getServletContext 方法。

要获取 VaadinServlet 对象,请调用静态 class 方法 getCurrent

在您的 Vaadin 应用程序中的大部分位置,执行如下操作:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();

注意事项
在后台线程中不起作用。在您启动的线程中,此命令 returns NULL。如文件所示:

In other cases, (e.g. from background threads started in some other way), the current servlet is not automatically defined.

@WebListener (ServletContextListener)

顺便说一句,当 Web 应用程序在容器中部署(启动)时,您可能希望处理此类全局状态。

您可以使用 @WebListener annotation on your class implementing the ServletContextListener interface. Both methods of that interface, contextInitialized and contextDestroyed, are passed a ServletContextEvent from which you can access the ServletContext object by calling getServletContext.

连接到 Vaadin 网络应用程序的部署
@WebListener ( "Context listener for doing something or other." )
public class MyContextListener implements ServletContextListener
{

    // Vaadin app deploying/launching.
    @Override
    public void contextInitialized ( ServletContextEvent contextEvent )
    {
        ServletContext context = contextEvent.getServletContext();
        context.setAttribute( … ) ;
        // …
    }

    // Vaadin app un-deploying/shutting down.
    @Override
    public void contextDestroyed ( ServletContextEvent contextEvent )
    {
        ServletContext context = contextEvent.getServletContext();
        // …
    }

}

在执行 Vaadin servlet(或您的 Web 应用程序中的任何其他 servlet/filter 之前,此挂钩作为正在初始化的 Vaadin 应用程序的一部分被调用。在 contextInitialized 方法上引用文档:

Receives notification that the web application initialization process is starting. All ServletContextListeners are notified of context initialization before any filters or servlets in the web application are initialized.