挂钩我的 Vaadin 网络应用程序启动和停止?
Hook for my Vaadin web app starting and stopping?
我如何知道我的 Vaadin 7 网络应用何时开始运行 starting/launching,以便我可以进行一些初始设置工作?
同样,我如何知道我的网络应用何时结束,获取 shutdown/exiting?
ServletContextListener
Vaadin 建立在 Java Servlet 技术之上。 “上下文”是 Servlet 术语中 Web 应用程序的技术术语。所以这里的答案不是特定于 Vaadin 的,它适用于任何 Servlet——归根结底,Vaadin 只是一个大 Servlet。
从 Servlet 规范版本 2.3 开始,一个 Servlet container such as Tomcat, Jetty, etc. must promise to be on the lookout for any Java class you define as implementing the ServletContextListener
接口。该接口有两个简单的方法:
- 当您的网络首次启动时被调用的一个 (
contextInitialized
)
- 网络应用程序结束时调用的一个 (
contextDestroyed
)。
结束可能是由于 Servlet 容器(例如:Tomcat)正在关闭,因此所有 Web 应用程序(“上下文”)正在结束,或者因为只有您的 Vaadin 应用程序的上下文正在结束(如果您的 Servlet 容器支持按上下文关闭)。
每个 Servlet 容器必须履行的合同是您的每个 ServletContextListener classes(您可以有多个)必须调用其 contextInitialized
在 任何servlet 或过滤器执行之前。因此,这是进行初始化工作的最佳时机,这可能比单个 Servlet 请求-响应周期更有益。如果你需要启动一个数据库如 [H2 Database),这是个好时机。如果您将一些数据作为缓存加载到内存中以供 servlet 重复使用,这是个好时机。也是测试您的应用程序资源的好时机,例如,确定日志记录是否有效或某些预期文件是否就位。
同样,每个兼容的 Servlet 容器仅在 servlet 和过滤器完成 它们的最后一个 contextDestroyed
调用。因此,这是关闭数据库、进行备份或执行任何其他适合您的 Web 应用程序的清理工作的好地方。
我们正在讨论您的网络应用程序“上下文”的生命周期。该上下文可能涉及一个或多个 servlet。这个上下文的生命周期超出了参与这个上下文的life cycle of any one of the servlets。背景有点像蜂王,她在一个新的蜂巢里生下了所有的雄蜂,她比它们先住在那里,当它们尽职尽责地为她服务时,她会比它们活得更久(如果蜂巢是这样的话有用吗?)。
定义您的 ServletContextListener
制作 ServletContextListener
非常简单:使用一对方法加上注释制作 class。
添加一个新的 Java class 作为您的 Vaadin 应用程序的一部分。您可以随意命名 class。
我将我的上下文侦听器添加到与我的主要 Vaadin 应用程序相同的包中 UI
class(MyUI.java
可能是由您的 Vaadin 插件或 Maven 原型生成的)。似乎是一个自然的地方,因为上下文侦听器是我的 Vaadin 应用程序在处理 any 用户之前启动的开始,而指定的 UI
class 将是第一个我的 Vaadin 应用程序的一部分是 每个 用户的 运行。
声明您的 class 正在实施 ServleContextListener
。添加上面讨论的两个必需方法;您的 IDE 可能会协助完成这项工作。
还有一个技巧:您必须通知 Servlet 容器有关此上下文侦听器的信息。有不止一种方法可以做到这一点,但我使用最简单的,在 class.
上的注释 @WebListener
这是一个完整的示例 class。
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." );
}
}
我如何知道我的 Vaadin 7 网络应用何时开始运行 starting/launching,以便我可以进行一些初始设置工作?
同样,我如何知道我的网络应用何时结束,获取 shutdown/exiting?
ServletContextListener
Vaadin 建立在 Java Servlet 技术之上。 “上下文”是 Servlet 术语中 Web 应用程序的技术术语。所以这里的答案不是特定于 Vaadin 的,它适用于任何 Servlet——归根结底,Vaadin 只是一个大 Servlet。
从 Servlet 规范版本 2.3 开始,一个 Servlet container such as Tomcat, Jetty, etc. must promise to be on the lookout for any Java class you define as implementing the ServletContextListener
接口。该接口有两个简单的方法:
- 当您的网络首次启动时被调用的一个 (
contextInitialized
) - 网络应用程序结束时调用的一个 (
contextDestroyed
)。
结束可能是由于 Servlet 容器(例如:Tomcat)正在关闭,因此所有 Web 应用程序(“上下文”)正在结束,或者因为只有您的 Vaadin 应用程序的上下文正在结束(如果您的 Servlet 容器支持按上下文关闭)。
每个 Servlet 容器必须履行的合同是您的每个 ServletContextListener classes(您可以有多个)必须调用其 contextInitialized
在 任何servlet 或过滤器执行之前。因此,这是进行初始化工作的最佳时机,这可能比单个 Servlet 请求-响应周期更有益。如果你需要启动一个数据库如 [H2 Database),这是个好时机。如果您将一些数据作为缓存加载到内存中以供 servlet 重复使用,这是个好时机。也是测试您的应用程序资源的好时机,例如,确定日志记录是否有效或某些预期文件是否就位。
同样,每个兼容的 Servlet 容器仅在 servlet 和过滤器完成 它们的最后一个 contextDestroyed
调用。因此,这是关闭数据库、进行备份或执行任何其他适合您的 Web 应用程序的清理工作的好地方。
我们正在讨论您的网络应用程序“上下文”的生命周期。该上下文可能涉及一个或多个 servlet。这个上下文的生命周期超出了参与这个上下文的life cycle of any one of the servlets。背景有点像蜂王,她在一个新的蜂巢里生下了所有的雄蜂,她比它们先住在那里,当它们尽职尽责地为她服务时,她会比它们活得更久(如果蜂巢是这样的话有用吗?)。
定义您的 ServletContextListener
制作 ServletContextListener
非常简单:使用一对方法加上注释制作 class。
添加一个新的 Java class 作为您的 Vaadin 应用程序的一部分。您可以随意命名 class。
我将我的上下文侦听器添加到与我的主要 Vaadin 应用程序相同的包中 UI
class(MyUI.java
可能是由您的 Vaadin 插件或 Maven 原型生成的)。似乎是一个自然的地方,因为上下文侦听器是我的 Vaadin 应用程序在处理 any 用户之前启动的开始,而指定的 UI
class 将是第一个我的 Vaadin 应用程序的一部分是 每个 用户的 运行。
声明您的 class 正在实施 ServleContextListener
。添加上面讨论的两个必需方法;您的 IDE 可能会协助完成这项工作。
还有一个技巧:您必须通知 Servlet 容器有关此上下文侦听器的信息。有不止一种方法可以做到这一点,但我使用最简单的,在 class.
上的注释@WebListener
这是一个完整的示例 class。
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." );
}
}