我的Vaadin网络应用程序启动和停止的钩子?

时间:2016-04-13 04:40:48

标签: java servlets vaadin7 servletcontextlistener

我如何知道我的Vaadin 7网络应用程序何时首次启动/启动,以便我可以进行一些初始设置工作?

同样,我怎么知道我的网络应用何时结束,关机/退出?

1 个答案:

答案 0 :(得分:6)

ServletContextListener

Vaadin建立在Java Servlet技术之上。 “上下文”是Servlet术语中Web应用程序的技术术语。所以这里的答案不是Vaadin特有的,它适用于任何Servlet - 而在一天结束时,Vaadin只是一个大Servlet。

自Servlet规范版本2.3起,Servlet containerTomcatJetty等必须承诺在寻找您定义为实现{{3}的任何Java类。接口。该接口有两个简单的方法:

结束可能是由Servlet容器(例如:Tomcat)关闭导致所有Web应用程序(“上下文”)结束,或者因为您的Vaadin应用程序的上下文正在结束(如果您的Servlet容器支持per-上下文关闭)。

每个Servlet容器必须满足的合同是每个ServletContextListener类(可以有多个)必须在任何servlet或过滤器执行之前调用 contextInitialized 即可。所以这是进行初始化工作的最佳时机,这可能比单个Servlet请求 - 响应周期更有益。如果您需要启动数据库,例如contextDestroyed),这是一个好时机。如果将一些数据作为缓存加载到内存中以供servlet重复使用,那么现在是个好时机。例如,也是测试应用资源,确定日志记录工作或某些预期文件的好时机。

同样,每个兼容的Servlet容器在 servlet和过滤器完成上次之后仅调用 contextDestroyed 。因此,这是关闭数据库,进行备份或执行适合您的Web应用程序的任何其他清理工作的好地方。

我们正在讨论您的网络应用程序“上下文”的生命周期。该上下文可能涉及一个或多个servlet。上下文的生命周期超出了参与此上下文的 [H2 Database。上下文有点像女王蜂,她在一个新的蜂巢中生下她所有的无人机,她生活在她们面前,她将在她们尽职尽责地为她而死的时候比她们更长寿(如果这是一个蜂巢作品?)。

定义ServletContextListener

制作ServletContextListener非常简单:使用一对方法和一个注释创建一个类。

添加一个新的Java类作为Vaadin应用程序的一部分。您可以根据需要为课程命名。

我将我的上下文侦听器添加到同一个包中,因为我的主要Vaadin应用life cycle of any one of the servlets类(MyUI.java可能是由您的Vaadin插件或Maven原型生成的)。看起来像一个自然的地方,因为上下文监听器是我的Vaadin应用程序在任何用户被处理之前启动的开始,而指定的UI类将是我的Vaadin应用程序的第一部分正在运行对于每个用户。

将您的类声明为实现ServleContextListener。添加上面讨论的两种必要方法;你的UI可以协助处理这项苦差事。

还有一个技巧:您必须通知Servlet容器有关此上下文侦听器的信息。有不止一种方法可以做到这一点,但我在类上使用最简单的注释IDE

这是一个完整的示例类。

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." );
    }

}