A:监听器的定义

专门用于其它对象身上发生的事件或状态改变进行监听和对应事件处理的对象,当被监听的对象发生改变时,马上採取对应的行动。

client请求                                       ServletContext --> Application      上下文对象 由容器创建

web监听器        Httpsession-->  Session         保存上下文信息的机制 保存每一个会话

server端操作                                    ServletHttpRequest-->Request    客户发送请求时创建

监听器是servlet规范中定义的一种特殊类;用于监听ServletContext、httpsession和ServletRequest等域对象的创建和销毁事件;用于监听域对象的属性发生改动的事件;能够再事件发生前、发生后做一些必要的处理。

B:web监听器的主要用途:

1. 统计在线人数和在线用户

2.系统启动时载入初始化信息

3.统计站点訪问量

4.跟Spring结合

C:一个web监听器实例

步骤:

1.创建一个实现监听器接口的类

2. 配置web.xml文件进行注冊

监听器启动顺序:多个监听器启动顺序依照注冊顺序运行的

优先级:监听器 >过滤器>servlet

D:监听器分类

依照监听的对象划分

1.用于监听应用程序对象 (ServletContext)的事件监听器

2.用于监听用户会话对象(HttpSession)的事件监听器

3.用于监听请求消息对象(ServletRequest)的事件监听器

依照监听的事件划分

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

ServletContext --> ServletContextListener

主要用途:定时器 全局属性对象

HttpSession --> HttpSessionListener

主要用途:统计在线人数 记录訪问日志

Session销毁:关闭server ; Session超时 。 关闭浏览器,Session过期

在web.xml中配置session过期时间

ServletReqest ServletRequestListener

主要用途:读取參数 记录訪问历史

2.监听域对象中的属性的添加和删除的事件监听器

ServletContext --> servletContextAttributeListener           上下文

HttpSession--> HttpSessionAttributeListner                      一次会话

HttpServletRequest --> ServletRequestAtttibuteListener   一次请求

request.getAttribute() 放在域对象中的參数

request.getParameter()  request的请求參数 www.baidu.com/username=zs

须要将username放到Attribute中,request.setAttribute("username","zs");放在域对象中的属性 直接通过EL表达式就可取出  。

在多次点击button请求时,

因为request在訪问结束后就销毁了,在request域中不存有上一次获取的參数,就会add。session和context在容器中都存有,就会直接replace。

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

绑定-->解除绑定

绑定:保存-setAttribute

解除绑定:移除-removeAttribute

钝化-->活化

钝化:将Session对象持久化到存储设备上

活化:将session对象将一个存储设备上恢复

钝化原因:session放在server中的。当在线对象特别多,session内存开销非常大,session的钝化机制就可解决。将server中临时不使用的session对象 序列化到系统文件或数据库中;在须要使用时反序列化到系统内存中

整个过程由server自己主动完毕。

Tomcat两种Session钝化管理器:

Session钝化机制由SessionManager管理

org.apache.catalina.session.StandardManager

当Tomcatserver被关闭或重新启动时 tomcatserver会将当前内存中的Session对象钝化到server文件系统中。还有一种情况是web应用程序被又一次载入时 内存中的Session对象也会被钝化到server的文件系统中;钝化后的文件被保存:Tomcat安装路径/work/Catalina/hostname/applicationname/SESSION.ser

org.apache.catalina.session.Persistentmanager

在钝化基础上进行扩张,能够配置主流内存的Session对象数目,将不常使用的Session对象保存到文件系统或数据库,当使用时再又一次载入默认情况下

tomcat提供两个钝化驱动类:org.apache.Catalina.FileStore 和 org.apache.Catalina.JDBCStore

HttpSessionBindingListener类

绑定:valueBound方法

解除绑定:valueUnbound方法

HttpSessionActivationListener类

钝化:sessionWillPassivate方法

活化:sessionDidActivate方法

不须要在web.xml中注冊;钝化和活化必须实现序列化serializable接口才行。

E:监听器的实例--在线人数统计

import java.util.ArrayList;

import javax.servlet.annotation.WebListener;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

import com.my.entity.User;

import com.my.util.SessionUtil;

/**

* 计数监听器

*/

@WebListener

public class MyHttpSessionListener implements HttpSessionListener {

private int userNumber = 0;

@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);

ArrayList userList = null;//在线用户List

userList = (ArrayList)arg0.getSession().getServletContext().getAttribute("userList");

if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){

userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));

}

}

}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.my.entity.User;

import com.my.util.SessionUtil;

@WebListener

public class MyServletRequestListener implements ServletRequestListener {

private ArrayList userList;//在线用户List

@Override

public void requestDestroyed(ServletRequestEvent arg0) {

}

@Override

public void requestInitialized(ServletRequestEvent arg0) {

userList = (ArrayList)arg0.getServletContext().getAttribute("userList");

if(userList==null)

userList = new ArrayList();

HttpServletRequest request = (HttpServletRequest) arg0.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);

}

arg0.getServletContext().setAttribute("userList", userList);

}

}import java.util.ArrayList;

import com.my.entity.User;

public class SessionUtil {

public static Object getUserBySessionId(ArrayList 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;

}

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

}

}

F:servlet3.0下的使用:仅仅须要添加注解就可以

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");

}

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

java做文件显示器_JavaWeb显示器相关推荐

  1. Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

    Java做文件上传.图片上传后台方法 利用Springboot快速搭建项目环境 项目源码已经上传到码云:https://gitee.com/jack_party/upload .喜欢的朋友可以支持一下 ...

  2. java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  3. java mime上传_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  4. java大文件读写操作

    转载自:http://blog.csdn.net/akon_vm/article/details/7429245 RandomAccessFile RandomAccessFile是用来访问那些保存数 ...

  5. Java实现文件拷贝

    经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失 ...

  6. 用Java获取文件的MD5校验和

    我正在寻找使用Java获取文件的MD5校验和. 我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西. 怎么做? #1楼 Guava现在提供了一个新的,一致的哈希API,它比JDK中提 ...

  7. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  8. Java删除文件夹和文件

    以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下,做个总结,算是一个学习备份-- 1,验证传入路径是否为正确的路径名(Windows系 ...

  9. Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

    1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...

最新文章

  1. 转:Bit-Map思想与2-BitMap思想
  2. Windows Mobile 技术开发黄金周系列课程
  3. python解压文件_使用Python实现文件压缩和解压
  4. mysql-事务隔离级别
  5. 台湾国立大学郭彦甫Matlab教程笔记(9) basic plotting
  6. 使用data()方法缓存数据
  7. Asp.Net Mvc表单提交之List集合
  8. 用python代替人脑运算24点游戏
  9. 关于一些电脑使用的小技巧
  10. c语言运算优先级口诀简单,C语言运算符优先级和口诀
  11. 企业信息化建设的意义
  12. 超自动化如何提升保险业?
  13. 【笔记】路由器:动态路由配置、交换机:vlan配置 网络层次结构:OSI7层模型 、TCP/IP模型(4层模型)、DNS解析过程
  14. 关于SNES9X的编译
  15. Android双目三维重建:Android双目摄像头实现双目测距
  16. EMBA课程小记(4)——“半面创新”课程体会
  17. iis服务器里网站无法访问,IIS服务器网站无法访问解决方法(图文).doc
  18. 泡沫芯层的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. python模块和包_(三)运用Python模块和包
  20. 图片无损放大,让细节美到毛孔——PhotoZoom Pro小能手来咯

热门文章

  1. shell数组使用技巧
  2. Android常用开发网址(持续更新)
  3. 如何在Ubuntu中修改默认程序
  4. 详解SSH框架和Redis的整合
  5. CSS 魔法:学海无涯,而吾生有涯
  6. myeclipse自定义java注释
  7. oracle 10g的闪回删除与回收站
  8. 获取Tekla属性方式
  9. 浏览器与WEB服务器交互
  10. Canvas入门03-绘制弧线和圆