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

Bas*_*que 9 servlets vaadin vaadin7

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

我想使用ServletContext对象的setAttribute,getAttribute,removeAttribute,和getAttributeNames方法来管理全球一些国家对我的Vaadin应用程序.

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

Bas*_*que 23

TL;博士

对于Vaadin 7,8和10:

VaadinServlet.getCurrent().getServletContext()
Run Code Online (Sandbox Code Playgroud)

VaadinServlet

VaadinServlet类继承的getServletContext方法.

要获取该VaadinServlet对象,请调用静态类方法getCurrent.

从您的Vaadin应用程序中的大多数任何位置,执行以下操作:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();
Run Code Online (Sandbox Code Playgroud)

CAVEAT
在后台线程中不起作用.在您启动的线程中,此命令返回NULL.记录如下:

在其他情况下(例如,从后台线程以其他方式启动),不会自动定义当前的servlet.

@WebListener(ServletContextListener)

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

您可以使用@WebListener实现ServletContextListener界面的类上的注释挂钩您的Vaadin Web应用程序部署.该接口的两种方法,contextInitialized并且contextDestroyed,传递一个ServletContextEvent从中可以访问ServletContext通过调用对象getServletContext.

@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();
        // …
    }

}
Run Code Online (Sandbox Code Playgroud)

在执行Vaadin servlet(或Web应用程序中的任何其他servlet /过滤器)之前,此挂钩被称为Vaadin应用程序的一部分,正在初始化.引用该contextInitialized方法的文档:

接收Web应用程序初始化过程正在启动的通知.在初始化Web应用程序中的任何过滤器或servlet之前,将通知所有ServletContextListener上下文初始化.