ServletContextListener
Vaadin建立在Java
Servlet技术之上。“上下文”是Servlet术语中Web应用程序的技术术语。因此,这里的答案不是特定于Vaadin的,它适用于任何Servlet-
归根结底,Vaadin只是一个大型Servlet。
从Servlet规范2.3版开始,Servlet容器(例如Tomcat,Jetty等)必须保证可以监视定义为实现
ServletContextListener接口的任何Java类。该接口有两种简单的方法:
- 网络首次启动时会被调用的(
contextInitialized
) - 当您的网络应用结束时(
contextDestroyed
)被调用的一种。
结束可能是由于Servlet容器(例如:Tomcat)正在关闭,因此所有Web应用程序(“上下文”)都将结束,或者是因为仅Vaadin应用程序的上下文正在结束(如果Servlet容器支持按上下文关闭)
。
每个Servlet容器必须履行的契约是, 在 执行任何Servlet或过滤器 之前, 必须contextInitialized
调用 __每个ServletContextListener类(可以有多个)
。因此,这是进行初始化工作的最佳时机,它可能比单个Servlet请求-响应周期受益更多。如果您需要启动[H2
Database)之类的数据库,这是个好时机。如果您将某些数据作为高速缓存加载到内存中以供servlet反复使用,那么这是个好时机。例如,在进行某些日志记录工作或确定某些预期文件时,这也是测试应用程序资源的好时机。
同样,每个兼容的Servlet容器 contextDestroyed
仅 在 Servlet和过滤器完成最后一次调用 后才
调用。因此,这是关闭数据库,进行备份或执行适合于Web应用程序的其他清理工作的好地方。
我们正在讨论您的Web应用“上下文”的生命周期。该上下文可能涉及一个或多个servlet。上下文的生命周期超出了参与该上下文的任何servlet的生命周期。上下文有点像女王蜂,她在一个新的蜂巢中生出了所有的无人机,在那里她生活在它们的前面,当它们死去服役时,她将使它们死掉(如果这就是蜂巢的样子)作品?)。
定义你的 ServletContextListener
制作一个
ServletContextListener非常简单:使用一对方法和一个注释来制作一个类。
在Vaadin应用程序中添加一个新的Java类。您可以根据需要为课程命名。
我将上下文侦听器添加到与我的主要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;@WebListenerpublic 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." ); }}


