Java Web学习(39):Listener学习(三)

Servlet3.0下监听器的使用

使用Servlet 3.0的前提条件

1)使用Servlet 3.0新标准jar包

2)JDK必须是1.6以上版本

3)编译器的编译级别为6.0

4)在web.xml文件中,使用3.0规范

5)使用支持Servlet 3.0特性的Web容器,比如Tomcat7

Servlet3.0下监听器的用法

@WebListener

该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口:

ServletContextListener

ServletContextAttributeListener

ServletRequestListener

ServletRequestAttributeListener

HttpSessionListener

HttpSessionAttributeListener

Servlet3.0下无法确定监听器的启动顺序,和过滤器是一样的。

@WebListener的常用属性

web.xml中的配置

<listener>

<listener-class>com.listeber.SimpleListener</listener-class>

</listener>

演变为:

@WebListener("This is only a demo listener")

统计在线用户及人数

实例代码

User.java源代码:

package com.domain;

public class User {
	private String sessionIdString;
	private String ipString;
	private String firstTimeString;

	public String getSessionIdString() {
		return sessionIdString;
	}

	public void setSessionIdString(String sessionIdString) {
		this.sessionIdString = sessionIdString;
	}

	public String getIpString() {
		return ipString;
	}

	public void setIpString(String ipString) {
		this.ipString = ipString;
	}

	public String getFirstTimeString() {
		return firstTimeString;
	}

	public void setFirstTimeString(String firstTimeString) {
		this.firstTimeString = firstTimeString;
	}
}

SessionListener.java源代码:

package com.listener;

import java.util.ArrayList;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.domain.User;
import com.utils.SessionUtil;

/**
 * Application Lifecycle Listener implementation class SimpleListener
 *
 */
@WebListener
public class SessionListener implements HttpSessionListener {

	private int userNumber = 0;

    /**
     * Default constructor. 
     */
    public SessionListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent httpSessionEvent)  { 
         userNumber++;
         httpSessionEvent.getSession().getServletContext().setAttribute("userNumber", userNumber);
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent)  { 
         userNumber--;
         httpSessionEvent.getSession().getServletContext().setAttribute("userNumber", userNumber);
         
         ArrayList<User> userList = null;
         
         userList = (ArrayList<User>)httpSessionEvent.getSession().getServletContext().getAttribute("userList");
         
         if(SessionUtil.getUserBySessionId(userList,httpSessionEvent.getSession().getId())!=null ){
        	 userList.remove(SessionUtil.getUserBySessionId(userList, httpSessionEvent.getSession().getId()));
         }
         
    }

}

RequestListener.java源代码:

package com.listener;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

import com.domain.User;
import com.utils.SessionUtil;

/**
 * Application Lifecycle Listener implementation class RequestListener
 *
 */
@WebListener
public class RequestListener implements ServletRequestListener {

	private ArrayList<User> userList;//在线用户列表

    /**
     * Default constructor. 
     */
    public RequestListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent servletRequestEvent)  { 
         
    }

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent servletRequestEvent)  { 
    	userList = (ArrayList<User>) servletRequestEvent.getServletContext().getAttribute("userList");
   
    	if(userList==null){
    		userList = new ArrayList<User>();
    	}
   
        HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); 
    	String sessionIdString = request.getSession().getId();
   
    	if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){
    		User user = new User();
    		user.setSessionIdString(sessionIdString);
    		user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    		user.setIpString(request.getRemoteAddr());
    		userList.add(user);
    	}
   
    	servletRequestEvent.getServletContext().setAttribute("userList", userList);
    }

}

SessionUtils.java源代码:

package com.utils;

import java.util.ArrayList;

import com.domain.User;

public class SessionUtil {
	public static Object getUserBySessionId(ArrayList<User> userList,String sessionIdString) {
		for (int i = 0; i < userList.size(); i++) {
			User user = userList.get(i);
			if(user.getSessionIdString().equals(sessionIdString)){
				return user;
			}
		}
		return null;
	}
}

show.jsp页面:

<%@page import="com.domain.User"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>统计页面</title>
</head>
<body>
       <h1>当前在线用户人数统计</h1>
       <hr/>
       当前在线用户人数:${userNumber}<br/>
       <%
             ArrayList<User> userList = (ArrayList<User>)request.getServletContext().getAttribute("userList");
             if(userList!=null){
            	 for(int i=0;i<userList.size();i++){
            		 User user = userList.get(i);
        %>
            		 IP:<%=user.getIpString() %><br/>
            		 FirstTime:<%=user.getFirstTimeString() %><br/>
            		 SessionID:<%=user.getSessionIdString() %><br/>
       <%  		 
            	 }
             }
       %>
       
</body>
</html>

运行结果:

对于过滤器和监听器的学习暂时告一段落,很推荐看的博文:

Java 过滤器:地址是:http://www.cnblogs.com/CBDoctor/p/4235082.html

Java 监听器:地址是:http://www.cnblogs.com/CBDoctor/p/4232859.html

javaweb学习总结(四十二)——Filter(过滤器)学习:地址是:http://www.cnblogs.com/xdp-

gacl/category/574705.html

javaweb学习总结(四十三)——Filter高级开发:地址是:http://www.cnblogs.com/xdp-

gacl/p/3948353.html

javaweb学习总结(四十四)——监听器(Listener)学习:地址是:http://www.cnblogs.com/xdp-

gacl/p/3961929.html

javaweb学习总结(四十五)——监听器(Listener)学习二:地址是:http://www.cnblogs.com/xdp-

gacl/p/3969249.html

javaweb学习总结(四十六)——Filter(过滤器)常见应用:地址是:http://www.cnblogs.com/xdp-

gacl/p/3948422.html

javaweb学习总结(四十七)——监听器(Listener)在开发中的应用:地址是:http://www.cnblogs.com/xdp-

gacl/p/3965508.html

大神的文章很受用,看的我直接爽翻了。

大牛的博客地址:http://www.cnblogs.com/xdp-gacl/

时间: 2024-08-21 16:31:11

Java Web学习(39):Listener学习(三)的相关文章

java web (j2ee)学习路线 —— 将青春交给命运

RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:HTML.JavaScript.CSS 2.      制作动态网站:Java.JSP(servelt) 3.      数据库:MySQL.SQL Server.SQL Lite.Access.Oracle 4.      流行的框架:MVC思想和原理——了解Struts.Spring.Hibern

java web用监听器listener简单的实现在线统计人数

今天又重新学习了java web的基础 监听器技术,用sessionListener简单的实现了网页统计在线人数 (有一个bug就是当关闭网页的时候 session不会关闭依旧存在,除非关闭服务器),代码如下(前端网页代码就不显示了): LoginServlet.java: 1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.ht

Java Web 之 Servlet - Listener、Filter、Decorator 精辟

Listener-监听器 Listener为在Java Web中进行事件驱动编程提供了一整套事件类和监听器接口.Listener监听的事件源分为ServletContext/HttpSession/ServletRequest三个级别: ServletContext级别 Listener 场景 ServletContextListener 响应ServletContext生命周期事件(创建/销毁),在ServletContext创建/销毁时分别调用其相应的方法. ServletContextAt

Java Web(五) 监听器Listener

监听器概述 在上一篇里介绍了过滤器Filter,而Listener是Servlet的另一个高级特性.Listener用于监听Java Web程序中的事件,例如创建,修改,删除Session,request,context等,并触发相应的事件.Listener主要用于对Session,request,context等进行监控,目前共有8种Listener,分别完成对不同事件的监听. 使用Listener不需要关注事件是怎样触发的或者怎么调用相应的Listener,只要记住该类事件触发时一定会调用相

【java web】监听器listener

一.简介 Java的监听器,也是系统级别的监听.监听器随web应用的启动而启动.Java的监听器在c/s模式里面经常用到,它会对特定的事件产生产生一个处理.监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数. 1.1 监听器分类 1) 按监听的对象划分,可以分为: ServletContext对象监听器 HttpSession对象监听器 ServletRequest对象监听器 2)按监听的事件划分 对象自身的创建和销毁的监听器 对象中属性的创建和消除的监

java web 静态资源访问配置三种方式

方案一:Tomcat的defaultServlet来处理静态文件 要放在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了 方案二: 在spring3.0.4以后版本提供了mvc:resource /images/**映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下.jar包里面,这样可以把静态资源压缩到jar包中.cache-

Java Web 开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式.Cookie存储的数据量有限,且都是保存在客户端浏览器中.不同的浏览器有不同的存储大小,但一般不超过4KB.因此使用 实际上只能存储一小段的文本信息. 例如:登录网站,今输入用户名密码登录了,第二天再打开很多情

前端学习(39)~js学习(十六):数组

数组简介 数组(Array)是属于内置对象,我们可以在MDN网站上查询各种方法. 数组和普通对象的功能类似,也是用来存储一些值的.不同的是: 普通对象是使用字符串作为属性名的,而数组是使用数字来作为索引来操作元素.索引:从0开始的整数就是索引. 数组的存储性能比普通对象要好.在实际开发中我们经常使用数组来存储一些数据,使用频率非常高. 数组中的元素可以是任意的数据类型,也可以是对象,也可以是函数,也可以是数组.数组的元素中,如果存放的是数组,我们就称这种数组为二维数组. 接下来,我们讲一讲数组的

Java Web学习(3):Win7 64位操作系统搭建Java Web开发环境

一搭建Java Web开发环境的总体概览 工欲善其事必先利其器.学会搭建Java Web开发环境是学习JSP动态网站开发的最基本技能之一.主要介绍在 Windows 7 64位操作系统下搭建Java Web开发环境的过程,主要包括JDK的安装与配置.Tomcat的安装与配置. Eclipse IDE for Java EE Developers的安装与配置. 在这里推荐使用的: 1)Java  JDK 8.0 2)Server   Tomcat 8.0 3)IDE   Eclipse IDE f

Java web开发路线--Java学习资料汇总

Java web开发是什么? 先来说说java体系,包含:javaSE.javaEE.javaME,其实目前关注主要是javaEE,但学些javaEE必须先学习javaSE(因为这个是java基础).Java web开发其实是应用javaEE实现web应用的开发,是用Java技术来解决相关web互联网领域的技术总和. web开发主要包括前端开发和后端开发,前端主要是HTML.CSS.JS等相关技术,后端技术主要有JavaEE技术.数据库技术.文件存储技术等.java体系比较庞大,也是很多人比较迷