servlet listenercontextlistener 什么时候被触发

本帖子已过去太久远了,不再提供回复功能。JAVA基础篇(11)
1.首先来看一看源码 该类的源码
public interface ServletContextListener extends EventListener {
* Receives notification that the web application initialization
* process is starting.
* &p&All ServletContextListeners are notified of context
* initialization before any filters or servlets in the web
* application are initialized.
* @param sce the ServletContextEvent containing the ServletContext
* that is being initialized
public void contextInitialized(ServletContextEvent sce);
* Receives notification that the ServletContext is about to be
* shut down.
* &p&All servlets and filters will have been destroyed before any
* ServletContextListeners are notified of context
* destruction.
* @param sce the ServletContextEvent containing the ServletContext
* that is being destroyed
public void contextDestroyed(ServletContextEvent sce);
此接口中提供了两个方法,用于监听ServletContext &的创建和销毁,也就是监听ServletContext 的生命周期,可以说成是监听Web 应用的生命周期,当web应用启动后,就会触发ServletContextEvent&事件 当此事件执行时,就会被ServletContextListener 监听器监听到,会调用他的&contextInitialized(ServletContextEvent&sce)
&方法,通过sce 可以获取ServletContext 实例,初始化一些数据,例如缓存的应用,如,创建数据库连接,读取数据库数据,通过setAttribute(“”,obj) 方法设置数据,然后就是可通过servlet 获取servletContext 的实例,通过getAttribute(&&) 获取设置的数据
实现代码:
public class MyContextListener implements ServletContextListener {
private ServletContext context =
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
User user = DatabaseManager.getUserById(1);
context.setAttribute(&user1&, user);
public void contextDestroyed(ServletContextEvent event) {
User user = (User)context.getAttribute(&user1&);
DatabaseManager.updateUserData(user);
this.context =
如果是web 项目 最后一步是使 ServletContext 生效,需要在web.xml 中配置监听器,并且web.xml 把它放在正确的WEB-INF/classes目录下,
&listener&
&listener-class&MyServletContextListener&/listener-class&
&/listener&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25308次
排名:千里之外
原创:38篇
转载:23篇
(2)(7)(1)(11)(20)(3)(2)(4)(3)(1)(1)(2)(1)(1)(3)(1)24921人阅读
java编程(28)
Servlet API
ServletContextListener
接口,它能够监听
ServletContext
对象的生命周期,实际上就是监听
应用的生命周期。
容器启动或终止Web
应用时,会触发ServletContextEvent
事件,该事件由
ServletContextListener
来处理。在 ServletContextListener
接口中定义了处理ServletContextEvent
事件的两个方法。
contextInitialized(ServletContextEvent
:当Servlet
容器启动Web
应用时调用该方法。在调用完该方法之后,容器再对Filter
初始化,并且对那些在Web
应用启动时就需要被初始化的Servlet
进行初始化。
contextDestroyed(ServletContextEvent
:当Servlet
容器终止Web
应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet
下面通过两个具体的例子来介绍
ServletContextListener
例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的
就可以通过
getAttribute
进行属性值的访问。有如下两个步骤:
ServletContext
对象是一个为整个
应用提供共享的内存,任何请求都可以访问里面的内容
:如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:
servletContextListerner
并将要共享的通过
setAttribute
)方法提交到内存中去
)应用项目通过
getAttribute(name)
将数据取到
ServletContextT&
java.sql.C&
java.sql.PreparedS&
java.sql.ResultS&
java.util.HashM&
java.util.M&
javax.servlet.ServletC&
javax.servlet.ServletContextE&
javax.servlet.ServletContextL&
util.ConnectT&
class ServletContextLTest implements ServletContextListener{&
实现其中的销毁函数
&&& public void contextDestroyed(ServletContextEvent
&&& &&&&System.out.println(&this
is last destroyeed&);& &&
实现其中的初始化函数,当有事件发生时即触发
&&& public void
contextInitialized(ServletContextEvent sce) {&
&&&&&&& ServletContext
sct=sce.getServletContext();&
&&&&&&& Map&Integer,String& depts=new
HashMap&Integer,String&();&
&&&&&&& Connection connection=&
&&&&&&& PreparedStatement pstm=&
&&&&&&& ResultSet rs=&
&&&&&&& try{&
&&&&&&&&&&&
connection=ConnectTool.getConnection();&
&& &&&&&&&&&String sql=&select deptNo,dname
from dept&;&
&&&&&&&&&&&
pstm=connection.prepareStatement(sql);&
&&&&&&&&&&& rs=pstm.executeQuery();&
&&&&&&&&&&& while(rs.next()){&
&&&&&&&&&&& &&&&depts.put(rs.getInt(1),
rs.getString(2));&
&&&&&&&&&&& }&
&&&&&&&&&&& //
将所取到的值存放到一个属性键值对中
&&&&&&&&&&& sct.setAttribute(&dept&,
&&&&&&&&&&&
System.out.println(&======listener test is beginning=========&);&
&&&&&&& }catch(Exception e){&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }finally{&
&&&&&&&&&&& ConnectTool.releasersc(rs, pstm,
connection);&
&&&&&&& }&
在完成上述编码后,仍需在
中进行如下配置,以使得该监听器可以起作用。
&listener&&
&listener-class&ServletContextTest.ServletContextLTest&/listener-class&&
&/listener&&
在完成上述配置后,
服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。
ServletContextT&
java.io.IOE&
java.io.PrintW&
java.util.*;&
javax.servlet.ServletC&
javax.servlet.ServletE&
javax.servlet.http.HttpS&
javax.servlet.http.HttpServletR&
javax.servlet.http.HttpServletR&
class CreateEmployee extends HttpServlet{&
&&& @Override&
&&& protected void service(HttpServletRequest
request, HttpServletResponse response)&
&&&&&&&&&&& throws ServletException,
IOException {&
&&&&&&& ServletContext
sct=getServletConfig().getServletContext();&
从上下文环境中通过属性名获取属性值
&&&&&&& Map&Integer,String&
dept=(Map&Integer,String&)sct.getAttribute(&dept&);&
&&&&&&& Set&Integer&
key=dept.keySet();&
response.setContentType(&text/charset=utf-8&);&
&&&&&&& PrintWriter
out=response.getWriter();&
out.println(&&html&&);&
out.println(&&body&&);&
&&&&&&& out.println(&&form
action='/register' action='post'&&);&
&&&&&&& out.println(&&table
alignb='center'&&);&
out.println(&&tr&&);&
out.println(&&td&&);&
out.println(&username:&);&
out.println(&&/td&&);&
out.println(&&td&&);&
&&&&&&& out.println(&&input type='text'
name='username'&);&
out.println(&&/tr&&);&
out.println(&&tr&&);&
&&&&&&& out.println(&&td&&);&
&&&&&&& out.println(&city:&);&
out.println(&&/td&&);&
out.println(&&td&&);&
&&&&&&& out.println(&&select
name='dept'&);&
&&&&&&& for(Integer i:key){&
&&&&&&&&&&& out.println(&&option
value='&+i+&'&&+dept.get(i)+&&/option&&);&
&&&&&&& }&
out.println(&&/select&&);&
out.println(&&/td&&);&
out.println(&&tr&&);&
out.println(&&/table&&);&
out.println(&&/form&&);&
out.println(&&/body&&);&
out.println(&&/html&&);&
&&&&&&& out.flush();&
例二:书写一个类用于统计当Web
应用启动后,网页被客户端访问的次数。如果重新启动Web
应用,计数器不会重新从1
开始统计访问次数,而是从上次统计的结果上进行累加。在实际应用中,往往需要统计自Web
应用被发布后网页被客户端访问的次数,这就要求当Web
应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web
应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。
向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener
类来完成,它具有以下功能:
应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter
对象存放到 Web
应用范围内。存放计数器的文件的路径为helloapp/count/count.txt
应用终止时把Web
应用范围内的计数器的数值保存到count.txt
ServletContextT&
javax.servlet.ServletC&
javax.servlet.ServletContextE&
javax.servlet.ServletContextL&
class MyServletContextListener implements ServletContextListener{
& public void
contextInitialized(ServletContextEvent sce){
&&& System.out.println(&helloapp
application is Initialized.&);
ServletContext
&&& ServletContext
context=sce.getServletContext();
从文件中读取计数器的数值
&&&&&& BufferedReader reader=new
BufferedReader(
&&&&&&&&&& new InputStreamReader(context.
&&&&&&&&&&
getResourceAsStream(&/count/count.txt&)));
&&&&&& int
count=Integer.parseInt(reader.readLine());
&&&&&& reader.close();
创建计数器对象
&&&&&& Counter counter=new Counter(count);
把计数器对象保存到
context.setAttribute(&counter&,counter);
&&&&&& } catch(IOException e) {
&&&&&&&&& e.printStackTrace();
&& public void
contextDestroyed(ServletContextEvent sce){
&&& &&&System.out.println(&helloapp
application is Destroyed.&);
ServletContext
&&&&&& ServletContext
context=sce.getServletContext();
应用范围获得计数器对象
&&&&&& Counter
counter=(Counter)context.getAttribute(&counter&);
&&&&&& if(counter!=null){
&&&&&& try{
&&&&&&&&& //
把计数器的数值写到
&&&&&&&&& String
filepath=context.getRealPath(&/count&);
filepath=filepath+&/count.txt&;
&&&&&&&&& PrintWriter pw=new
PrintWriter(filepath);
&&&&&&&&& pw.println(counter.getCount());
&&&&&&&&& pw.close();
&&&&&&&& } catch(IOException e) {
&&&&&&&&&&&& e.printStackTrace();
&&&&&&&& }
将用户自定义的
MyServletContextListener
容器进行注册,
容器会在启动或终止
应用时,会调用该监听器的相关方法。在
&listener&
元素用于向容器注册监听器:
&listener&
&listener-class&
ServletContextTest
.MyServletContextListener&listener-class
&/listener&
通过上述两个例子,即可以非常清楚的了解到
ServletContextListener
接口的使用方法及技巧。
在Container
应用程序时(例如启动 Container
之后),会呼叫contextInitialized()
,而当容器移除Web
应用程序时,会呼叫contextDestroyed ()
控制台的打印结果的先后顺序,会发现当 Web
应用启动时,Servlet
容器先调用contextInitialized()
方法,再调用lifeInit
方法;当Web
应用终止时,Servlet
容器先调用lifeInit
的destroy()
方法,再调用contextDestroyed()
方法。由此可见,在Web
应用的生命周期中,ServletContext
对象最早被创建,最晚被销毁。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:486320次
积分:4473
积分:4473
排名:第5390名
原创:76篇
转载:18篇
评论:134条
(1)(7)(1)(6)(2)(1)(6)(4)(2)(6)(17)(1)(3)(3)(5)(1)(2)(8)(9)(1)(1)(2)(2)(2)(4)vivisran 的BLOG
用户名:vivisran
文章数:80
评论数:54
访问量:56409
注册日期:
阅读量:5863
阅读量:12276
阅读量:390374
阅读量:1081328
51CTO推荐博文
在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
contextInitialized(ServletContextEvent sce)
* 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
contextDestroyed(ServletContextEvent sce)一、自定义上下文监听public class CmsiListener implements ServletContextListener {
private static Log log = LogFactory.getLog(CmsiListener.class);
public void contextInitialized(ServletContextEvent servletContextEvent) {
servletContextEvent.getServletContext().log("listener start");
public void contextDestroyed(ServletContextEvent servletContextEvent) {
servletContextEvent.getServletContext().log("listener destroyed");
}二、部署ServletContextListener实现(implements)了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes目录下,更改WEB-INF目录下的 web.xml文件,在web-app节点里添加 &listener&
&listener-class&CmsiListener&/listener-class&
&/listener&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)使用ServletContextListener监听器 - 博客频道 - CSDN.NET
思考的艺术
创建价值的时代
分类:Servlet
//使用ServletContextListener监听器
在Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是
监听Web应用的生命周期
当Servlet容器启动或终止时,会触发ServletContextEvent事件,该事件由ServletListener来处理,在ServletContextListener
接口中定义了处理ServletContextEvent事件的两个方法
contextInitialized(ServletContextEvent sce):当Servlet容器启动Web应用时调用该方法,在调用该方法之后
容器再对Filter初始化,并且对那些再Web应用启动时就需要被初始化的Servlet初始化
contextDestroyed(ServletContextEvent sce):当Serlvet容器终止Web应用时调用该方法,在调用该方法之前
容器会销毁所有的Serlvet和Filter过滤器
排名:第6617名
(13)(6)(142)(7)(29)(0)(2)(4)(4)(2)(2)(14)(4)(0)(1)(1)(13)(2)(11)(1)(21)(2)(8)(15)(2)(2)(1)(2)(8)(9)(1)(1)(4)(1)(2)(18)(4)(22)(5)(15)(3)(9)(1)(1)(5)(2)(1)(1)(1)(0)(5)(1)(1)(0)(2)(2)(3)(4)(1)(1)(1)(1)(0)(2)(1)(1)(1)(1)(1)(5)(3)(2)(1)(2)(1)(1)(1)(1)(1)(1)(1)
常见编程图书

我要回帖

更多关于 servletlistener 的文章

 

随机推荐