# Listener
## 简介
监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
Servlet 监听器:Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的 **ServletContext**, **HttpSession** 和 **ServletRequest** 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
### Servlet 监听器的分类
按监听的事件类型 Servlet 监听器可分为如下三种类型:
--监听域对象自身的创建和销毁的事件监听器
--监听域对象中的属性的增加和删除的事件监听器
--监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
### HelloServletContextListener
~~~
package com.neusoft.javaweb.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class HelloServletContextListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Servlet被销毁");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servlet被创建");
}
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("ServletRequest被销毁");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("ServletRequest被创建");
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("HttpSession被创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("HttpSession被销毁");
}
}
~~~
web.xml
~~~
<!-- 配置Listener -->
<listener>
<listener-class>com.neusoft.javaweb.listener.HelloServletContextListener</listener-class>
</listener>
~~~
ServletContextListener是最常用的Listener,可以在当前WEB应用被加载时对当前WEB应用的相关资源进行初始化操作,例如:读取当前WEB应用的初始化参数。
### 典型案例--使用Listener统计在线人数
hello.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello Page</h1>
<a href="logout.jsp">logout...</a>
</body>
</html>
~~~
logout.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>已退出</h1>
<%
request.getSession().invalidate();
%>
</body>
</html>
~~~
NumberOfOnlineListener
~~~
package com.neusoft.javaweb.listener;
import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* Application Lifecycle Listener implementation class NumberOfOnlineListener
*
*/
@WebListener
public class NumberOfOnlineListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent sev) {
// 1.获取在线人数
ServletContext context = sev.getSession().getServletContext();
HashSet<HttpSession> set = (HashSet<HttpSession>)context.getAttribute("onlineCount");
if(set == null) {
set = new HashSet();
}
set.add(sev.getSession());
// 跟新在线人数
context.setAttribute("onlineCount", set);
System.out.println("在线人数:"+set.size());
}
public void sessionDestroyed(HttpSessionEvent sev) {
// 1.获取在线人数
ServletContext context = sev.getSession().getServletContext();
HashSet<HttpSession> set = (HashSet<HttpSession>)context.getAttribute("onlineCount");
set.remove(sev.getSession());
sev.getSession().invalidate();
context.setAttribute("onlineCount", set);
System.out.println("在线人数:"+set.size());
}
}
~~~
- 第一章 配置和安装Tomcat
- 第二章 Servlet(一)
- 第三章 Servlet(二)
- 练习 一 . Servlet配置级获取初始化参数
- 第四章 JSP(一)
- 第五章 JSP(二)
- 第六章 MVC设计模式
- 第七章 Cookie
- 第八章 Session
- 练习 二 . 简易版购物车
- 第九章 EL表达式
- 第十章 JSTL
- 第十一章 过滤器
- 第十二章 监听器
- 第十三章 文件的上传与下载
- 复习总结
- 如何手动启动Tomcat
- 如何修改Tomcat端口号
- 如何在web.xml中配置Servlet
- Servlet生命周期
- load-on-startup参数
- Servlet映射路径
- POST和GET的区别
- JSP中9个隐式对象及功能
- 请求转发及请求重定向的区别
- JSP指令有哪些
- 简述对MVC设计模式的理解
- 简述Cookie机制
- 简述Session机制
- HttpSession的生命周期
- Cookie和Session有什么区别
- 简述创建过滤器步骤
- 过滤器经典案例--统一编码字符集
- getParameter与getAttribute的区别
- JSP页面中可以包含哪些元素
- web应用中,是如何跟踪用户的
- InteliJ创建web项目