转自 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>
分享到:
相关推荐
FileSys.exe管理对象存储和文件系统,加载FAT和CDFS等文件系统驱动。 驱动程序的加载有三种方式:系统启动时加载、设备管理器检测到外围设备时加载以及通过ActivateDeviceEx函数加载。系统启动时加载是通过在注册表...
1. **注册表配置**:驱动程序的相关信息通常存储在注册表中,如驱动路径、设备ID等,安装时会更新这些信息。 2. **DriverEntry**:驱动程序的第一个执行点,用于初始化驱动对象、设置回调函数等。 3. **系统调用...
在微信小程序开发中,图片预加载是一个非常关键的优化步骤,尤其对于图片密集型的应用,如电商、社交或媒体类应用。预加载技术允许开发者在用户实际需要之前提前下载图片资源,减少用户等待时间,提升用户体验。本篇...
在VB6(Visual Basic 6)编程环境中,创建一个程序加载前的等待窗体是非常重要的,尤其是在处理大型或复杂的程序时,用户界面的响应速度可能会显得较慢。这种情况下,一个精心设计的等待窗体可以提供良好的用户体验...
在微信小程序开发中,"微信小程序列表下拉刷新加载更多"是一个常见的功能需求,它提升了用户体验,使得用户能够方便地获取更多数据而无需离开当前页面。这个功能涉及到以下几个关键知识点: 1. **生命周期方法**:...
至于程序加载,文档没有详细描述,但通常会涉及将编译好的程序通过JTAG或其他接口加载到FPGA上,实现程序的运行。程序固化部分则涉及到将程序固化到开发板上的Flash存储器中,以便开发板断电后仍能保持程序的存储。 ...
在编程领域,尤其是在开发桌面应用程序时,我们常常需要处理一个问题:如何防止应用程序重复加载。这主要是为了优化系统资源的使用,避免不必要的内存消耗,以及防止因多次启动同一应用导致的数据冲突或异常。"防止...
在这个项目中,“微信小程序三级分类动态加载数据”指的是在小程序中实现一个具有三层结构的分类系统,并且能够根据用户的操作动态加载各级别的分类数据。 首先,我们来看看核心的文件结构: 1. `app.js`:这是小...
在加载完毕后,可以更新列表并提供适当的提示信息,例如“已加载全部”或“没有更多数据”。 6. **数据管理与渲染**: 在实现上述功能时,还需要对数据进行管理。通常,我们会将数据存储在Page的data对象中,通过`...
- 然后,使用`LOADB`命令从指定的存储设备加载应用程序到SDRAM中。例如,如果应用程序位于NAND Flash的某个分区,命令可能是`loadb ${load_addr} ${partition_name}`,其中`${load_addr}`是SDRAM中的目标地址,`${...
4. **注册表监控**:在Windows系统中,应用程序的信息通常存储在注册表中。通过监控注册表的变化,可以防止同一应用程序的多次启动。 5. **启动项管理**:很多应用程序会在启动时自动加载。管理这些启动项,避免...
4. **注册表问题**:Windows注册表是存储程序信息的关键数据库,如果关于fp40ext.dll的注册表项出错,可能导致加载失败。 5. **路径问题**:系统可能无法找到文件的正确位置,这通常与环境变量设置有关。 6. **...
USB大容量存储设备(Mass Storage Device,MSD)主机引导加载程序是一种特殊的引导程序,其特点是可以利用USB接口将固件代码上传到微控制器(MCU)中。这种机制特别适用于飞思卡尔(Freescale)的32位ColdFire和...
加载过程是将应用程序代码与数据从外部存储设备或主机传输至处理器内部或外部存储器的关键步骤。 #### 加载模式 Blackfin处理器支持多种加载模式,具体由BMODE[1:0]引脚状态决定。这包括: - **旁路BootROM执行**...
在开发过程中,引导加载程序(Bootloader)扮演着至关重要的角色,它是系统启动时的第一段代码,负责初始化硬件环境,并将应用程序加载到内存中执行。本篇将深入探讨MSP430F5172的引导加载程序及其工作原理。 首先...
PE(Portable Executable)加载程序是一种技术,它涉及到Windows操作系统中可执行文件(EXE、DLL等)的加载和执行过程。在Windows环境下,PE文件格式是标准的二进制文件格式,用于存储代码、数据和元数据,如函数...
由于机器人技术的快速发展,硬件芯片、软件系统也在不断进步,但是底层的程序加载和管理机制需要创新的解决方案以适应不断增长的程序容量需求。本文所提出的程序管理和动态加载系统在这一方面做出了重要的贡献,为...
用于 STM32F103 微控制器的 USB 大容量存储引导加载程序。 用法 使用 IAR EWARM 编译或使用预编译的 bin。 微控制器将自己充当 USB 大容量存储设备,用户只需将新的二进制文件拖放到仿真闪存驱动器中即可。 引导...
在Android应用开发中,动态加载程序启动图页面是一项常见的需求,尤其对于那些追求用户体验和个性化设计的开发者来说。启动图页面通常在应用程序启动时显示,为用户提供一个视觉过渡,同时可以展示品牌标识或者加载...
【Linux寄生程序加载动态库】 在Linux操作系统中,寄生程序是一种注入到其他可执行文件中的代码,常用于二进制文件的加解密、版权保护等用途,甚至病毒也属于寄生程序的一种形式。然而,在Linux环境下,由于寄生程序...