java----监听器的作用_一、理解监听器的作用
一、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----监听器的作用_一、理解监听器的作用相关推荐
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...
- java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用
深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...
- java 注解处理器的作用_深入理解Java:注解(Annotation)--注解处理器
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...
- finally在java程序中的作用_深入理解Java中的finally
问题 在Java的异常体系中,我们经常会使用finally语句块来保证进行一些无论有无异常都要执行的处理流程,但finally语句块与return语句究竟哪个先执行总是让人迷惑.根据书本介绍,似乎是f ...
- 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- java byte 判断相等_深入理解Java装箱与拆箱
写给小白看的Java基础知识,阅读本文大概需要7分钟 Java中有8种基础数据类型,boolean,char,byte,short,int,long,float,double.从jdk5开始提供了自动 ...
- java的弱引用_深入理解Java中的弱引用
不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...
- java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...
- java 线程的构造函数_深入理解Thread构造函数
本文参考汪文君著:Java高并发编程详解. 1.线程的命名 在构造现成的时候可以为线程起一个名字.但是我们如果不给线程起名字,那线程会有一个怎样的命名呢? 这里我们看一下Thread的源代码: pub ...
- java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...
最新文章
- JavaScript复习笔记(1)——AJAX
- Python编程基础:第四十节 类变量Class Variables
- 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
- VS2017 Intelligense C++ 设置的几个重点
- Integer 中的缓存类IntegerCache
- 深入理解JVM虚拟机-Ubuntu中安装openJDK
- Cherry,你会喜欢这种手机!
- 2004-7-1+ 用户控件(动态加载)
- ndarray负值统一置0,正数不变
- web-UI设计(设计思路篇)
- Git下载安装(官网) 拉取代码的两种方法
- 直流电机驱动电路设计
- 信用支付一路狂奔,未来这块蛋糕该怎么吃
- android安全漏洞(八)伪造短信(利用原生android4.0漏洞)
- 什么是网站权重?网站权重查询方法有哪些?
- ffmpeg简单操作mp3与mp4
- 四、VUE基础——记事本案例(小黑记事本)
- ubuntu和centos如何固化macvlan接口或vlan子接口配置
- 苹果手机数据线充不了电_手机充不满电?教你四个办法解决!
- 备战2019年全国大学生数学建模竞赛