慕课网--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对象。
第六章 总结
----------------------------------------------------
后面也是没有继续看下去,要用再补。