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

时间:2015-01-13 23:45:47

标签: servlets vaadin vaadin7

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

我想使用ServletContext对象的setAttributegetAttributeremoveAttributegetAttributeNames方法为我的Vaadin应用管理一些全局状态。

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

1 个答案:

答案 0 :(得分:23)

TL;博士

对于Vaadin 7,8和10:

VaadinServlet.getCurrent().getServletContext()

VaadinServlet

VaadinServlet类继承了getServletContext方法。

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

在你的Vaadin应用程序中的大多数任何地方,都可以这样做:

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

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

  

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

@WebListenerServletContextListener

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

您可以使用实现@WebListener界面的类上的ServletContextListener注释来挂接您的Vaadin Web应用程序部署。该接口contextInitializedcontextDestroyed的两种方法都通过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();
        // …
    }

}

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

  

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