掠过的岁月

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1 基本概念

javaweb中的监听器是Servlet规范中定义的一种特殊的类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

2 Servlet监听器的分类

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContextHttpSessionServletRequest这三个域对象

a  监听域对象自身的创建和销毁的事件监听器。

b  监听域对象中的属性的增加和删除的事件监听器。

c   监听绑定到HttpSession域中的某个对象的状态的事件监听器。

3 监听ServletContext,HttpSession,ServletRequest域对象的创建和销毁

ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。

当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。

当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

ServletContext域对象创建和销毁时机:
  创建:服务器启动针对每一个Web应用创建ServletContext
  销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

范例:写一个HelloServletContextListener监听器demo,同时implements(实现)  ServletContextListener,ServletRequestListener,HttpSessionListener接口。

 1 package listener;
 2 
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5 import javax.servlet.ServletRequestEvent;
 6 import javax.servlet.ServletRequestListener;
 7 import javax.servlet.http.HttpSessionEvent;
 8 import javax.servlet.http.HttpSessionListener;
 9 
10 public class HelloServletContextListener  implements ServletContextListener,ServletRequestListener,HttpSessionListener{
11 
12     @Override
13     public void contextDestroyed(ServletContextEvent arg0) {
14         System.out.println("context被销毁"+arg0.getServletContext());
15         
16     }
17 
18     @Override
19     public void contextInitialized(ServletContextEvent arg0) {
20         System.out.println("context被创建"+arg0.getServletContext());
21         
22     }
23 
24     @Override
25     public void sessionCreated(HttpSessionEvent session) {
26         System.out.println("sesion被创建"+session.getSession().getId());//测试获取的sessionId
27         
28     }
29 
30     @Override
31     public void sessionDestroyed(HttpSessionEvent arg0) {
32         System.out.println("sesiont被销毁");
33     }
34 
35     @Override
36     public void requestDestroyed(ServletRequestEvent arg0) {
37         System.out.println("ruquest被销毁");
38         
39     }
40 
41     @Override
42     public void requestInitialized(ServletRequestEvent arg0) {
43         System.out.println("ruquest被创建");
44         
45     }
46 
47 }

4 在web.xml注册监听器,配置如下,监听器是所有Servlet配置中最简单的配置,只需要配置全类名就可以直接映射了。

1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="3.0"
3     xmlns="http://java.sun.com/xml/ns/javaee"
4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
6  <listener>
7     <listener-class> listener.HelloServletContextListener</listener-class>  
8  </listener>
9 </web-app>

 

5 经过以上2个步骤,我们完成了监听器的编写和注册,下面进行测试HttpSession,写一个index.jsp页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'index.jsp' starting page</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18     <!--
19     <link rel="stylesheet" type="text/css" href="styles.css">
20     -->
21   </head>
22   
23   <body>
24    hello  page<br>
25    访问页面就创建的id: ${pageContext.session.id }
26   </body>
27 </html>

 

6 前台页面访问效果以及后台输出的ID值展示

 

 

总结,在前台访问一个新的页面,会立即产生一个ID,同时也会调用ServletContext,HttpSession和ServletRequest的创建方法,从而具备监听作用。

 

posted on 2018-06-12 10:47  掠过的岁月  阅读(433)  评论(0编辑  收藏  举报