Java监听器

慕课网--java  Web技术开发--监听器   学习笔记。

---------------------------------------------------------------

第一章 监听器简介

e.g 统计用户在线人数

  web应用服务器-----监听器---------session


application对象由容器创建和初始化,web服务器关闭时才会销毁

web监听器监听这三个对象的创建,销毁以及属性变化。

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

Web监听器的用途
1.统计在线人数和在线用户------session
2.系统启动时加载初始化信息
3.统计网站的访问量 -------request
4.跟Spring结合


第二章 监听器的实现与启动顺序

1.创建对象

2. 配置web.xml


3.debug server



监听器的启动顺序:按照web.xml的配置顺序来启动
优先级:监听器>过滤器>Servlet




第三章 监听器的分类

一、按对象划分
1、用于监听应用环境对象(ServletContext)的事件监听器
2、用于监听用户会话对象(HttpSession)的事件监听器
3、用于监听请求消息对象(ServletRequest)的事件监听器

二、按事件划分
1、监听域对象自身的创建和销毁事件
2、监听域对象中属性的增加和删除事件
3、监听绑定到HttpSession域中的某个对象,其状态改变事件

------------------------------------------------------------------------------

1、监听域对象自身的创建和销毁事件


以上图中的三个接口都是用来监听对象的创建和销毁事件



3-1.ServletContext对象的创建和销毁

在一个web项目中,可以有多个ServletContextListener,但是只能有一个ServletContext对象

在ServletContextListener中,有2个事件处理方法:

1. public void contextDestroyed(ServletContextEvent arg0) {}

2. public void contextInitialized(ServletContextEvent arg0) {}

        它们都有一个参数ServletContextEvent,可以获取servletcontext及一些初始化参数

主要用途:1.做一些定时器

                  2.加载一些全局属性对象

                  3.创建全局数据库链接

          4.加载一些缓存信息

我们上面的那个例子应用的就是ServletContextListener,我们在其上做一些修改。


这个initParam我们是在web.xml中配置的,如图

我们把项目重新启动下就可以看到,

当然了,我们不光可以将initParam这种东西放在web.xml中来get,还可以直接servletcontextevent.getServletContext().setAttribute()再getAttribute()。

而在销毁部分,我们可以释放一些资源。


3-2HttpSession对象的创建和销毁

同样的,一个httpsession可以注册多个httpsessionlistener

同样的,在HttpSessionListener中,有2个事件处理方法:

1. public void sessionCreated(HttpSessionEvent se) ---------session创建时调用

2. public void sessionDestroyed(HttpSessionEvent se)--------session销毁时调用

-------------那session是什么时候创建,什么时候销毁的呢?

session销毁:1.服务器关闭

2.关闭浏览器,session过期

3.不关闭浏览器,session超时

        通过HttpSessionEvent,我们可以获得当前HttpSession对象

主要用途:1.统计在线人数

          2.记录在线日志

1. 写好监听器类,并注册到web.xml中



2. 启动tomcat,并浏览器第一次访问


关闭浏览器后,session并不会立即销毁,那么我们需要配置web.xml的参数

这里的session-timeout=1并不是说1分钟正好就会销毁,不是一个精确的值




3-3 ServletRequest对象的创建和销毁

同样的,一个ServletRequest可以注册多个ServletRequestListener

同样的,在HttpSessionListener中,有2个事件处理方法:

1. public void requestInitialized(ServletRequestEvent se) ---------request创建时调用

2. public void requestDestroyed(ServletRequestEvent se)--------request销毁时调用

主要用途:1.读取request参数

    2.记录访问历史




---------------------------------------------------------------------------------------------


2、监听域对象中属性的增加和删除事件

3-4 ServletContext,HttpSession,ServletRequest对象的属性的添加和删除


1.创建监听类并注册到web.xml中




2. 编写init.jsp和destroy.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

request.setAttribute("requestName","requestValue");
request.getSession().setAttribute("sessionName", "sessionValue");
request.getSession().getServletContext().setAttribute("contextName","contextValue");

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'init.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    这是初始化值的界面
    <button onclick="location.href='<%=request.getContextPath()%>/init.jsp';">Init</button>
    <button onclick="location.href='<%=request.getContextPath()%>/destroy.jsp';">Destroy</button>
  </body>
</html>
上面是init.jsp页面,destroy.jsp只要做稍稍改动,即:

request.removeAttribute("requestName");
request.getSession().removeAttribute("sessionName");
request.getSession().getServletContext().removeAttribute("contextName");

这就完成了属性的添加和删除。

下面我们启动tomcat(注意:之前的session-timeout改为0)

第一次访问,后台显示:


点击init:


再次点击init


再点击destroy


我们可以发现,session和servletcontext都有replace和remove,只有request没有,因为访问后立刻就销毁了。


3.监听绑定到HttpSession域中的某个对象的状态的事件监听器

3-5HttpSession中对象的状态变化

绑定=>解除绑定        钝化=>活化

HttpSession中的对象状态:
(1)绑定:通过setAttribute保存到session对象当中;
(2)解除绑定:removeAttribute;
(3)钝化:将session对象持久化到存储设备上;
(4)活化:将session对象从存储设备上进行恢复。


---------------------------------------------------------------------------------------------------------------



serlvet规范为我们提供了两个接口,分别是HttpSessionBindingListener和HttpSessionActivationListener,需要注意的是,这两个监听器都不需要再web.xml中注册



下面我们就来看一个实例。


我们先来看HttpSessionBindingListener这个接口,但需要注意的是,我们创建的并不是一个监听器,而是一个javabean!如下图


<span style="font-size:12px;">package com.whu.entity;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class User implements HttpSessionBindingListener {

	private String username;
	private String password;
	
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("valueBound Name:"+arg0.getName());
	}

	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("valueUnbound Name:"+arg0.getName());
	}

	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;
	}

}</span><strong style="font-size: 18px;">
</strong>
接下来我们不是去web.xml中注册监听器,而是去init.jsp中加这样一行代码

request.getSession().setAttribute("currentUser", new com.whu.entity.User());

再去destroy.jsp中添加

request.getSession().removeAttribute("currentUser");


下面启动tomcat,点击init和destroy


以上就是我们关于user对象的绑定和解除绑定的监听事件。


下面我们来看HttpSessionActivationListener这个接口,它同样也是定义在javabean上的,所以我们还是用刚才的user例子。


package com.whu.entity;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;

public class User implements HttpSessionBindingListener,HttpSessionActivationListener {

	private String username;
	private String password;
	
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("valueBound Name:"+arg0.getName());
	}

	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("valueUnbound Name:"+arg0.getName());
	}

	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 void sessionDidActivate(HttpSessionEvent arg0) {
		System.out.println("sessionDidActivate "+arg0.getSource());
		
	}

	public void sessionWillPassivate(HttpSessionEvent arg0) {
		System.out.println("sessionWillPassivate "+arg0.getSource());
		
	}

}

第一次访问session已经创建

点击init,session有了sessionName


stop tomcat


sessionWillPassivate org.apache.catalina.session.StandardSessionFacade@5b5b55bc

这就是一个钝化的输出。

我们右键下图的项目名,选择browse deployment location,进入对应文件夹


我们看到刚刚的session保存到了这里,保存到了硬盘上。

接下来我们在index.jsp中的<body>部分添加

<%=request.getSession().getAttribute("currentUser") %>
再重新启动tomcat,照理说应该是存在的,启动后应会活化,但是实际显示为null。


这是为什么呢?因为我们还少实现了一个接口。

要想实现钝化和活化,还必须要实现Serializable接口

我们在User.java中加入这个接口后,再重新启动--init--关闭--再启动,得到



同时我们的tomcat文件夹中的SESSIONS.ser文件也不复存在。

-----------------------------------------------------------------------------------

之前我们也讲了,tomcat有两种session钝化管理器,一个是StandardManager,默认的,另一个是Persistentmanager。

那这个在哪里配呢?


具体配置这里不细讲。



第四章 servlet3.0下监听器的使用

之前我们讲的都是servlet2.5的版本。

那这个版本号在哪里看呢?


使用servlet 3.0 的前提条件

1. 使用servlet 3.0 新标准的jar包

2. jdk的版本必须在1.6 以上

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

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

5. 使用支持servlet 3.0 的容器,比如tomcat 7


servlet 3.0 下监听器的用法:

只需要添加注解就行了, @WebListener, 这个注解就将这个类声明为监听器, 但是这个类必须要实现一些接口,就是我们之前提到的6个。

但是我们无法定义监听器的顺序。

@WebListener 的属性:唯一的一个,value, 描述信息


 下面我们看一个实例。



package com.whu.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener("This is my servlet 3.0 listener")
public class MyServletContextListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("contextDestroyed");

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("contextInitialized");

	}

然后我们将这个项目发布到tomcat7.x下,成功输出
contextInitialized


第五章 项目案例--统计在线用户及人数



MyHttpSessionListener.java

package com.whu.listener;

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

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

	private int userNumber;
	
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		userNumber++;
		arg0.getSession().getServletContext().setAttribute("userNumber",userNumber);

	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		userNumber--;
		arg0.getSession().getServletContext().setAttribute("userNumber",userNumber);
	}

}
index.jsp

  <body>
    当前用户在线人数:${userNumber}
  </body>

启动tomcat


 下面我们想看看这些用户是来自什么地方的,即记录ip地址。

而session没有获取ip地址的方法,那哪里可以获取ip地址呢?request对象。






第六章 总结


----------------------------------------------------

后面也是没有继续看下去,要用再补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值