java基础篇---Servlet监听器
在写此篇前,看了一下园友写的,感觉其基础知识归纳的十分全面,我在此就不累赘的写了,链接地址(http://www.cnblogs.com/sherryueda/p/4273169.html),
我就写一下关于监听器的具体应用:
功能是负责监听WEB的各种操作,当相关的事件触发之后将产生事件,并对此事件进行处理,在WEB中可以对application、session、request三种操作进行监听。
对application监听:
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的操作进行监听的时候,可以实现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属性监听:HttpSessionAttributeListener接口
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接口
public Object getValue()
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接口
对request监听
请求状态监听:ServletRequestListener接口
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接口
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>
监听器实例 —— 在线人员统计

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> </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监听器的更多相关文章
- java基础篇---Servlet过滤器
Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的 ...
- JAVA基础篇—Servlet小结
一.get请求和post请求的区别: 1.get请求是通过url传递参数,post请求是通过请求体传递参数的 2.get请求最多允许传递255个字符,对长度有限制,所以数据比较大的时候我们使用post ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
- Java基础篇 - 强引用、弱引用、软引用和虚引用
Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...
- java基础篇 之 构造器内部的多态行为
java基础篇 之 构造器内部的多态行为 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
随机推荐
- 【struts2】值栈(前篇)
1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...
- 【Linux】关于减号 - 的用途
管线命令在 bash 的连续处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环, 所以请特别留意!另外,在管线命令当中,常常会使用到前一个命令的 stdout 作为这次的 ...
- centos yum源
#remi的源 rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm rpm --import /etc/pki/r ...
- myeclipse 遇到的一些问题及解决方案
1..提示键配置 一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多 ...
- mongoDB 32位 安装包地址
https://www.mongodb.org/dl/win32/i386 http://downloads.mongodb.org/win32/mongodb-win32-i386-3.2.4-si ...
- HANA初印象
今天手懒,看了一些SAP HANA 的一些外文介绍,不翻译了,直接剽窃过来,供参考. 1. HANA 是什么东西? “HANA doesn't actually mean anything, but ...
- FreeSWITCH收到重复的DTMF信号
一.背景 用户是运营商手机,拨打的是运营商的固话号码进入的FreeSWITCH的IVR,进入IVR语音播报后,按指定的分机号呼相关人员. 二.现象 用户反映拨打124870找不到指定人员,以前是正常的 ...
- 【蓝桥杯】PREV-21 回文数字
题目链接:http://lx.lanqiao.org/problem.page? gpid=T113 历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 问题描写叙 ...
- oracle 定时任务例子【项目例子】
说明:请在plsql工具的命令窗口中,依次按步骤执行如下脚本 (1)建立备份表 my_test_log2create table my_test_log2 as select * from my_ ...
- alibaba fastjson TypeReference 通过字符串反射返回对象
TypeReferenceEditNew Page温绍 edited this page Nov 3, 2017 · 8 revisions1. 基础使用在fastjson中提供了一个用于处理泛型反序 ...