监听器(listener):对项目起到监听的作用,它能感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化

  监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件,它还可以监听域对象的属性发生修改的事件,可以在事件发生前或者发生后做一些必要的处理

  这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同

  

session和application监听器

  application监听器

package com.Gary.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; @WebListener
public class ApplicationListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("application被销毁出来");
} @Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("application被创建出来,这里可以做一些初始化的事情");
} }

ApplicationListener.java

package com.Gary.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; @WebListener
public class SessionListener implements HttpSessionListener { public SessionListener() {
// TODO Auto-generated constructor stub
} public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sessionCreated被创建");
} public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sessionCreated被销毁");
} }

SessionListener.java

package com.Gary.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener; @WebListener
public class RequestListener implements ServletRequestListener { public RequestListener() {
// TODO Auto-generated constructor stub
} public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("requestDestroyed");
} public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("requestInitialized");
} }

RequestListener.java

 配置监听器方式

  监听器申明

@WebListener

  

  web.xml中配置监听器

      <listener>
<listener-class></listener-class>
</listener>
<!--   <listener> -->
<!-- <listener-class>com.Gary.listener.SessionListener</listener-class> -->
<!-- </listener> --> <!-- Session超过1分钟后,服务器会自动放弃Session信息 默认三十分钟-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>

application的属性监听器

  当整个项目启动时,系统会往application中塞一些东西调用一次attributeAdded(),进入attributelistener.jsp后若不存在application.setAttribute("number",100)时候会再一次调用attributeAdded(),当存在application.setAttribute("number",100)时系统会调用attributeReplaced()

  ApplicationAttributeListener用来监听application.setAttribute()和application.removeAttribute()

  同理session和requset

<%
application.setAttribute("number",100);
// application.removeAttribute("number");
%>

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
application.setAttribute("number",100);
// application.removeAttribute("number");
%>
</body>
</html>

attributelistener.jsp

package com.Gary.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener; @WebListener
public class ApplicationAttributeListener implements ServletContextAttributeListener{ @Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("attributeAdded");
} @Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("attributeRemoved");
} @Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
// arg0.getName();
System.out.println("attributeReplaced");
} }

ApplicationAttributeListener.java

Session实现单点登录(备份)

  同一用户登录同一网址时会把前一个用户挤下来

public class SessionManager {
public static Map<String,HttpSession> sessionMap = new HashMap<String,HttpSession >();
}
    public void attributeAdded(HttpSessionBindingEvent arg0)  {
if(arg0.getName().equals("user")) {
User u = (User) arg0.getValue();
//判断是否有其他客户端已经登录
if(SessionManager.sessionMap.containsKey(u.getUsername())) {
//获得另外一个客户端的session
HttpSession session = SessionManager.sessionMap.get(u.getUsername());
//把登录信息从这个客户端抹除
session.removeAttribute("user");
//从session集合里面移除对应的用户名
SessionManager.sessionMap.remove(u.getUsername());
} SessionManager.sessionMap.put(u.getUsername(), arg0.getSession());
}
}
package com.sikiedu.util;

import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpSession; public class SessionManager {
public static Map<String,HttpSession> sessionMap = new HashMap<String,HttpSession >();
}

SessionManager.java

  

package com.sikiedu.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; import com.sikiedu.model.User;
import com.sikiedu.util.SessionManager; /**
* Application Lifecycle Listener implementation class SessionAttributeListener
*
*/
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener { /**
* Default constructor.
*/
public SessionAttributeListener() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
*/
public void attributeAdded(HttpSessionBindingEvent arg0) {
if(arg0.getName().equals("user")) {
User u = (User) arg0.getValue();
//判断是否有其他客户端已经登录
if(SessionManager.sessionMap.containsKey(u.getUsername())) {
//获得另外一个客户端的session
HttpSession session = SessionManager.sessionMap.get(u.getUsername());
//把登录信息从这个客户端抹除
session.removeAttribute("user");
//从session集合里面移除对应的用户名
SessionManager.sessionMap.remove(u.getUsername());
} SessionManager.sessionMap.put(u.getUsername(), arg0.getSession());
}
} /**
* @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
*/
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("attributeRemoved");
} /**
* @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
*/
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sessionattributeReplaced");
} }

SessionAttributeListener.java

JavaWeb_初识监听器Listener的更多相关文章

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

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

  2. javaWeb学习总结(11)- 监听器(Listener)在开发中的应用

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

  3. javaWeb学习总结(11)- 监听器(Listener)学习

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

  4. [09] 监听器 Listener

    1.事件 1.1 事件的概念 在Servlet中有一个概念叫做监听,顾名思义,就是监听某种事件是否发生.就如你是一家娱乐媒体公司的老板,你派出狗仔队去跟着某些明星,比如你想了解他们的绯闻,或者活动进展 ...

  5. java之Servlet监听器Listener

    常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...

  6. 过滤器Filter与监听器Listener

    过滤器Filter 过滤器也是一种servlet   它也可以对用户的请求进行处理  , 但是他所做的处理,只是一些轻量级的处理.Fileter就好像jsp页面与servlet之间的一道关卡,如果这个 ...

  7. JAVA监听器Listener

    JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...

  8. 过滤器(Filter)、拦截器(Interceptor)、监听器(Listener)

    一.Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle ...

  9. JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

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

随机推荐

  1. Django中ORM操作提升性能

    提升orm操作性能注意的点 优化一:尽量不查对象,能用values就是用values 直接使用对象查询的结果是5条sql语句 def youhua(request): # 使用对象查 obj_list ...

  2. Jconsole与Jmx 分析JVM状况(下) 转

    出处: Jconsole与Jmx 分析JVM状况(下) 线程(ThreadMXBean ) 从 Jconsole 画面取得线程画面如下: 左下角列出了所以正在运行的线程.通过点击某个线程,右下脚可以看 ...

  3. Android Studio 配置Gradle总结

    一, 问题:①换个新电脑安装完Android Sutdio第一次打开一个工程巨慢怎么办? ② 手动配置Gradle Home为什么总是无效? ③ 明明已经下载了Gradle,配置了gradle hom ...

  4. luogu P3826 [NOI2017]蔬菜

    luogu 那个第一次购买有\(s_i\)奖励,可以看成是多一种蔬菜\(i+n\),权值为\(w_i+s_i\),每天减少量\(x\)为0个,保质期\(\lceil\frac{c_i}{x_i}\rc ...

  5. SpringCloudGateWay之限流

    一.引言在高并发系统中,经常需要限制系统中的电流化妆.一方面是防止大量的请求使服务器过载,导致服务不可用,另一方面是防止网络攻击.常用的限流方法,如hystrix.应用线程池隔离.超过线程池的负载和g ...

  6. vue组件之子组件和父组件

    在看官网和学习的过程中,有些不明确子组件和父组件的定义,为了方便后期学习和理解去网站上搜索了一下相关的解释 1.使用的地方是父组件,定义的地方是子组件,虽然他们是同一个组件 2.Vue.compone ...

  7. 2019-11-29-Roslyn-通过-NuGet-库修改应用程序入口函数

    title author date CreateTime categories Roslyn 通过 NuGet 库修改应用程序入口函数 lindexi 2019-11-29 08:37:49 +080 ...

  8. 无Xwindow的linux系统安装VMware Tools

    首先登陆linux 系统,最好是root用户: 然后挂载cdrom: mkdir -p /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom 进入cdro ...

  9. Jdk1.8的安装(Linux和windows)

    1.1 JDK1.8下载地址 JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...

  10. mxnet 豆瓣镜像源安装

    mxnet安装比较简单,这里直接通过豆瓣镜像源用pip安装 pip install -i https://pypi.doubanio.com/simple/ mxnet-cu100 # 进入ipyth ...