在写此篇前,看了一下园友写的,感觉其基础知识归纳的十分全面,我在此就不累赘的写了,链接地址(http://www.cnblogs.com/sherryueda/p/4273169.html),

我就写一下关于监听器的具体应用:

功能是负责监听WEB的各种操作,当相关的事件触发之后将产生事件,并对此事件进行处理,在WEB中可以对application、session、request三种操作进行监听。

对application监听:

对application监听,实际上就是对ServletContext(Servlet上下文)监听,主要使用以下两个接口:ServletContextListener ,ServletContextAttributeListener
package com.oumyye.监听器;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) { // 上下文初始化时触发
System.out.println("** 容器初始化 --> "
+ event.getServletContext().getContextPath());
}
public void contextDestroyed(ServletContextEvent event) { // 上下文销毁时触发
System.out.println("** 容器销毁 --> "
+ event.getServletContext().getContextPath());
}
}

web.xml配置

<listener>
<listener-class>
com.oumyye.监听器.ServletContextListenerDemo
</listener-class>
</listener>

对session监听

在监听器中,针对于session的监听操作提供了三个接口:HttpSessionListener,HttpSessionAttributeListener,HttpSessionBindingListener
session状态监听:HttpSessionListener接口 
  • 当需要对创建或销毁session的操作进行监听的时候,可以实现javax.servlet.http.HttpSessionListener接口,此接口定义的方法如下:public void sessionCreated(HttpSessionEvent se),public void sessionDestroyed(HttpSessionEvent se)
  • 当session创建或销毁后,将产生HttpSessionEvent事件,此事件定义的操作如下:public HttpSession getSession()

对session监听

package com.oumyye.监听器;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class HttpSessionListenerDemo implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) { // 创建session触发
System.out.println("** SESSION创建,SESSION ID = " + event.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent event) { // 销毁session触发
System.out.println("** SESSION销毁,SESSION ID = " + event.getSession().getId());
}
}

web.xml配置

    <listener>
<listener-class>
<listener>
<listener-class>
com.oumyye.监听器.HttpSessionListenerDemo
</listener-class>
</listener>

session销毁的操作

当一个新用户打开一个动态页时,服务器是会为新用户分配session,并且触发HttpSessionListener接口中的sessionCreated()事件,但是在用户销毁时却有两种不同的方式来触发sessionDestroyed()事件:
方式一:调用HttpSession接口的invalidate()方法,让一个session失效。
方式二:超过了配置的session超时时间,session超时时间,可以直接在项目中的web.xml配置。 

session属性监听:HttpSessionAttributeListener接口

在session监听中也可以对session的属性操作进行监听,这一点与监听上下文属性的道理是一样的,要对session的属性操作监听,则可以使用javax.servlet.http.HttpSessionAttributeListener接口完成,此接口的方法如下:
public void attributeAdded(HttpSessionBindingEvent se),
public void attributeRemoved(HttpSessionBindingEvent se),
public void attributeReplaced(HttpSessionBindingEvent se)
当进行属性操作时,将根据属性的操作触发HttpSessionAttributeListener接口中的方法,每个操作方法都将产生HttpSessionBindingEvent事件,此事件定义操作如下:
public HttpSession getSession(),
public String getName(),
public Object getValue()
对session的属性操作监听 :
package com.oumyye.监听器;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionAttributeListenerDemo implements
HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent event) {// 属性增加时调用
System.out.println(event.getSession().getId() + ",增加属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent event) {// 属性删除时调用
System.out.println(event.getSession().getId() + ",删除属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
public void attributeReplaced(HttpSessionBindingEvent event) {// 属性替换时调用
System.out.println(event.getSession().getId() + ",替换属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
}

web.xml配置

<listener>
<listener-class>
com.oumyye.监听器.HttpSessionAttributeListenerDemo
</listener-class>
</listener>

session属性监听:HttpSessionBindingListener接口

在session监听中也可以对session的属性操作进行监听,这一点与监听上下文属性的道理是一样的,要对session的属性操作监听,则可以使用javax.servlet.http.HttpSessionAttributeListener接口完成:
public void attributeAdded(HttpSessionBindingEvent se)
public void attributeRemoved(HttpSessionBindingEvent se)
public void attributeReplaced(HttpSessionBindingEvent se)
当进行属性操作时,将根据属性的操作触发HttpSessionAttributeListener接口中的方法,每个操作方法都将产生HttpSessionBindingEvent事件
public HttpSession getSession()
public String getName()

public Object getValue()

对session的属性操作监听 
package com.oumyye.监听器;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionAttributeListenerDemo implements
HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent event) {// 属性增加时调用
System.out.println(event.getSession().getId() + ",增加属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent event) {// 属性删除时调用
System.out.println(event.getSession().getId() + ",删除属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
public void attributeReplaced(HttpSessionBindingEvent event) {// 属性替换时调用
System.out.println(event.getSession().getId() + ",替换属性 --> 属性名称:"
+ event.getName() + ",属性内容:" + event.getValue());
}
}

web.xml同上

session属性监听:HttpSessionBindingListener接口

在WEB里也提供了一个javax.servlet.http.HttpSessionBindingListener接口,通过此接口实现的监听程序可以不用配置而直接使用,此接口定义的方法如下:
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event) 

对request监听

在Servlet 2.4之后增加了对request操作的监听,主要使用ServletRequestListener、ServletRequestAttributeListener两个接口。 

请求状态监听:ServletRequestListener接口

当需要对用户的每次请求进行监听的时候,可以使用javax.servlet.ServletRequestListener接口,此接口定义方法如下:
public void requestInitialized(ServletRequestEvent sre)
public void requestDestroyed(ServletRequestEvent sre)
ServletRequestListener接口一旦监听到事件之后,将产生ServletRequestEvent的事件处理对象,此事件类定义的操作方法如下:
public ServletRequest getServletRequest()
public ServletContext getServletContext()
对用户请求request监听 
package com.oumyye.监听器;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class ServletRequestListenerDemo implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent event) {
System.out.println("** request初始化。http://"
+ event.getServletRequest().getRemoteAddr()
+ event.getServletContext().getContextPath());
}
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("** request销毁。http://"
+ event.getServletRequest().getRemoteAddr()
+ event.getServletContext().getContextPath());
}
}

web.xml配置

<listener>
<listener-class>
com.oumyye.监听器.ServletRequestListenerDemo
</listener-class>
</listener>

request属性监听:ServletRequestAttributeListener接口

对request范围属性的监听可以使用javax.servlet.ServletRequestAttributeListener接口,此接口定义的方法如下所示:
public void attributeAdded(ServletRequestAttributeEvent srae)
public void attributeReplaced(ServletRequestAttributeEvent srae)
public void attributeRemoved(ServletRequestAttributeEvent srae)
加入监听器之后request属性的操作都会产生ServletRequestAttributeEvent事件,此事件的定义的方法如下:
public String getName()
public Object getValue()
监听request属性操作

package com.oumyye.监听器;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class ServletRequestAttributeListenerDemo implements
ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent event) {
System.out.println("** 增加request属性 --> 属性名称:" + event.getName()
+ ",属性内容:" + event.getValue());
}
public void attributeRemoved(ServletRequestAttributeEvent event) {
System.out.println("** 删除request属性 --> 属性名称:" + event.getName()
+ ",属性内容:" + event.getValue());
}
public void attributeReplaced(ServletRequestAttributeEvent event) {
System.out.println("** 替换request属性 --> 属性名称:" + event.getName()
+ ",属性内容:" + event.getValue());
}
}

web.xml配置

<listener>
<listener-class>
com.oumyye.监听器.ServletRequestAttributeListenerDemo
</listener-class>
</listener>

监听器实例 —— 在线人员统计

在线人员列表是一个较为常见的功能,每当用户登陆成功之后,就会在列表中增加此用户名称,这样就可以知道当前在线的用户有那些了,这个功能在WEB中只能靠监听器实现。
使用接口
要完成在线用户列表的监听器,需要使用如下几个接口:
ServletContextListener接口:在上下文初始化时设置一个空的集合到application之中;
HttpSessionAttributeListener接口:用户增加session属性时,表示新用户登陆,从sesion中取出此用户的登陆名,之后将此用户保存在列表之中;
HttpSessionListener接口:当用户注销(手工注销、会话超时)将此用户列表中删除此用户。 
代码过程
创建LoginList.java来存放用户和在线用户的具体操作
package com.oumyye.监听器;

import java.util.*;

public class LoginList {
private static LoginList user = new LoginList();
private Vector vector = null;
//private调用构造函数,
//防止被外界类调用产生新的instance对象
public LoginList() {
this.vector = new Vector();
}
//外界使用的instance对象
public static LoginList getInstance() {
return user;
}
//用户登录
public boolean addLoginList(String user) {
if (user != null) {
this.vector.add(user);
return true;
} else {
return false;
}
}
//获取用户列表
public Vector getList() {
return vector;
}
//删除用户
public void removeLoginList(String user) {
if (user != null) {
vector.removeElement(user);
}
}
}

LoginList.java

创建LoginNote.java类,实现HttpSessionBindingListener类

package com.oumyye.监听器;
import javax.servlet.http.HttpSessionBindingEvent; public class LoginNote implements javax.servlet.http.HttpSessionBindingListener {
private String user;
private LoginList container = LoginList.getInstance();
public LoginNote() {
user = "";
}
public void setUser(String user) {
this.user = user;
}
public String getUser() {
return this.user;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println(this.user+"该用户己经上线" );
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println(this.user+"该用户己经下线");
if (user != "") {
container.removeLoginList(user);
}
}
}

LoginNote.java

页面文件

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>监听查看在线用户</title>
</head>
<script language="javascript">
function checkEmpty(form){
for(i=0;i<form.length;i++){
if(form.elements[i].value==""){
alert("表单信息不能为空");
return false;
}
}
}
</script>
<link href="css/style.css" rel="stylesheet" type="text/css">
<body>
<div align="center">
<table width="400" height="150" border="0" cellpadding="0" cellspacing="0" bgcolor="lightblue">
<Tr><td>&nbsp;</td></Tr>
<tr>
<td align="center">
<form name="form" method="post" action="LoginList.jsp" onSubmit="return checkEmpty(form)">
<input type="text" name="user"><br><br>
<input type="submit" name="Submit" value="登录上线">
</form>
</td>
</tr>
</table>
</div>
</body>
</html>

index.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.util.*"%>
<%@ page import="com.oumyye.监听器.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>监听查看在线用户</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<%
LoginList list=LoginList.getInstance();
LoginNote ut=new LoginNote();
String name=request.getParameter("user");
ut.setUser(name);
session.setAttribute("list",ut);
list.addLoginList(ut.getUser());
session.setMaxInactiveInterval(10);
%>
<body>
<div align="center"> <table width="400" height="150" border="0" cellpadding="0" cellspacing="0" bgcolor="lightblue">
<tr align="center"><td>用户在线列表</td></tr>
<tr>
<td align="center"><br> <textarea rows="5" cols="22">
<%
Vector vector=list.getList();
if(vector!=null&&vector.size()>0){
for(int i=0;i<vector.size();i++){
out.println(vector.elementAt(i)+"己登录在线");
}
}
%>
</textarea><br><br>
<a href="loginOut.jsp">返回</a>
</td>
</tr>
</table>
</div>
</body>
</html>

LoginList.jsp

<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
<%
session.invalidate();
out.println("<script>parent.location.href='index.jsp';</script>");
%>

loginOut.jsp

 

java基础篇---Servlet监听器的更多相关文章

  1. java基础篇---Servlet过滤器

    Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的 ...

  2. JAVA基础篇—Servlet小结

    一.get请求和post请求的区别: 1.get请求是通过url传递参数,post请求是通过请求体传递参数的 2.get请求最多允许传递255个字符,对长度有限制,所以数据比较大的时候我们使用post ...

  3. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  4. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  5. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  6. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  7. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  8. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

  9. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

随机推荐

  1. GIF Brewery for Mac(录制 Gif 动图工具)安装

    1.软件简介    GIF Brewery 一款用于录制 Gif 动图等的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 GIF Brewery for Mac v3.9.5 ltmf ma ...

  2. mysql join left join区别

    mysql默认的join是inner join,inner join 和 left join的区别看图:

  3. Java Nashorn--Part 4

    Nashorn 和 javax.script 包 Nashorn 并不是第一个在 Java 平台上运行的脚本语言.在Java 6 就提供了 javax.script java 包,它为脚本语言引擎提供 ...

  4. JPA学习笔记(8)——映射一对多关联关系

    一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...

  5. Android Developers:向其它应用发送用户

    Android的一个非常重要的功能是,应用程序基于它要执行的一个“动作”想其它应用程序发送用户的能力.例如,如果你的应用程序要显示一个地图,你没有在你的应用程序中创建显示地图的Activity.相反, ...

  6. 一个将java事物的非常好的栗子

    地址:http://www.cnblogs.com/davenkin/archive/2013/02/16/java-tranaction-1.html

  7. List遍历Java 8 Streams map() examples

    1. A List of Strings to Uppercase 1.1 Simple Java example to convert a list of Strings to upper case ...

  8. MarkDown 使用指南

    https://frankbing.gitbooks.io/markdown/content/

  9. [hihoCoder] 第五十周: 欧拉路·二

    题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角 ...

  10. RecyclerView中实现headerView,footerView功能

    之前用com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader 不过局限性有点大. (com.bartoszlipinski.recycler ...