一、监听器简介

  监听器是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:

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.ServletContextEvent;
  4.  
  5. public class ServletContextListener implements javax.servlet.ServletContextListener{
  6. PrintStream out = System.out;
  7.  
  8. @Override
  9. public void contextInitialized(ServletContextEvent sce) {
  10. // TODO Auto-generated method stub
  11. out.println("ContextInit");
  12. }
  13.  
  14. @Override
  15. public void contextDestroyed(ServletContextEvent sce) {
  16. // TODO Auto-generated method stub
  17. out.println("ContextDestroyed");
  18. }
  19. }

web.xml

  1. <listener>
  2. <listener-class>com.listener.ServletContextListener</listener-class>
  3. </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)//监听修改属性

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.ServletContextAttributeEvent;
  4. import javax.servlet.ServletContextAttributeListener;
  5. import javax.servlet.ServletContextEvent;
  6.  
  7. public class ServletContextListener implements ServletContextAttributeListener{
  8. PrintStream out = System.out;
  9.  
  10. @Override
  11. public void attributeAdded(ServletContextAttributeEvent scae) {
  12. // TODO Auto-generated method stub
  13. out.println("AddAttribute");
  14. }
  15.  
  16. @Override
  17. public void attributeRemoved(ServletContextAttributeEvent scae) {
  18. // TODO Auto-generated method stub
  19. out.println("RemovedAttribute");
  20. }
  21.  
  22. @Override
  23. public void attributeReplaced(ServletContextAttributeEvent scae) {
  24. // TODO Auto-generated method stub
  25. out.println("ReplacedAddAttribute");
  26. }
  27. }

LoginServlet:

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import com.util.HttpPageUtil;
  11.  
  12. public class LoginServlet extends HttpServlet {
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. PrintWriter out = response.getWriter();
  15. String username = request.getParameter("username");
  16. ServletContext sc = this.getServletContext();
  17. //添加
  18. sc.setAttribute("Attribute", "addAttribute");
  19. //修改
  20. sc.setAttribute("Attribute", "reAttribute");
  21. //删除
  22. sc.removeAttribute("Attribute");
  23. HttpPageUtil.printHtmlPage(out, true);
  24. out.println("SerlvetContextAttribute");
  25. HttpPageUtil.printHtmlPage(out, false);
  26. System.out.println("Servlet");
  27. }
  28.  
  29. /**
  30. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  31. */
  32. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  33. // TODO Auto-generated method stub
  34. doGet(request, response);
  35. }
  36. }

控制台输出:

当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销毁时执行。

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.http.HttpSessionEvent;
  4.  
  5. public class HttpSessionListener implements javax.servlet.http.HttpSessionListener{
  6. PrintStream out = System.out;
  7.  
  8. @Override
  9. public void sessionCreated(HttpSessionEvent se) {
  10. // TODO Auto-generated method stub
  11. out.println("SeesionCreater");
  12. }
  13.  
  14. @Override
  15. public void sessionDestroyed(HttpSessionEvent se) {
  16. // TODO Auto-generated method stub
  17. out.println("SeesionDestroy");
  18. }
  19.  
  20. }

控制台输出:

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

  2.2.2HttpSessionAttributeListener

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

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

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

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

  1. HttpSessionAttributeListener
  1. public class HttpSessionListener implements javax.servlet.http.HttpSessionAttributeListener{
  2. PrintStream out = System.out;
  3.  
  4. @Override
  5. public void attributeAdded(HttpSessionBindingEvent se) {
  6. // TODO Auto-generated method stub
  7. out.println("SessionAttributeAdd");
  8. }
  9.  
  10. @Override
  11. public void attributeRemoved(HttpSessionBindingEvent se) {
  12. // TODO Auto-generated method stub
  13. out.println("SessionAttributeRemove");
  14. }
  15.  
  16. @Override
  17. public void attributeReplaced(HttpSessionBindingEvent se) {
  18. // TODO Auto-generated method stub
  19. out.println("SessionAttributeReplace");
  20. }
  21.  
  22. }

LoginServlet 

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9.  
  10. import com.util.HttpPageUtil;;
  11.  
  12. // http://localhost:8080/TestServlet/Filter/Login
  13. public class LoginServlet extends HttpServlet {
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. PrintWriter out = response.getWriter();
  16. String username = request.getParameter("username");
  17. HttpSession session = request.getSession();
  18. //添加
  19. session.setAttribute("attribute", "add");
  20. //修改
  21. session.setAttribute("attribute", "replace");
  22. //删除
  23. session.removeAttribute("attribute");
  24. HttpPageUtil.printHtmlPage(out, true);
  25. out.println("SessionAttributeListener");
  26. HttpPageUtil.printHtmlPage(out, false);
  27. System.out.println("Servlet");
  28. }
  29.  
  30. /**
  31. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  32. */
  33. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  34. // TODO Auto-generated method stub
  35. doGet(request, response);
  36. }
  37. }

控制台输出:

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

输出对应方法中的语句。

  2.3.1ServletRequestListener

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

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

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

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.ServletRequestEvent;
  4.  
  5. public class ServletRequest implements javax.servlet.ServletRequestListener{
  6. PrintStream out = System.out;
  7. @Override
  8. public void requestDestroyed(ServletRequestEvent sre) {
  9. // TODO Auto-generated method stub
  10. out.println("RequestDestroy");
  11. }
  12.  
  13. @Override
  14. public void requestInitialized(ServletRequestEvent sre) {
  15. // TODO Auto-generated method stub
  16. out.println("RequestInit");
  17. }
  18. }

LoginServlet:

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9.  
  10. import com.util.HttpPageUtil;;
  11.  
  12. // http://localhost:8080/TestServlet/Filter/Login
  13. public class LoginServlet extends HttpServlet {
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. System.out.println("intoServlet");
  16. }
  17.  
  18. /**
  19. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  20. */
  21. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22. // TODO Auto-generated method stub
  23. doGet(request, response);
  24. }
  25. }

但在地址栏通过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:

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.ServletRequestAttributeEvent;
  4.  
  5. public class ServletRequest implements javax.servlet.ServletRequestAttributeListener{
  6. PrintStream out = System.out;
  7.  
  8. @Override
  9. public void attributeAdded(ServletRequestAttributeEvent srae) {
  10. // TODO Auto-generated method stub
  11. out.println("AddAttribute");
  12. }
  13.  
  14. @Override
  15. public void attributeRemoved(ServletRequestAttributeEvent srae) {
  16. // TODO Auto-generated method stub
  17.  
  18. out.println("RemoveAttribute");
  19. }
  20.  
  21. @Override
  22. public void attributeReplaced(ServletRequestAttributeEvent srae) {
  23. // TODO Auto-generated method stub
  24. out.println("ReplaceAttribute");
  25. }
  26. }

LoginServlet:

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import java.util.Enumeration;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10.  
  11. import com.util.HttpPageUtil;;
  12.  
  13. public class LoginServlet extends HttpServlet {
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. //添加
  16. request.setAttribute("attribute", "add");
  17. //修改
  18. request.setAttribute("attribute", "replace");
  19. //删除
  20. request.removeAttribute("attribute");
  21. }
  22.  
  23. /**
  24. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  25. */
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. // TODO Auto-generated method stub
  28. doGet(request, response);
  29. }
  30. }

通过URL调用LoginServlet,

控制台输出:

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

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

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

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

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

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

  监听器中人数-1.

OnLineListener:

  1. import java.util.Set;
  2. import java.util.TreeSet;
  3.  
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.http.HttpSessionEvent;
  7.  
  8. public class OnLineListener implements javax.servlet.ServletContextListener, javax.servlet.http.HttpSessionListener{
  9. private ServletContext sc = null;
  10. private int count = 0;//记录登陆人数
  11. @Override
  12. public void sessionCreated(HttpSessionEvent se) {
  13. // TODO Auto-generated method stub
  14. //当创建用户session时,count++
  15. count++;
  16. //将人数设置在ServletContext中
  17. sc.setAttribute("count", new Integer(this.count));
  18. }
  19.  
  20. @Override
  21. public void sessionDestroyed(HttpSessionEvent se) {
  22. // TODO Auto-generated method stub
  23. //当ession销毁时,count--
  24. count--;
  25. //将人数设置在ServletContext中
  26. sc.setAttribute("count", new Integer(this.count));
  27. }
  28.  
  29. @Override
  30. public void contextInitialized(ServletContextEvent sce) {
  31. // TODO Auto-generated method stub
  32. //Tomcat启动时获取ServletContext,并设置一个登陆人数(初值为0);
  33. this.sc = sce.getServletContext();
  34. this.sc.setAttribute("count", new Integer(this.count));
  35. }
  36.  
  37. @Override
  38. public void contextDestroyed(ServletContextEvent sce) {
  39. // TODO Auto-generated method stub
  40. sc = null;
  41. }
  42. }

LoginServlet:

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10.  
  11. import com.util.*;
  12.  
  13. // http://localhost:8080/TestServlet/Filter/Login
  14. public class LoginServlet extends HttpServlet {
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. PrintWriter out = response.getWriter();
  17. String username = request.getParameter("username");
  18. HttpSession session = request.getSession();
  19. //获取ServletContext
  20. ServletContext sc = this.getServletContext();
  21. HttpPageUtil.printHtmlPage(out, true);
  22. //从ServletContext中获取人数。
  23. out.println("欢迎" + username + "当前在线人数" + ((Integer)sc.getAttribute("count")).intValue());
  24. HttpPageUtil.printHtmlPage(out, false);
  25. }
  26.  
  27. /**
  28. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  29. */
  30. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. // TODO Auto-generated method stub
  32. doGet(request, response);
  33. }
  34. }

login.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Login</title>
  8. </head>
  9. <body>
  10. <!--在.../Page/下重定向 不加 /的相对路径 -->
  11. <!-- http://localhost:8080/TestServlet/Page/Filter/Login -->
  12. <form name = f1 action ="/TestServlet/Filter/Login" method = "post">
  13. username:<input type = "text" name = "username" value = "${un}"></input><br>
  14. password:<input type = "password" name = "password" value = "${pw}"></input><br>
  15. <!-- 记住密码 :<input type = "radio" name = "SavePassword" value = "1"><br> -->
  16. <input type = "submit" value = "登录">
  17. </form>
  18. </body>
  19. </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. idea xml 绿背景色 去掉拼写检查

    去掉背景色 去掉拼写检查

  2. tomcat发布web项目的三种方式

    tomcat发布web项目的三种方式 方式一: 配置tomcat 安装目录下的conf/server.xml <Host name="loaclhost">标签里面添加 ...

  3. vue入门知识

    vue的特点在于:响应的数据绑定.组合的视图组件. vue的文件,分成三个部分<template>html模板</template>  <script>js< ...

  4. centos配置数据源和java环境配置

    ---恢复内容开始--- 一:前言 今天送走了一位同事,看着别人走勾起了我蠢蠢欲动的心啊,但是我知道,我不能那么的任性,我是men,这几天难得的清闲,所以我就弄一弄linux,昨天把网给配通了,今天配 ...

  5. [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算

    Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...

  6. BZOJ 100题纪念

  7. Invalidate()(转)

    原文转自 http://m.blog.csdn.net/blog/piaopiaopiaopiaopiao/41521211 使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_E ...

  8. python用户登录,密码错误3次则锁定

    需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3.判断 ...

  9. LeetCode 4 :Majority Element

    problem:Given an array of size n, find the majority element. The majority element is the element tha ...

  10. [ Openstack ] Openstack-Mitaka 高可用之 网络服务(Neutron)

    目录 Openstack-Mitaka 高可用之 概述    Openstack-Mitaka 高可用之 环境初始化    Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...