ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。

ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,例如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。

我们使用缓存的思路大概是:
1、服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取缓存内容生成类,用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。

2、程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等变化积累到一定程序再保存,也可以在下一步保存。

3、服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

package com.ljq.system.common;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyContextListener implements ServletContextListener {private ServletContext context = null;@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) { context = servletContextEvent.getServletContext();User user = DatabaseManager.getUserById(1);context.setAttribute("user", user);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {User user = (User)context.getAttribute("user");DatabaseManager.updateUserData(user);this.context = null;}
}

布署 ServletContextListener
你实现(implements)了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes目录下,更改WEB-INF目录下的 web.xml文件,在web-app节点里添加:

<listener><listener-class>com.datong.pear.system.common.ProcessingTicketListener</listener-class>
</listener>

  

  

Java ServletContextListener用法相关推荐

  1. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  2. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

  3. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  4. java反射用法示例_Java包| 类型,用法,示例

    java反射用法示例 配套 (Packages) Packages in Java is simply a mechanism to encapsulate (i.e. to put in a sho ...

  5. java反射用法示例_Java反射示例教程

    java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...

  6. Java SimpleDateFormat用法

    1. SimpleDateFormat类 SimpleDateFormat是一个日期格式化类,用来格式化日期. // 构造方法 public SimpleDateFormat(String patte ...

  7. Java split()用法,使用特殊字符要注意了

    Java split()用法,使用特殊字符要使用转义字符. 特殊字符有 * ^ : | . \ 1.单个符号作为分隔符  特殊符号* .split("\\*"); 特殊符号^ .s ...

  8. Java Calendar用法

    1. Calendar初始化 Calendar calendar = Calendar.getInstance(); 默认返回GregorianCalendar实例,在GregorianCalenda ...

  9. Java Formatter用法

    1. Formatter类 1.1 使用方法 Formatter formatter = new Formatter([destination]); formatter.format(String f ...

最新文章

  1. 9名华人当选,包揽总人数1/6!2017 ACM Fellow名单公布,华人强势亮相
  2. ntp时间服务器配置
  3. BCGSoft Demo示例展示:控件示例集合(1/2)
  4. 王者荣耀8月15日服务器维护,王者荣耀8月15日更新维护到什么时候 王者荣耀8月15日更新时间分享...
  5. collection 多态 会自动转型为子类 继承多态需要显示转型
  6. java服务端集成极光消息推送--详细开发步骤
  7. 【aviator】aviator 报错 Syntax error:Unexpect token 'OR' Parsing expression
  8. kafka计算机专业读法_终于知道Kafka为什么这么快了!
  9. (转)JavaScript事件冒泡简介及应用
  10. 白话空间统计三十:地统计学(2)前提假设
  11. WKWebView的customUserAgent
  12. 爱情婚姻 - 苏格拉底
  13. 以潘金莲和西门公子为例讲述Java静态代理和动态代理
  14. 阿里云ACP认证 VPC专项练习
  15. java9-模块化open/opens/use/provides...with...
  16. arcmap提取dem高程_如何使用ArcGIS从DEM数据中提取水系
  17. php libjpeg,Linux 安装php-5.2.17出现 libjpeg.(a|so) not found
  18. 几何校正、正射校正以及几何配准之间的区别和联系
  19. Bartender 4 for Mac(菜单栏应用图标管理)
  20. 科目二考试项目和操作要求

热门文章

  1. pc receiver2.0.3_【工控笔记】WINCC 7.4与博途V15.1仿真软件S7PLCSIM V15 通信
  2. am5718_基于TI AM5718 车牌识别系统解决方案 - 飞凌嵌入式行业资讯 - 保定飞凌嵌入式技术有限公司...
  3. @override报错_C++ 多态性:C++11:override 与 final(学习笔记:第8章 09)
  4. ubuntu编译内核_鸿蒙源码下载并编译
  5. python多行语句用反斜杠_抗联部队规定新战士每年必须学会多少个生字
  6. pythontdd测试命名_荐Pytest之测试命名规则
  7. java url no protocol_httpurlconnection 新人使用遇到错误java.net.MalformedURLException: no protocol...
  8. mysql查询条件_mysql条件查询,最简单的一种,你知道吗?
  9. java查看上下文加载器_线程上下文类加载器
  10. lisp的vla函数画矩形_python之:tkinter画哆啦A梦