Servlet事件监听器.docx
- 文档编号:25036685
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:23
- 大小:21.01KB
Servlet事件监听器.docx
《Servlet事件监听器.docx》由会员分享,可在线阅读,更多相关《Servlet事件监听器.docx(23页珍藏版)》请在冰豆网上搜索。
Servlet事件监听器
在Servlet技术中已经定义了一些事件,并且我们可以针对这些事件来编写相关的事件监听器,从而对事件作出相应处理。
Servlet事件主要有3类:
Servlet上下文事件、会话事件与请求事件。
下面具体讲解这3类事件的监听器实现。
1.对Servlet上下文进行监听
可以监听ServletContext对象的创建和删除以及属性的添加、删除和修改等操作。
该监听器需要使用到如下两个接口类:
●ServletContextAttributeListener:
监听对ServletContext属性的操作,如增加、删除、修改操作。
●ServletContextListener:
监听ServletContext,当创建ServletContext时,激发contextInitialized(ServletContextEventsce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContext-Eventsce)方法。
2.监听Http会话
可以监听Http会话活动情况、Http会话中属性设置情况,也可以监听Http会话的active、paasivate情况等。
该监听器需要使用到如下多个接口类:
●HttpSessionListener:
监听HttpSession的操作。
当创建一个Session时,激发sessionCreated(SessionEventse)方法;当销毁一个Session时,激发sessionDestroyed(HttpSessionEventse) 方法。
●HttpSessionActivationListener:
用于监听Http会话active、passivate情况。
●HttpSessionAttributeListener:
监听HttpSession中属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEventse)方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEventse)方法;在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEventse)方法。
3.对客户端请求进行监听
对客户端的请求进行监听是在Servlet2.4规范中新添加的一项技术,使用的接口类如下:
●ServletRequestListener接口类。
●ServletRequestAttrubuteListener接口类。
Servlet上下文监听器实例
下面编写一个实例,使它能够对ServletContext以及属性进行监听。
由以上介绍可知,该类需要实现ServletContextAttributeListener和ServletContextListener接口类,其详细代码如下:
[java]viewplaincopyprint?
1.package servlet;
2.
3.import java.io.FileOutputStream;
4.
5.import java.io.PrintWriter;
6.
7.import javax.servlet.ServletContext;
8.
9.import javax.servlet.ServletContextAttributeEvent;
10.
11.import javax.servlet.ServletContextAttributeListener;
12.
13.import javax.servlet.ServletContextEvent;
14.
15.import javax.servlet.ServletContextListener;
16.
17.public class MyServletContextListener
18.
19. implements ServletContextListener,ServletContextAttributeListener{
20.
21. private ServletContext context = null; //定义一个ServletContext对象变量,赋为null
22.
23. public void contextInitialized(ServletContextEvent s) {
24.
25. //TODO 该方法实现了ServletContextListener接口定义的方法,对ServletContext进行初始化
26.
27. this.context = s.getServletContext(); //初始化一个ServletContext对象
28.
29. print("ServletContext初始化......"); //打印出该方法的操作信息
30.
31. }
32.
33. public void contextDestroyed(ServletContextEvent s) {
34.
35. //TODO 该方法实现了ServletContextListener接口类定义方法,用于释放ServletContext对象
36.
37. this.context = null;
38.
39. print("ServletContext被释放......");
40.
41. }
42.
43. public void attributeAdded(ServletContextAttributeEvent sa) {
44.
45. //TODO 当上下文添加属性时,将调用该方法。
这里只是将添加的属性信息打印出来
46.
47. print("增加ServletContext对象的一个属性:
attributeAdded('"+sa.getName()+"',' "+sa.getValue()+"')");
48.
49. }
50.
51. public void attributeRemoved(ServletContextAttributeEvent sa) {
52.
53. //TODO 当把ServletContext中的某个属性删除时,调用该方法
54.
55. print("删除ServletContext对象的某一个属性:
attributeRemoved('
56.
57. "+sa.getName()+"','")");
58.
59. }
60.
61. public void attributeReplaced(ServletContextAttributeEvent sa) {
62.
63. //TODO 当上下文进行属性值更新时,将调用该方法
64.
65. print("更改ServletContext对象的某一个属性:
attributeReplaced('
66.
67. "+sa.getName()+"','"+sa.getValue()+"')");
68.
69. }
70.
71. private void print(String message){
72.
73. //调用该方法在txt文件中打印出message字符串信息
74.
75. PrintWriter out = null;
76.
77. try{
78.
79. out = new PrintWriter(new FileOutputStream("D:
\\output.txt",true));
80.
81. out.println(new java.util.Date().toLocaleString()+" ContextListener:
"+message);
82.
83. out.close();
84.
85. }
86.
87. catch(Exception e)
88.
89. {
90.
91. e.printStackTrace();
92.
93. }
94.
95. }
96.
97.}
packageservlet;
importjava.io.FileOutputStream;
importjava.io.PrintWriter;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletContextAttributeEvent;
importjavax.servlet.ServletContextAttributeListener;
importjavax.servlet.ServletContextEvent;
importjavax.servlet.ServletContextListener;
publicclassMyServletContextListener
implementsServletContextListener,ServletContextAttributeListener{
privateServletContextcontext=null;//定义一个ServletContext对象变量,赋为null
publicvoidcontextInitialized(ServletContextEvents){
//TODO该方法实现了ServletContextListener接口定义的方法,对ServletContext进行初始化
this.context=s.getServletContext();//初始化一个ServletContext对象
print("ServletContext初始化......");//打印出该方法的操作信息
}
publicvoidcontextDestroyed(ServletContextEvents){
//TODO该方法实现了ServletContextListener接口类定义方法,用于释放ServletContext对象
this.context=null;
print("ServletContext被释放......");
}
publicvoidattributeAdded(ServletContextAttributeEventsa){
//TODO当上下文添加属性时,将调用该方法。
这里只是将添加的属性信息打印出来
print("增加ServletContext对象的一个属性:
attributeAdded('"+sa.getName()+"','"+sa.getValue()+"')");
}
publicvoidattributeRemoved(ServletContextAttributeEventsa){
//TODO当把ServletContext中的某个属性删除时,调用该方法
print("删除ServletContext对象的某一个属性:
attributeRemoved('
"+sa.getName()+"','")");
}
publicvoidattributeReplaced(ServletContextAttributeEventsa){
//TODO当上下文进行属性值更新时,将调用该方法
print("更改ServletContext对象的某一个属性:
attributeReplaced('
"+sa.getName()+"','"+sa.getValue()+"')");
}
privatevoidprint(Stringmessage){
//调用该方法在txt文件中打印出message字符串信息
PrintWriterout=null;
try{
out=newPrintWriter(newFileOutputStream("D:
\\output.txt",true));
out.println(newjava.util.Date().toLocaleString()+"ContextListener:
"+message);
out.close();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
程序说明:
该监听器类实现了ServletContextAttributeListener和ServletContextListener两个接口类中的5个方法:
●contextInitialized(ServletContextEvents)方法用来初始化ServletContext对象。
●contextDestroyed(ServletContextEvents)方法在上下文中删除某个属性时调用。
●attributeAdded(ServletContextAttributeEventsa)方法在上下文中添加一个新的属性时调用。
●attributeReplaced(ServletContextAttributeEventsa)方法在更新属性时调用。
●attributeRemoved(ServletContextAttributeEventsa)方法在上下文中删除某个属性时会被调用。
在使用这个监听器之前还需要在Web模块中的web.xml配置文件中进行声明,代码如下:
[java]viewplaincopyprint?
1.
2.
3.
4.
5.
接下来就编写JSP程序来操作ServletContext的属性,看看监听器程序作出什么反应,该JSP的一段代码如下:
[java]viewplaincopyprint?
1.<%
2.
3.out.println(“Test ServletContextListener”);
4.
5.application.setAttribute(“userid”,”zzb”); //添加一个属性
6.
7.application.setAttribute(“userid”,”zzb2”); //替换掉已经添加的属性
8.
9.application.removeAttribute(“userid”); //删除该属性
10.
11.%>
<%
out.println(“TestServletContextListener”);
application.setAttribute(“userid”,”zzb”);//添加一个属性
application.setAttribute(“userid”,”zzb2”);//替换掉已经添加的属性
application.removeAttribute(“userid”);//删除该属性
%>
代码说明:
当第一次添加属性userid时,监听器调用contextInitialized(ServletContextEvents)初始化监听方法和attributeAdded(ServletContextAttributeEventsa)添加属性监听方法。
可以查看D根目录下的output.txt文件内容,如下:
2006-7-1214:
07:
50ContextListener:
ServletContext初始化......
2006-7-1214:
13:
55ContextListener:
增加ServletContext对象的一个属性:
attributeAdded('userid','zzb')
2006-7-1214:
13:
55ContextListener:
更改ServletContext对象的某一个属性:
attributeReplaced('userid','zzb2')
2006-7-1214:
13:
55ContextListener:
删除ServletContext对象的某一个属性:
attributeRemoved('userid')
该log文件记录了监听器所做的动作。
12.2.2Http会话监听器实例
通过上一个监听器实例,读者应该对监听器的实现过程有所了解,本小节将要介绍基于Http会话的监听器。
首先创建监听器类MySessionListener.java,其源代码如下:
[java]viewplaincopyprint?
1.package servlet;
2.
3.import java.io.FileOutputStream;
4.
5.import java.io.PrintWriter;
6.
7.import javax.servlet.ServletContext;
8.
9.import javax.servlet.ServletContextEvent;
10.
11.import javax.servlet.ServletContextListener;
12.
13.import javax.servlet.http.HttpSessionActivationListener;
14.
15.import javax.servlet.http.HttpSessionAttributeListener;
16.
17.import javax.servlet.http.HttpSessionBindingEvent;
18.
19.import javax.servlet.http.HttpSessionEvent;
20.
21.import javax.servlet.http.HttpSessionListener;
22.
23.public class MySessionListener
24.
25. implements HttpSessionActivationListener,HttpSessionAttributeListener,
26.
27. HttpSessionListener,ServletContextListener{
28.
29. ServletContext context = null;
30.
31. int users = 0;
32.
33. public void sessionWillPassivate(HttpSessionEvent arg0) {
34.
35. //监听Http会话的passivate情况
36.
37. print("sessionWillPassivate("+arg0.getSession().getId()+")");
38.
39. }
40.
41. public void sessionDidActivate(HttpSessionEvent arg0) {
42.
43. //监听Http会话的active情况
44.
45. print("sessionDidActivate("+arg0.getSession().getId()+")");
46.
47. }
48.
49. public void attributeAdded(HttpSessionBindingEvent arg0) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Servlet 事件 监听器