开始和停止我的Vaadin网络应用程序的钩子?
我怎么知道我的Vaadin 7网络应用程序何时首次启动/启动,所以我可以做一些初始设置工作?
同样,我怎么知道我的网络应用何时结束,关机/退出?
ServletContextListener
Vaadin构建于Java Servlet技术之上。 “上下文”是Servlet术语中Web应用程序的技术术语。 所以这里的答案不是Vaadin特有的,它适用于任何Servlet – 而在一天结束时,Vaadin只是一个大Servlet。
从Servlet规范版本2.3开始,诸如Tomcat , Jetty等Servlet容器必须在寻找您定义为实现ServletContextListener
接口的任何Java类。 该接口有两个简单的方法:
- 在您的Web首次启动时调用的一个(
contextInitialized
) - 在您的Web应用程序结束时调用的一个(
contextDestroyed
)。
结束可能是由Servlet容器(例如:Tomcat)关闭导致所有Web应用程序(“上下文”)结束,或者因为您的Vaadin应用程序的上下文正在结束(如果您的Servlet容器支持每个上下文关闭) 。
每个Servlet容器必须满足的合同是每个ServletContextListener类(可以有多个)必须在执行任何servlet或filter之前调用其contextInitialized
。 因此,这是进行初始化工作的最佳时机,这可能比单个Servlet请求 – 响应周期更有益。 如果您需要启动数据库,如[H2数据库 ],这是一个好时机。 如果将一些数据作为缓存加载到内存中以供servlet重复使用,那么现在是个好时机。 例如,也是测试应用程序资源,确定日志记录工作或某些预期文件的好时机。
同样,每个兼容的Servlet容器只有在 servlet和filter完成上次调用之后才会调用contextDestroyed
。 因此,这是关闭数据库,进行备份或执行适合您的Web应用程序的任何其他清理工作的好地方。
我们正在讨论您的Web应用程序“上下文”的生命周期。 该上下文可能涉及一个或多个servlet。 上下文的生命周期超出了参与此上下文的任何一个servlet的生命周期 。 上下文有点像女王蜂,她在一个新的蜂巢里生下了她所有的无人机,她生活在她们面前,她将在她们为她尽职尽责地死去的时候比她们更长寿(如果这是一个蜂巢作品?)。
定义ServletContextListener
制作ServletContextListener
非常简单:使用一对方法和一个注释创建一个类。
添加一个新的Java类作为Vaadin应用程序的一部分。 您可以根据需要为课程命名。
我将我的上下文监听器添加到与我的主要Vaadin应用程序UI
类相同的包中( MyUI.java
可能是由您的Vaadin插件或Maven原型生成的)。 看起来像一个自然的地方,因为在处理任何用户之前,上下文监听器是我的Vaadin应用程序启动的开始,而指定的UI
类将是我为每个用户运行的第一块Vaadin应用程序。
将您的类声明为实现ServleContextListener
。 添加上面讨论的两种必要方法; 您的IDE可能会帮助您完成这项杂务。
还有一个技巧:您必须通知Servlet容器有关此上下文侦听器的信息。 有不止一种方法可以做到这一点,但我在类上使用最简单的注释@WebListener
。
这是一个完整的示例类。
package com.example.amazingapp; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /** * * @author Basil Bourque */ @WebListener public class WebAppListener implements ServletContextListener { @Override public void contextInitialized ( ServletContextEvent sce ) { System.out.println ( "My Vaadin web app is starting. " ); } @Override public void contextDestroyed ( ServletContextEvent sce ) { System.out.println ( "My Vaadin web app is shutting down." ); } }