如何从我的Vaadin 7应用中访问当前的ServletContext
?
我想使用ServletContext
对象的setAttribute
,getAttribute
,removeAttribute
和getAttributeNames
方法为我的Vaadin应用管理一些全局状态。
此外,如果为此目的使用这些方法不适合Vaadin应用程序,请解释。
答案 0 :(得分:23)
对于Vaadin 7,8和10:
VaadinServlet.getCurrent().getServletContext()
VaadinServlet
VaadinServlet
类继承了getServletContext
方法。
要获取VaadinServlet
对象,请调用静态类方法getCurrent
。
在你的Vaadin应用程序中的大多数任何地方,都可以这样做:
ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();
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();
// …
}
}
在执行Vaadin servlet(或Web应用程序中的任何其他servlet /过滤器)之前,将此挂钩作为Vaadin应用程序的一部分进行初始化。引用contextInitialized
方法上的文档:
收到Web应用程序初始化过程正在启动的通知。 在初始化Web应用程序中的任何过滤器或servlet之前,将通知所有ServletContextListener上下文初始化。