版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/73743391

ServletContextListener

ServletContext对象创建和销毁时触发的监听器
该对象有两个方法,分别是contextInitialized() 和contextDestroyed() 对应着ServletContext对象的创建与销毁。一个ServletContext可以有多个listener

ServletContext

一个web应用对应着一个ServletContext,ServletContext的根目录为当前web应用的webRoot目录

public class FirstListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {System.out.println("###contextDestroy");}public void contextInitialized(ServletContextEvent arg0) {ServletContext context = arg0.getServletContext();for(Object temp : context.getResourcePaths("/")){System.out.println(temp);}}
}

结果是:

/index.jsp
/WEB-INF/
/META-INF/

配置监听器

在web.xml中添加一下内容:

    <listener><listener-class>com.twilight.listener.FirstListener</listener-class></listener>

HttpSessionListener

在浏览器中访问http://localhost:8080/FirstFilter 时会创建session,tomcat会输出sessionCreated,一段时间后session会自动失效,然后tomcat会输出sessionDestroyed
一个Session对应多个listener

    public void sessionCreated(HttpSessionEvent arg0) {System.out.println("sessionCreated");}public void sessionDestroyed(HttpSessionEvent arg0) {System.out.println("sessionDestroyed");}

控制失效时间

在web.xml 中配置session-timeout 以分钟为单位。当时间是0或复数时表示永久存在。

    <session-config><session-timeout>1</session-timeout></session-config>

配置监听器

在web.xml中添加一下内容:

    <listener><listener-class>com.twilight.listener.MyHttpSessionListener</listener-class></listener>

作用

  • 统计在线人数
  • 记录访问日志

ServletRequestListener

表示用户请求的监听
两个方法:requestInitialized() 和requestDestroyed()

    public void requestDestroyed(ServletRequestEvent arg0) {System.out.println("requestDestroyed");}public void requestInitialized(ServletRequestEvent arg0) {System.out.println("requestInitialized");}

结果是:

    requestInitializedsessionCreatedrequestDestroyed

配置监听器

在web.xml中添加一下内容:

    <listener><listener-class>com.twilight.listener.MyServletRequestListener</listener-class></listener>

作用

  • 读取参数
  • 记录访问历史

对象中增加和删除属性的事件监听器

三个事件都有对应的属性监听器:

  • ServletContextServletContextAttributeListener
  • HttpSessionHttpSessionAttributeListener
  • ServletRequestServletRequestAttributeListener

每个属性监听器都有三个方法:
- attributeAdded () 监听属性的增加
- attributeRemoved() 监听属性的移除
- attributeReplaced() 监听属性的替换

ServletRequestAttributeListener 代码如下,其他监听器代码类似:

public class MyServletRequestAttributeListener implementsServletRequestAttributeListener {public void attributeAdded(ServletRequestAttributeEvent arg0) {System.out.println("ServletRequestAttributeListener_attributeAdded_"+arg0.getName());}public void attributeRemoved(ServletRequestAttributeEvent arg0) {System.out.println("ServletRequestAttributeListener_attributeRemoved_"+arg0.getName());}public void attributeReplaced(ServletRequestAttributeEvent arg0) {System.out.println("ServletRequestAttributeListener_attributeReplaced_"+arg0.getName());}
}

addAttribute.jsp模拟增加属性

    request.setAttribute("ServletRequest", "ServletRequestValue");session.setAttribute("Session", "SessionValue");session.getServletContext().setAttribute("ServletContext", "ServletContextValue");

removeAttribute.jsp 模拟移除属性

    request.removeAttribute("ServletRequest");session.removeAttribute("Session");session.getServletContext().removeAttribute("ServletContext");

第一次访问addAttribute.jsp:

    requestInitializedServletRequestAttributeListener_attributeReplaced_org.apache.catalina.ASYNC_SUPPORTEDServletRequestAttributeListener_attributeAdded_ServletRequestHttpSessionAttributeListener_attributeAdded_SessionServletContextAttributeListener_attributeAdded_ServletContextrequestDestroyed

重复访问,发现只有Request是add,因为之前的Request已经失效,此时的Request是新创建的对象:

    requestInitializedServletRequestAttributeListener_attributeReplaced_org.apache.catalina.ASYNC_SUPPORTEDServletRequestAttributeListener_attributeAdded_ServletRequestHttpSessionAttributeListener_attributeReplaced_SessionServletContextAttributeListener_attributeReplaced_ServletContextrequestDestroyed

访问removeAttribute.jsp,此时之前的Request对象已经被销毁,所以不会看到request被remove

    requestInitializedServletRequestAttributeListener_attributeReplaced_org.apache.catalina.ASYNC_SUPPORTEDHttpSessionAttributeListener_attributeRemoved_SessionServletContextAttributeListener_attributeRemoved_ServletContextrequestDestroyed

HttpSession 中对象状态(绑定、解除)

  • 绑定 :将对象保存到session中
  • 解除 :从session中移除对象

HttpSessionBindingListener

该类类似一个javabean保存一些需要的信息,它有两个必须的方法:
- valueBound() 绑定
- valueUnbound() 解绑定

package com.twilight.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("HttpSessionBindingListener_valueBound_"+arg0.getName());}public void valueUnbound(HttpSessionBindingEvent arg0) {System.out.println("HttpSessionBindingListener_valueUnbound+"+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;}}

该类不需要注册,可以直接使用,因为他可以认为只是一个继承了HttpSessionBindingListener接口的Javabean,使用方法:

session.setAttribute("userObj", new User());
session.removeAttribute("userObj");

结果是:

// 绑定
requestInitialized
HttpSessionBindingListener_valueBound_userObj
requestDestroyed// 解绑定
requestInitialized
HttpSessionBindingListener_valueUnbound+userObj
requestDestroyed

钝化和活化

  • 钝化 将session序列化到磁盘
  • 活化 将序列化的对象反序列化到内存中

什么时候钝化

  • 当tomcat服务器关闭或重启时,会将当前的session对象钝化
  • 当web应用被重新加载时(reload)钝化

当tomcat服务器重启开启时,重新加载文件道内存并删除本地文件

HttpSessionActivationListener

实现钝化和话的接口,具体方法有两个:
- sessionWillPassivate 钝化
- sessionDidActivate 活化

由于钝化需要将对象序列化,所以还需要实现Serializable接口。代码如下:

package com.twilight.entity;import java.io.Serializable;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 ,Serializable {private String userName ;private String password ;public void valueBound(HttpSessionBindingEvent arg0) {System.out.println("HttpSessionBindingListener_valueBound_"+arg0.getName());}public void valueUnbound(HttpSessionBindingEvent arg0) {System.out.println("HttpSessionBindingListener_valueUnbound+"+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 se) {System.out.println("HttpSessionActivationListener_sessionDidActivate_"+se.getSource());}public void sessionWillPassivate(HttpSessionEvent se) {System.out.println("HttpSessionActivationListener_sessionWillPassivate_"+se.getSource());}}

结果:

// 钝化
HttpSessionActivationListener_sessionWillPassivate_org.apache.catalina.session.StandardSessionFacade@720a366b// 活化
HttpSessionActivationListener_sessionDidActivate_org.apache.catalina.session.StandardSessionFacade@798aa3f4

钝化后的文件保存在 Tomcat\work\Catalina\localhost\项目名\SESSIONS.ser文件中,服务器启动后文件被反序列化,然后被删除

Servlet-监听器(ServletContext、Request、Session)相关推荐

  1. linux服务器在线人数,servlet监听器实现在线人数统计源码实例

    servlet监听器实现在线人数统计 一.准备知识 1.servlet:servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求 ...

  2. Servlet 监听器

    可参考博文:Session 的钝化与活化 (一)Servlet 中的作用域总结 趁着这个知识点顺便把Servlet 中的四大作用域也在这篇博文中总结一下. application域(ServletCo ...

  3. Java Web开发——Servlet监听器

    一.Servlet监听器的概念 Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext.HttpSession和ServletRequest等域对象的创建与销 ...

  4. servlet监听器Listener介绍和使用

    1监听器Listener 1.1 Listener简介 javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术,其中 servlet规范包括三个技术点:servlet,lis ...

  5. 利用Servlet监听器实现简单网站访问量和在线人数统计

    转自 http://blog.sina.com.cn/s/blog_621a42970100gblw.html Servlet监听器主要有三种,在ServletContext(上下文对象).Sessi ...

  6. 【Java Web编程 十一】深入理解Servlet监听器

    上篇Blog详细介绍了Servlet的过滤器,了解到过滤器类似一个AOP的概念,这篇Blog就来学习下Servlet的监听器,了解下Java Web的第三大组件的用处是什么,又是怎么工作的. 监听器基 ...

  7. 【JavaWeb】之Servlet监听器

    [JavaWeb]Servlet监听器 前言 一.监听器介绍 二.监听application 三.监听session 四.监听request 后记 前言 本文为JavaWeb基础Servlet监听器相 ...

  8. 【Servlet】ServletContext、ServletConfig对象学习、用户登录系统完善

    总结:request.cookie.session.context的区别 这四个对象有不同级别的作用域和生命周期. (1)request:解决了一次请求内的数据共享问题(作用域:一次请求) req.s ...

  9. 对request,session,application作用域形象理解

    看到一篇比较有意思的文章,分享一下.原网址:http://blog.csdn.net/rushkid02/article/details/8063792 几乎所有的Web开发语言都支持Session功 ...

  10. JSP之四大作用域(pageContext,request,session,application)

    JSP的四大作用域的存储和获取数据的方式一样,差别在于取值的范围不同. 四大域各自作用范围为: pageContext:当前JSP页面有效 request:请求有效 session:会话有效(关闭浏览 ...

最新文章

  1. oracle600错误,Oracle 导入数据报600错误
  2. AUTOCAD自学教程一
  3. 【科普】STP生成树协议
  4. 用C++对C++语法格式进行分析
  5. 《重构:改善既有代码的设计》-学习笔记一(+实战解析)
  6. Eclipse调试常用技巧
  7. c语言 温探程序,学习第二天,再探C语言
  8. 前端:JS获取浏览器类型类库
  9. Acwing1086. 恨7不成妻(未解决)
  10. 淘宝灵活的圆角框--通过一个圆形图片形成圆角原理
  11. C语言深入理解!助你向大佬迈进!
  12. 桌面制作——Wallpaper Engine+Rainmeter
  13. Jenkins实现持续集成 上传远程服务器war 并执行sh脚本重启
  14. Linux下informix的安装(最简单超详细)
  15. 推荐计算机科学类的经典书籍
  16. 怎样使用摹客在线原型实现自动轮播图
  17. 计算机办公操作excel,办公中常用的Word及Excel的方法有哪些
  18. 唐门暗器之私有云排名
  19. CTF比赛解析备课与教学:漏洞扫描
  20. c语言以16进制输出大写字母,【C语言】十六进制形式输出应用程序

热门文章

  1. Solr环境搭建及IK分词的集成及solrJ的调用(一)
  2. [转]计算机存在两个管理员,删除其中一个,administration隐藏显示
  3. 如何使用Ajax技术开发Web应用程序(2)
  4. 学web前端的第一天
  5. nginx压力测试和并发预估
  6. Typescript-规范
  7. 使用Kiwi CatTools 实现交换机自动备份
  8. Singleton模式
  9. 基于VMware vSphere 5.0的服务器虚拟化实践(8)
  10. 关于bitmap,为什么android会有bitmap