转自 http://www.wangchao.net.cn/bbsdetail_446319.html
使用ServletContextListener在服务器启动和关闭时创建和关闭缓存[size=large][/size]
ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
我们使用缓存的思路大概是:
服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。
程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用a pplication.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。
服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。
import User; //my own class
import DatabaseManager; // my own class
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
public class MyContextListener
implements ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
User user = DatabaseManager.getUserById(1);
context.setAttribute("user1", user);
}
public void contextDestroyed(ServletContextEvent event) {
User user = (User)context.getAttribute("user1");
DatabaseManager.updateUserData(user);
this.context = null;
}
}
布署 ServletContextListener
你实现(implements)了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes目录下,更改WEB-INF目录下的 web.xml文件,在web-app节点里添加
<listener>
<listener-class>MyServletContextListener</listener-class>
</listener>
分享到:
相关推荐
用于 STM32F103 微控制器的 USB 大容量存储引导加载程序。 用法 使用 IAR EWARM 编译或使用预编译的 bin。 微控制器将自己充当 USB 大容量存储设备,用户只需将新的二进制文件拖放到仿真闪存驱动器中即可。 引导...
针对多核DSP系统程序加载复杂的问题,基于TMS320C6678对多核程序加载进行了研究与设计。从一级引导程序出发,设计并优化了多核程序内容存储格式。设计了简洁的二级引导程序,以修正一级引导程序只识别主核程序入口...
USB大容量存储设备(MSD)主机引导加载程序
如何将用户程序从装载存储区复制到主存储区中doc,如何将用户程序从装载存储区复制到主存储区中
有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要 包含多个域,每个域在加载和运行时可以有不同的地址。要生成这样的映像文件,必须通过 某种方式告知编译器相关的地址映射关系 2 ...
通过二进制工具将code、data和entry、bss等信息重新组成一个简单的文件,这样操作系统在加载这个文件的时候由于格式简单,可以用较少的内存和较少的计算就可以完成。这个简单的文件会和OS一块放到系统区,即不是放到...
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一) 页面缓存的设置优化了页面加载,减少了频繁的...注意: localStorage 是永久存储的,但是我们不建议将关键信息全部存在 localStorage,以防用户换设备
总结来说,【小程序名称】凭借其小巧便携、快捷高效的特性,不仅节省了用户的手机存储空间,更为用户提供了无缝衔接的便利服务,是现代生活中不可或缺的一部分,真正实现了“触手可及”的智能生活新体验。...
由于那时内存很贵且容量有限,计算机的速度很慢(以今天的标准),为了创建复杂的内存覆盖策略(以将大容量的程序加载到小容量内存中),以及重新编辑先前链接过的文件(以节省重新创建程序的时间),这些链接器都...
h750v h743v分散加载,qspiflash既作为字库文件也作为程序储存。lcd显示sd卡文件系统,程序既在片内flash运行又在片外flash运行,下载算法见我另一个资源,琢磨不易,拿出来分享。@565962795
nrf51822 flash.c,flash.h注册、分区、读写函数,已批量应用在产品验证中,flash本地存储根据需要可达几十万次数据,不影响产品寿命,稳定可靠
wince 设备在掉电或者冷启动后储存在RAM中的数据将丢失,如果没有实现自动加载则用户的程序有可能无法正常工作。本文档讲述了冷启动后自动加载的方案
摘要:介绍ADI公司TigerSHARC系列DSp的引导程序加载原理与应用。给出TigerSHARC系列DSP程序加载的几种模式,主要以TS20lS型DSP为例说明单DSP系统程序加载的过程和方法。该设计在TigerSHARC系列DSP中具有通用性。可以...
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中
《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟...
STM32_STM32F103板子的引导加载程序_可与Arduino-STM32存储库和Arduino.IDE结合使用_优质嵌入式项目分享
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...
此存储库包含 Skywallet 的固件和引导加载程序,以及用于测试和开发 Skywallet 的工具。固件可以在/tiny-firmware中找到。固件已从Trezor修改。 skycoin -api文件夹包含实现 Skycoin 功能的函数的定义。Skywallet ...
早在 1947 年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁 带上,并将他们合并、重定位为一个程序。在上世纪 60 年代早期,这些加载器就已经发展 的相当完善了。由于那时内存很贵且容量有限,...