ServletContextListener
Vaadin 建立在Java小服务程序 https://en.wikipedia.org/wiki/Java_Servlet技术。 “上下文”是 Servlet 术语中 Web 应用程序的技术术语。因此,这里的答案不是特定于 Vaadin 的,它适用于任何 Servlet ——而且归根结底,Vaadin 只是一个大 Servlet。
从 Servlet 规范版本 2.3 开始,小服务程序容器 https://en.wikipedia.org/wiki/Web_container例如Tomcat https://en.wikipedia.org/wiki/Apache_Tomcat, Jetty https://en.wikipedia.org/wiki/Jetty_(web_server)等必须保证留意您定义为实现ServletContextListener http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html界面。该接口有两个简单的方法:
- 当您的网站首次启动时被调用的一个(contextInitialized http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html#contextInitialized-javax.servlet.ServletContextEvent-)
- 当你的网络应用程序结束时被调用的一个(contextDestroyed http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html#contextDestroyed-javax.servlet.ServletContextEvent-).
结束可能是由于 Servlet 容器(例如:Tomcat)正在关闭,因此所有 Web 应用程序(“上下文”)都正在结束,或者只是您的 Vaadin 应用程序的上下文正在结束(如果您的 Servlet 容器支持按上下文关闭) 。
每个 Servlet 容器必须履行的契约是,每个 ServletContextListener 类(可以有多个)都必须有其contextInitialized
调用before任何 servlet 或过滤器执行。因此,这是进行初始化工作的最佳时机,这可能比单个 Servlet 请求-响应周期更有好处。如果您需要启动数据库,例如[H2数据库 http://h2database.com),这是一个好时机。如果您将一些数据加载到内存中作为缓存供 servlet 重复使用,那么这是一个好时机。这也是测试应用程序资源的好时机,例如,确定某些日志记录是否正常工作或某些预期文件是否就位。
同样,每个兼容的 Servlet 容器都会调用contextDestroyed
only afterservlet 和过滤器已完成他们最后一次调用。因此,这是关闭数据库、进行备份或执行任何其他适合您的 Web 应用程序的清理工作的好地方。
我们正在讨论网络应用程序“上下文”的生命周期。该上下文可能涉及一个或多个 servlet。上下文的生命周期超出了任一 Servlet 的生命周期 https://en.wikipedia.org/wiki/Java_servlet#Life_cycle_of_a_servlet在此背景下参与。背景有点像蜂王,她在一个新的蜂巢里生下了她所有的雄蜂,她就住在它们之前,当它们尽职尽责地为她服务而死去时,她会比它们活得更久(如果这就是蜂巢的方式)作品?)。
定义你的ServletContextListener
制作一个ServletContextListener
非常简单:用一对方法和一个注释创建一个类。
添加一个新的 Java 类作为 Vaadin 应用程序的一部分。您可以为该类命名任何您想要的名称。
我将上下文侦听器添加到与我的主 Vaadin 应用程序相同的包中UI https://vaadin.com/api/com/vaadin/ui/UI.html class (MyUI.java
可能是由您的 Vaadin 插件或 Maven 原型生成的)。似乎是一个自然的地方,因为上下文侦听器是我之前启动的 Vaadin 应用程序的开始any用户在指定时被处理UI
然后,类将成为我的 Vaadin 应用程序运行的第一个部分each user.
声明你的类正在实现ServleContextListener
。添加上面讨论的两个必需的方法;你的IDE https://en.wikipedia.org/wiki/Integrated_development_environment可以协助做这项杂务。
还有一个技巧:您必须告知 Servlet 容器有关此上下文侦听器的信息。有不止一种方法可以做到这一点,但我使用最简单的方法,即注释@WebListener http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebListener.html在课堂上。
这是一个完整的示例类。
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." );
}
}