本文研究的总结。欢迎转载,但请注明出处:http://blog.csdn.net/pistolove/article/details/44310967

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表达式就可取出  <%=username%>。在多次点击button请求时, 因为request在訪问结束后就销毁了,在request域中不存有上一次获取的參数,就会add。session和context在容器中都存有,就会直接replace。
     3.监听绑定到HttpSession域中的某个对象的状态的事件监听器
         绑定-->解除绑定 
             绑定:保存-setAttribute
             解除绑定:移除-removeAttribute
         钝化-->活化
            钝化:将Session对象持久化到存储设备上
            活化:将session对象将一个存储设备上恢复
         钝化原因:session放在server中的。当在线对象特别多,session内存开销非常大,session的钝化机制就可解决。将server中临时不使用的session对象 序列化到系统文件或数据库中;在须要使用时反序列化到系统内存中 整个过程由server自己主动完毕。
Tomcat两种Session钝化管理器:
<a>Session钝化机制由SessionManager管理
       org.apache.catalina.session.StandardManager
当Tomcatserver被关闭或重新启动时 tomcatserver会将当前内存中的Session对象钝化到server文件系统中。还有一种情况是web应用程序被又一次载入时 内存中的Session对象也会被钝化到server的文件系统中;钝化后的文件被保存:Tomcat安装路径/work/Catalina/hostname/applicationname/SESSION.ser
<b>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;@Overridepublic void sessionCreated(HttpSessionEvent arg0) {userNumber++;arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {userNumber--;arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);ArrayList<User> userList = null;//在线用户ListuserList = (ArrayList<User>)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<User> userList;//在线用户List@Overridepublic void requestDestroyed(ServletRequestEvent arg0) {}@Overridepublic void requestInitialized(ServletRequestEvent arg0) {userList  = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");if(userList==null)userList = new ArrayList<User>();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<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;}
}
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 {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("contextDestroyed");}@Overridepublic void contextInitialized(ServletContextEvent arg0) {System.out.println("contextInitialized");}
}

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

JavaWeb显示器相关推荐

  1. JavaWeb完整项目要用到的专业技能

    完成JavaWeb项目用到哪些专业技能?在经典的JavaWeb的开发模式中,我们使用Jsp技术来作为展现层的实现,其实也就是所谓的前端.Web开发中经典的MVC模式,Model-View-Contro ...

  2. JavaWeb学习笔记(JavaScript)

    知识点总结于崔希凡+王泽(广陵散)的JavaWeb视频教程,侵权请联系删除. JavaScript JavaScript JavaScript简介 JavaScript的组成 JavaScript和H ...

  3. JavaWeb技术归档大全

    文章目录 一.HTML5 超文本标记语言 1. 常用标签 2. 表单 二.CSS3 层叠样式表 1. 引用CSS 2. 选择器 三.JavaScript 1. 基础语法 1.1 数据类型 1.2 变量 ...

  4. 黑马JavaWeb学习笔记(一)

    JavaWeb 事务 事务的基本操作 START TRANSACTION ----开始事物 COMMIT --手动提交 ROLLBACK --返回 保存临时数据,方式报错导致数据错误 如果不开启事物的 ...

  5. [javaweb企业人力资源管理系统设计与实现(论文+程序设计源码+数据库文件)

    目录 1 绪论 4 1.1 项目开发背景 4 1.2 项目开发意义 4 1.3 项目主要的内容 4 2 相关技术介绍及系统环境开发条件 5 2.1相关技术介绍 5 (1)MVC设计模式 5 (2)Sp ...

  6. java 实训项目_实训方案(JavaWeb项目实训)-

    实训方案(JavaWeb项目实训)- 2012-2013学年第一学期 <Java Web项目开发实训>课程实施方案 课程名称(英文):Training of Java Web Projec ...

  7. javaWeb——Servlet

    Servlet 系统架构 B/S结构的系统通信原理(没有涉及到Java小程序) 关于WEB服务器软件 实现一个最基本的web应用(这个web应用中没有java小程序) 对于一个动态的web应用来说,一 ...

  8. JavaWeb笔记01

    文章目录 JavaWeb(狂神说Java) 1.基本概念 1.1前言 1.2web应用程序 1.3静态web 1.4 动态web 2.web服务器 2.1技术讲解 2.2web服务器 3.Tomcat ...

  9. 使用maven搭建ssm框架的javaweb项目

    目前主流的javaweb项目,常会用到ssm(Spring+Spring MVC+Mybatis)框架来搭建项目的主体框架,本篇介绍搭建SSM框架的maven项目的实施流程.记之共享! 一.SSM框架 ...

最新文章

  1. 删除某个文件夹下的所有文件
  2. 3.1.3 覆盖与交换
  3. 网易云携手美云智数掀起企业移动信息化发展新浪潮
  4. JQuery when
  5. CISSP的成长之路(二十一):用户持有凭证
  6. Linux网络-数据包的接收流程(基于RTL8139网卡驱动程序)
  7. 最长单调递增子序列_最长递增子序列(动态规划 + 二分搜索)
  8. 准程序员必看!该怎么规划自己的职业人生,看看前辈们给的建议!
  9. 计算机体系结构的分类
  10. Linux2.6用户空间堆栈区的分配与回收
  11. 离散数学第二版傅彦课后题答案_青年大最新答案第十季第四期答案 完整版题目和答案分享[多图]...
  12. 在Python中分词
  13. oracle学习札记46
  14. 如何远程访问办公室电脑(过年工作不打烊),亲测有效稳定
  15. 搭建jitsi的prosody出现的问题
  16. html中怎么设置背景图片固定,css如何实现固定的背景图像
  17. X86 MOVSB MOVSW MOVSD MOVSQ 指令详解
  18. 5.2为每种类型的模块内聚举一个例子
  19. 2021-2027全球及中国特种机器人行业研究及十四五规划分析报告
  20. 使用lux(annie)下载视频

热门文章

  1. uniapp光标自动定义到文本框_如何在Mac上的照片应用中创建自定义日历
  2. android 筛选控件_Flutter学习六之实现一个带筛选的列表页面
  3. python中if __name__ == '__main__'功能的解析
  4. 【直播】回放与PPT下载!深度学习如何用于摄影图像的处理?
  5. 【视频课】完备理论+4大案例实践,一课深入掌握图像分类各个方向,配套导师永久答疑群...
  6. 中国广电设备行业十四五运营模式与投资机遇研究报告2022版
  7. 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
  8. SD:配置国家代码的检查和客户主数据隐藏字段 20190516
  9. python_day02 上节课知识点回顾
  10. Buy Tickets(poj 2828)