一、监听器简介

  监听器是web容器对某一些对象的监听,当某些对象发生创建、修改、删除的动作时,

  web容器会自动调用对应的监听器中的方法。

  例如A是监听器,B是被监听对象,A的监听任务是B回家时来开门。

  那么当B一回家,监听器A就会执行开门的操作。

二、监听器用法

  2.1.1 ServletContextListener

  用于监听ServletContext对象的创建及销毁,实际上就是监听Web应用的生命周期。

  首先我们要创建一个类,实现ServletContextListener接口,实现里面的两个方法:

  public void contextInitialized(ServletContextEvent sce)//web程序初始化时执行

  public void contextDestroyed(ServletContextEvent sce)//web程序销毁时执行

ContextListener:

import java.io.PrintStream;

import javax.servlet.ServletContextEvent;

public class ServletContextListener implements javax.servlet.ServletContextListener{
PrintStream out = System.out; @Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
out.println("ContextInit");
} @Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
out.println("ContextDestroyed");
}
}

web.xml

 <listener>
<listener-class>com.listener.ServletContextListener</listener-class>
</listener>

当打开Tomcat时,监听器监听到ServletContext开始初始化,会执行contextInitialized(),

打印出ContextInit。当关闭Tomcat时,监听器监听到ServeltContext已关闭,会执行contextDestroyed(),

打印出ContextDestroyed.

      

  2.1.2ServletContextAttrubute

  监听ServletContext属性列表发送更改。

  比如属性的添加(setAttrubute("a","a")、

  修改(setAttribute("a","A"))、删除(removeAttribute("a"))。

  ServletContextAttribute中有三个方法:

  attributeAdded(ServletContextAttributeEvent scae);//监听添加属性

  attributeRemoved(ServletContextAttributeEvent scae)//监听删除属性

  attributeReplaced(ServletContextAttributeEvent scae)//监听修改属性

import java.io.PrintStream;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent; public class ServletContextListener implements ServletContextAttributeListener{
PrintStream out = System.out; @Override
public void attributeAdded(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
out.println("AddAttribute");
} @Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
out.println("RemovedAttribute");
} @Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
out.println("ReplacedAddAttribute");
}
}

LoginServlet:

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.util.HttpPageUtil; public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
ServletContext sc = this.getServletContext();
//添加
sc.setAttribute("Attribute", "addAttribute");
//修改
sc.setAttribute("Attribute", "reAttribute");
//删除
sc.removeAttribute("Attribute");
HttpPageUtil.printHtmlPage(out, true);
out.println("SerlvetContextAttribute");
HttpPageUtil.printHtmlPage(out, false);
System.out.println("Servlet");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

控制台输出:

当LoginServlet中向ServletContext添加属性时,对应监听器监听到添加动作,

执行方法attributeAdded()方法输出AddAttribute,修改属性时执行attributeReplaced()方法

输出ReplacedAddAttribute,删除属性时执行attributeRemoved()方法,输出RemoveAttribute。

  2.2.1HttpSessionListener

  HttpSessionnLister主要用于监听Session的创建及销毁。

    public void sessionCreated(HttpSessionEvent se)//session创建时执行。

  public void sessionDestroyed(HttpSessionEvent se)//session销毁时执行。

import java.io.PrintStream;

import javax.servlet.http.HttpSessionEvent;

public class HttpSessionListener implements javax.servlet.http.HttpSessionListener{
PrintStream out = System.out; @Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
out.println("SeesionCreater");
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
out.println("SeesionDestroy");
} }

控制台输出:

但Session创建销毁时,监听器会监听到对应的动作并执行对方法。

  2.2.2HttpSessionAttributeListener

  主要监听Session对象属性的添加、修改、删除操作。

  public void attributeAdded(HttpSessionBindingEvent se);//添加session中属性时执行  

  public void attributeRemoved(HttpSessionBindingEvent se);//删除session中属性时执行

  public void attributeReplaced(HttpSessionBindingEvent se);//修改session中属性时执行

HttpSessionAttributeListener
public class HttpSessionListener implements javax.servlet.http.HttpSessionAttributeListener{
PrintStream out = System.out; @Override
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
out.println("SessionAttributeAdd");
} @Override
public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
out.println("SessionAttributeRemove");
} @Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
out.println("SessionAttributeReplace");
} }

LoginServlet 

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.util.HttpPageUtil;; // http://localhost:8080/TestServlet/Filter/Login
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
HttpSession session = request.getSession();
//添加
session.setAttribute("attribute", "add");
//修改
session.setAttribute("attribute", "replace");
//删除
session.removeAttribute("attribute");
HttpPageUtil.printHtmlPage(out, true);
out.println("SessionAttributeListener");
HttpPageUtil.printHtmlPage(out, false);
System.out.println("Servlet");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

控制台输出:

监听器会添加session中属性的增加、修改、删除,并执行对应方法

输出对应方法中的语句。

  2.3.1ServletRequestListener

  ServletRequestListener主要监听request的初始化和销毁。

  public void requestDestroyed(ServletRequestEvent sre);//request初始化时执行。

  public void requestInitialized(ServletRequestEvent sre);//request销毁时执行。

import java.io.PrintStream;

import javax.servlet.ServletRequestEvent;

public class ServletRequest implements javax.servlet.ServletRequestListener{
PrintStream out = System.out;
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
out.println("RequestDestroy");
} @Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
out.println("RequestInit");
}
}

LoginServlet:

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.util.HttpPageUtil;; // http://localhost:8080/TestServlet/Filter/Login
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("intoServlet");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

但在地址栏通过URL访问LoginServlet时:

控制台输出结果:

当发送一个访问请求时,请求初始化被监听器监听到,执行对应方法输出“RequestInit”。

然后到达LoginServlet进行输出"intoServlet",最后请求结束被监听器监听到,执行requestDestroyed方法

输出“RequestDestroy”。

  2.3.2 ServletRequestAttributeListener

  ServletResqeustAttributerListener主要监听reques中属性的创建、修改、删除。

  public void attributeAdded(HttpSessionBindingEvent se);//添加session中属性时执行  

  public void attributeRemoved(HttpSessionBindingEvent se);//删除session中属性时执行

  public void attributeReplaced(HttpSessionBindingEvent se);//修改session中属性时执行

RequestAttributeListener:

import java.io.PrintStream;

import javax.servlet.ServletRequestAttributeEvent;

public class ServletRequest implements javax.servlet.ServletRequestAttributeListener{
PrintStream out = System.out; @Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
out.println("AddAttribute");
} @Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub out.println("RemoveAttribute");
} @Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
out.println("ReplaceAttribute");
}
}

LoginServlet:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.util.HttpPageUtil;; public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//添加
request.setAttribute("attribute", "add");
//修改
request.setAttribute("attribute", "replace");
//删除
request.removeAttribute("attribute");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

通过URL调用LoginServlet,

控制台输出:

当在reques中设置属性时,对应监听器会监听到,并调用attributeAdded()方法,输出"AddAttribute".

当修改reqest中属性时,会调用attributeReplaced()方法,输出“ReplaceAttribute”.

当删除reques中属性时会嗲用attributeRemoved()方法,输出“RemoveAttribute”。

三、监听器实例(在线人数统计)

  首先在线人数应该是全站可见的,所以人数应该存放在作用域最大的ServletContexte中。

  每登入一个用户我们就创建一个Session,Session监听器中人数+1。当一个session销毁时

  监听器中人数-1.

OnLineListener:

import java.util.Set;
import java.util.TreeSet; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpSessionEvent; public class OnLineListener implements javax.servlet.ServletContextListener, javax.servlet.http.HttpSessionListener{
private ServletContext sc = null;
private int count = 0;//记录登陆人数
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
//当创建用户session时,count++
count++;
//将人数设置在ServletContext中
sc.setAttribute("count", new Integer(this.count));
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
//当ession销毁时,count--
count--;
//将人数设置在ServletContext中
sc.setAttribute("count", new Integer(this.count));
} @Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
//Tomcat启动时获取ServletContext,并设置一个登陆人数(初值为0);
this.sc = sce.getServletContext();
this.sc.setAttribute("count", new Integer(this.count));
} @Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
sc = null;
}
}

LoginServlet:

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.util.*; // http://localhost:8080/TestServlet/Filter/Login
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
HttpSession session = request.getSession();
//获取ServletContext
ServletContext sc = this.getServletContext();
HttpPageUtil.printHtmlPage(out, true);
//从ServletContext中获取人数。
out.println("欢迎" + username + "当前在线人数" + ((Integer)sc.getAttribute("count")).intValue());
HttpPageUtil.printHtmlPage(out, false);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<!--在.../Page/下重定向 不加 /的相对路径 -->
<!-- http://localhost:8080/TestServlet/Page/Filter/Login -->
<form name = f1 action ="/TestServlet/Filter/Login" method = "post">
username:<input type = "text" name = "username" value = "${un}"></input><br>
password:<input type = "password" name = "password" value = "${pw}"></input><br>
<!-- 记住密码 :<input type = "radio" name = "SavePassword" value = "1"><br> -->
<input type = "submit" value = "登录">
</form>
</body>
</html>

每登录一个用户都会为其创建一个Session,这里测试时最好用不同的浏览器。

如果是一个浏览器,此例中多次登录会被认为是一个session,不会触发Session创建监听。

1.8(学习笔记)监听器(Listener)的更多相关文章

  1. JavaWeb学习笔记—监听器

    监听器Listener是JavaWeb中的三大组件之一 按监听的对象划分,可以分为 ServletContext对象监听器 HttpSession对象监听器 ServletRequest对象监听器 按 ...

  2. javaweb学习总结—监听器(Listener)

    监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一 ...

  3. ServletListener对象学习笔记

    JavaWeb学习笔记--监听器详解 知识概要: 1.监听器下例子举例 2.Servlet规范中的监听器 3. 4. 1. 监听器下例子举例说明: /* Frame:事件源.发生事件的对象 Windo ...

  4. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. java监听器(Listener)学习笔记

    现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次, ...

  6. JavaWeb学习笔记(二十一)—— 监听器Listener

    一.监听器概述 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对 ...

  7. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  9. javaweb学习总结(四十七)——监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  10. JavaWeb学习笔记--Listener

    JSP中的监听器   Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止.Session会话的开始和销毁.用户请求的开始和结束等等.有时程序员需要在这些事件发生的时机执行一 ...

随机推荐

  1. HDU4280:Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. django 连接 oracle 问题

    安装 oracle 后,在 django 项目中连接出现问题记录. 问题1:pip install cx_Oacle 未出现任何问题,但运行过程出现: 原因:连接 oracle 的工具 cx_Orac ...

  3. oracle数据库cmd导出数据和导入数据

    一:前言 每次我自己来导出oracle数据的数据进行备份的时候都是要看一遍记载的语句,还别说自己敲多了,也熟练了,但是还是不是很放心,所以就记载下来吧. 二:内容 (1).最简单,最直接的导入方式(这 ...

  4. Notepad++64插件安装方法

    首先通过https://github.com/bruderstein/nppPluginManager/releases下载"nppPluginManager",下载解压后放到对应 ...

  5. 图论:KM算法

    如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...

  6. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  7. 知问前端——日历UI(三)

    datepicker日期选择选项 属性 默认值/类型 说明 minDate 无/对象.字符串或数值 日历中可以选择的最小日期 maxDate 无/对象.字符串或数值 日历中可以选择的最大日期 defa ...

  8. 【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币

    [算法]DP [题解] 如果每个排列算一种,则令f[i]表示凑成面值为i的方案数,容易推出f[i]+=f[i-a[j]]. 现在是每个组合才算一种,令f[i][j]第二维表示只使用前j种面值,f[i] ...

  9. bzoj1008 矩乘递推

    2013-11-17 10:38 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1008 比较水的题,直接矩阵乘法+递推就OK了 w[i,0 ...

  10. django自带的orm之查询

    一.filter条件查询 用法: 模型类.objects.filter(模型类属性名__查询操作符 = 值) 判等: exact # 例:查询id为1的员工 select * from employe ...