一、监听器简介

  监听器是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;@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stubout.println("ContextInit");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stubout.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;@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.println("AddAttribute");}@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.println("RemovedAttribute");}@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.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;@Overridepublic void sessionCreated(HttpSessionEvent se) {// TODO Auto-generated method stubout.println("SeesionCreater");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO Auto-generated method stubout.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;@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.println("SessionAttributeAdd");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.println("SessionAttributeRemove");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.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;@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// TODO Auto-generated method stubout.println("RequestDestroy");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {// TODO Auto-generated method stubout.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;@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stubout.println("AddAttribute");}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stub
        out.println("RemoveAttribute");}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stubout.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;//记录登陆人数
    @Overridepublic void sessionCreated(HttpSessionEvent se) {// TODO Auto-generated method stub//当创建用户session时,count++count++;//将人数设置在ServletContext中sc.setAttribute("count", new Integer(this.count));}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO Auto-generated method stub//当ession销毁时,count--count--;//将人数设置在ServletContext中sc.setAttribute("count", new Integer(this.count));}@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stub//Tomcat启动时获取ServletContext,并设置一个登陆人数(初值为0);this.sc = sce.getServletContext();this.sc.setAttribute("count", new Integer(this.count));}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stubsc = 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();//获取ServletContextServletContext 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创建监听。

转载于:https://www.cnblogs.com/huang-changfan/p/10320746.html

1.8(学习笔记)监听器(Listener)相关推荐

  1. JavaWeb—监听器—Eclipse版动力节点学习笔记

    JavaWeb学习笔记 监听器 Listener 哔哩哔哩蛙课网[动力节点]JavaWeb-Eclipse版学习视频网址 解释 归属 备注 ServletRequestListener Request ...

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

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

  3. 【javaweb学习笔记】servlet-api,filter和Listener

    javaweb学习笔记 1. servlet-api 1.1 servlet初始化 1.2 ServletContext和context-param 2. 什么是业务层 3. IOC 3.1 耦合/依 ...

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

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

  5. 监听器(Listener)学习

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

  6. 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器

    这一小节学起来感觉有些吃力,里面很多概念理解的不是很清楚,如果有大佬看到描述错误的地方欢迎留言指正,避免误导他人. 再次声明,这只是我的个人学习笔记,不要当成教程去看,建议想学习CS的小伙伴可以看看A ...

  7. Android开源项目SlidingMenu本学习笔记(两)

    我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: 点击Bluetooth能 ...

  8. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  9. SpringMVC学习笔记整理

    SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记: 导入jar包 一:springmvc工作流程. ①.     servlet容器初始化一个request请求 ②.     Di ...

  10. Spring Boot 2 学习笔记(2 / 2)

    Spring Boot 2 学习笔记(1 / 2) - - - 45.web实验-抽取公共页面 46.web实验-遍历数据与页面bug修改 47.视图解析-[源码分析]-视图解析器与视图 48.拦截器 ...

最新文章

  1. WebMatrix 3发布了!
  2. ubuntu16.04 + cuda8.0安装
  3. c语言中的static变量和static函数
  4. hadoop基石HDFS
  5. Struts2的Stack Context和ValueStack
  6. php 修改文件访问时间,php获取文件的创建、修改时间及访问时间
  7. python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...
  8. Haoop0.20.1+Ubuntu11.10+Eclipse3.5.2
  9. 【1】JVM-内存模型
  10. SHP格式以及SHP矢量数据编辑软件ShpEditor介绍
  11. 分布式概念及相关的名词定义
  12. 长文图解工业HART总线协议
  13. 浙江大学计算机2018分数线,浙江大学2018多少录取分数线
  14. Representation Learning 表示学习(简单笔记)
  15. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
  16. TcaplusDB君 · 行业新闻汇编(11月08号)
  17. 看互联网将如何颠覆这17个传统行业
  18. PbS包覆钙钛矿量子点;PbS包覆CsPbI3量子点的透射电镜图和高分辨透射电子显微镜图像和光致发光光谱图齐岳生物
  19. Proxy SwitchyOmega,自动代理设置
  20. 专业人脸识别研究计算机的配置,联想电脑win10系统人脸识别登录的设置方法

热门文章

  1. superMap添加marker及连线
  2. 139.00.007 Git学习-Cheat Sheet
  3. Linux 中 SVN 重启关闭
  4. linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
  5. cocos2dx基础篇(29)——屏幕适配
  6. 工控图表控件ProEssentials改变子集的颜色和线条风格
  7. Python 查看服务器磁盘信息
  8. html表格以pdf格式导出到本地
  9. IOS微信6.7.4输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置...
  10. Java SpringMVC实现PC端网页微信扫码支付完整版