一、概念
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
二、Servle监听器
1、编写 Servlet监听器
(1)和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。
(2)和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源中。
(3)一个 web.xml文件中可以配置多个 Servlet 事件监听器,web服务器按照它们在web.xml 文件中的注册顺序来加载和注册这些 Serlvet事件监听器。
2、在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext, HttpSession 和ServletRequest 这三个域对象。
(1)监听servletContext域对象创建和销毁
①ServletContextListener接口用于监听 ServletContext 对象的创建和销毁事件。
ⅰ当 ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
ⅱ当 ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
②servletContext域对象何时创建和销毁:
ⅰ创建:服务器启动针对每一个web应用创建servletcontext
ⅱ销毁:服务器关闭前先关闭代表每一个web应用的servletContext
(2)监听HttpSession域对象创建和销毁
①HttpSessionListener接口用于监听HttpSession创建和销毁
ⅰ创建一个Session时,sessionCreated(HttpSessionEventse)方法将会被调用。
ⅱ销毁一个Session时,sessionDestroyed (HttpSessionEventse)方法将被调用。
②Session域对象创建和销毁的时机创建:用户每一次访问时,服务器创建session
销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间
(3)监听HttpRequest域对象创建和销毁
①ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁。
ⅰRequest对象被创建时,监听器的requestInitialized方法将会被调用。
ⅱRequest对象被销毁时,监听器的requestDestroyed方法将会被调用。
②servletRequest域对象创建和销毁的时机:
ⅰ创建:用户每一次访问,都会创建一个reqeust
ⅱ销毁:当前访问结束,request对象就会销毁
3、Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
(1)监听三个域对象创建和销毁的事件监听器
(2)监听域对象中属性的增加和删除的事件监听器
(3)监听绑定到HttpSession域中的某个对象的状态的事件监听器。
Servlet监听器在开发中的应用案例:
4、监听三个域对象属性变化
(1)Servlet规范定义了监听 ServletContext, HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器。
(2)这三个监听器接口分别是ServletContextAttributeListener,HttpSessionAttributeListener ServletRequestAttributeListener
(3)这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
5、attributeAdded方法
(1)当向被监听器对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
(2)各个域属性监听器中的完整语法定义为:
ⅰpublic voidattributeAdded(ServletContextAttributeEvent scae)
ⅱpublic void attributeAdded(HttpSessionBindingEvent hsbe)
ⅲpublic voidattributeAdded(ServletRequestAttributeEvent srae)
6、attributeRemoved方法
(1)当删除被监听对象中的一个属性时,web容器调用事件监听器的这个方法进行相应
(2)各个域属性监听器中的完整语法定义为:
①public voidattributeRemoved(ServletContextAttributeEvent scae)
②public void attributeRemoved(HttpSessionBindingEventhsbe)
③public void attributeRemoved(ServletRequestAttributeEvent srae)
7、attributeReplaced方法
(1)当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应
(2)各个域属性监听器中的完整语法定义为:
①public voidattributeReplaced(ServletContextAttributeEvent scae)
②public void attributeReplaced(HttpSessionBindingEventhsbe)
③public void attributeReplaced(ServletRequestAttributeEvent srae)
监听器
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器典型案例:监听window窗口的事件监听器
Servle监听器
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
监听三个域对象创建和销毁的事件监听器
监听域对象中属性的增加和删除的事件监听器
监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)
监听servletContext域对象创建和销毁
ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
提问,servletContext域对象何时创建和销毁:
创建:服务器启动针对每一个web应用创建servletcontext
销毁:服务器关闭前先关闭代表每一个web应用的servletContext
编写 Servlet 监听器
和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。
和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源中。
一个 web.xml 文件中可以配置多个 Servlet 事件监听器,web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。
监听HttpSession域对象创建和销毁
HttpSessionListener接口用于监听HttpSession创建和销毁
创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。
销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。
Session域对象创建和销毁的时机创建:用户每一次访问时,服务器创建session
销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间
ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁。
Request 对象被创建时,监听器的requestInitialized方法将会被调用。
Request对象被销毁时,监听器的requestDestroyed方法将会被调用。
(此处复习request对象,在浏览器窗口中多次刷新访问servlet,看request对象的创建和销毁,并写一个servlet,然后用sendRedirect、forward方式跳转到其它servlet,查看request对象的创建和消耗)
servletRequest域对象创建和销毁的时机:
创建:用户每一次访问,都会创建一个reqeust
销毁:当前访问结束,request对象就会销毁
Servlet监听器在开发中的应用案例:统计当前在线人数
- <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'index.jsp' starting page</title>
- </head>
- <body>
- 当前网站访问量: ${applicationScope.count }
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
当前网站访问量: ${applicationScope.count }
</body>
</html>
- package com.hbsi.web.listener;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- public class CountLineListenerimplements HttpSessionListener{
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- ServletContext context=se.getSession().getServletContext();
- Integer count=(Integer) context.getAttribute("count");
- if(count==null){
- count=1;
- context.setAttribute("count", count);
- }else{
- count++;
- context.setAttribute("count", count);
- }
- }
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- ServletContext context=se.getSession().getServletContext();
- Integer count=(Integer) context.getAttribute("count");
- count--;
- }
- }
package com.hbsi.web.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class CountLineListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context=se.getSession().getServletContext();
Integer count=(Integer) context.getAttribute("count");
if(count==null){
count=1;
context.setAttribute("count", count);
}else{
count++;
context.setAttribute("count", count);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context=se.getSession().getServletContext();
Integer count=(Integer) context.getAttribute("count");
count--;
}
}
- <?xmlversion="1.0"encoding="UTF-8"?>
- <web-appversion="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <listener>
- <listener-class>com.hbsi.web.listener.CountLineListener</listener-class>
- </listener>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>