一、Listener

Listener是Servlet的监听器

监听客户端的请求和服务器端的操作

通过实现Listener接口的类可以在特定事件(Event)发生时,自动激发一些操作

二、HttpSessionBindingListener

当一个实现了该接口的对象被捆绑到session中或者从session中被解放的时候启用此监听。

关键点:

创建类实现HttpSessionBindingListener接口

valueBound()

valueUnbound()

不需要在web.xml中配置监听器

监听范围:一对一

比如User这个类实现了该接口,则当这个对象被捆绑到session或者从session中被解除捆绑的时候启用此监听器。当被捆绑的时候,会自动进入valueBound()方法;当解除绑定的时候,会自动进入valueUnbound()方法。

三、实例

需求:统计在线人数;

实体类User:

package cn.kgc.pojo;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

import cn.kgc.util.Constants;

public class User implements HttpSessionBindingListener{

private int id;

private String userName;

private String password;

private String email;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

// 当User对象放进session时(一个用户登录),会自动进入该方法

public void valueBound(HttpSessionBindingEvent event) {

Constants.USER_COUNT ++;

}

// session失效(某个用户注销)、超时、手动地在session中把某个属性移除

public void valueUnbound(HttpSessionBindingEvent event) {

Constants.USER_COUNT --;

}

}

统计人数工具类,在该类中只有一个静态变量来统计人数:

package cn.kgc.util;

// 在线用户人数

public class Constants {

public static int USER_COUNT = 0;

}

登录页面:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'login.jsp' starting page

用户名:

登录数据处理页面:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'doLogin.jsp' starting page

String userName = request.getParameter("userName");

if (userName == null || userName.equals("")) {

response.sendRedirect("login.jsp");

} else {

User user = new User();

user.setUserName(userName);

// 走到这一步的时候监听器就会启动了

session.setAttribute("user", user);

response.sendRedirect("online.jsp");

}

%>

登录进来页面:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'online.jsp' starting page

User user = null;

if (session.getAttribute("user") == null) {

response.sendRedirect("login.jsp");

} else {

user = (User)session.getAttribute("user");

%>

欢迎你,

当前在线人数为:

离开

离开页面:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'loginout.jsp' starting page

// 离开、注销

session.invalidate();

%>

运行结果:

当登录一个人之后,会在online页面显示当前在线人数,当换一个浏览器登录之后,登录人数改变。

java----监听器的作用_一、理解监听器的作用相关推荐

  1. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...

    简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...

  2. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  3. java 注解处理器的作用_深入理解Java:注解(Annotation)--注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  4. finally在java程序中的作用_深入理解Java中的finally

    问题 在Java的异常体系中,我们经常会使用finally语句块来保证进行一些无论有无异常都要执行的处理流程,但finally语句块与return语句究竟哪个先执行总是让人迷惑.根据书本介绍,似乎是f ...

  5. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  6. java byte 判断相等_深入理解Java装箱与拆箱

    写给小白看的Java基础知识,阅读本文大概需要7分钟 Java中有8种基础数据类型,boolean,char,byte,short,int,long,float,double.从jdk5开始提供了自动 ...

  7. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  8. java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...

  9. java 线程的构造函数_深入理解Thread构造函数

    本文参考汪文君著:Java高并发编程详解. 1.线程的命名 在构造现成的时候可以为线程起一个名字.但是我们如果不给线程起名字,那线程会有一个怎样的命名呢? 这里我们看一下Thread的源代码: pub ...

  10. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

最新文章

  1. JavaScript复习笔记(1)——AJAX
  2. Python编程基础:第四十节 类变量Class Variables
  3. 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
  4. VS2017 Intelligense C++ 设置的几个重点
  5. Integer 中的缓存类IntegerCache
  6. 深入理解JVM虚拟机-Ubuntu中安装openJDK
  7. Cherry,你会喜欢这种手机!
  8. 2004-7-1+ 用户控件(动态加载)
  9. ndarray负值统一置0,正数不变
  10. web-UI设计(设计思路篇)
  11. Git下载安装(官网) 拉取代码的两种方法
  12. 直流电机驱动电路设计
  13. 信用支付一路狂奔,未来这块蛋糕该怎么吃
  14. android安全漏洞(八)伪造短信(利用原生android4.0漏洞)
  15. 什么是网站权重?网站权重查询方法有哪些?
  16. ffmpeg简单操作mp3与mp4
  17. 四、VUE基础——记事本案例(小黑记事本)
  18. ubuntu和centos如何固化macvlan接口或vlan子接口配置
  19. 苹果手机数据线充不了电_手机充不满电?教你四个办法解决!
  20. 备战2019年全国大学生数学建模竞赛

热门文章

  1. 快速用 Haskell 构建超级简单的 Web 技术栈!
  2. 揭秘支撑双 11 买买买背后的硬核黑科技!
  3. 你了解京东云区块链吗?点开有详情!
  4. Java 8 之后,还有哪些进化的功能?
  5. 直接拿来用!Visual Studio 扩展工具利用 AI 强化你的代码
  6. 5G 来了,需要更换 SIM 卡吗?
  7. 苹果输了,赔了高通 2 个亿
  8. @Python 程序员,如何实现狂拽酷炫的 3D 编程技术?
  9. 马蓉微博对呛王宝强,结果坑了新浪肥了阿里云
  10. A 站彻底要凉?近千万条用户数据外泄!