【发布时间】:2015-01-13 23:45:46
【问题描述】:
如何从我的 Vaadin 7 应用程序中访问当前的 ServletContext?
我想使用 ServletContext 对象的 setAttribute、getAttribute、removeAttribute 和 getAttributeNames 方法来管理我的 Vaadin 应用程序的一些全局状态。
此外,如果将这些方法用于此目的不适合 Vaadin 应用程序,请解释。
【问题讨论】:
如何从我的 Vaadin 7 应用程序中访问当前的 ServletContext?
我想使用 ServletContext 对象的 setAttribute、getAttribute、removeAttribute 和 getAttributeNames 方法来管理我的 Vaadin 应用程序的一些全局状态。
此外,如果将这些方法用于此目的不适合 Vaadin 应用程序,请解释。
【问题讨论】:
对于 Vaadin 7 和 8,以及 Vaadin Flow(版本 10+):
VaadinServlet.getCurrent().getServletContext()
VaadinServletVaadinServlet 类继承了 getServletContext 方法。
要获取VaadinServlet对象,调用静态类方法getCurrent。
在您的 Vaadin 应用程序中的大多数地方,执行以下操作:
ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();
CAVEAT
在后台线程中不起作用。在您启动的线程中,此命令返回 NULL。据记载:
在其他情况下(例如,从以其他方式启动的后台线程),当前的 servlet 不会自动定义。
@WebListener (ServletContextListener)顺便说一句,当 Web 应用程序在容器中部署(启动)时,您可能希望处理这种全局状态。
您可以在实现ServletContextListener 接口的类上使用@WebListener 注释挂钩到您的Vaadin Web 应用程序的部署。该接口的两个方法contextInitialized 和contextDestroyed 都传递了一个ServletContextEvent,您可以通过调用getServletContext 来访问ServletContext 对象。
@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 都会收到上下文初始化通知。
【讨论】: