`
qtlkw
  • 浏览: 307282 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(转)运用ServletContextListener在服务器启动和关闭时创建和关闭缓存

    博客分类:
  • JAVA
阅读更多
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()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ServletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。
   2.程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等变化积累到一定程序再保存,也可以在下一步保存。
   3.服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ApplicationInitListener implements ServletContextListener{
    private ServletContext servletContext;

     public void contextInitialized(ServletContextEvent servletContextEvent){
        System.out.println("[Application Init]ServletContext initialized");
        servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("Application", "application");

        String databaseType = servletContext.getInitParameter("databaseType");
        System.out.println("[Application process]: "+databaseType);
        servletContext.setAttribute("databaseType", databaseType);
     }

     public void contextDestroyed(ServletContextEvent servletContextEvent){
         System.out.println("[Application Destroy]ServletContext destroyed");
     }
}

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

<filter>
  <filter-name>RequestCharacterEncodingFilter</filter-name>
  <filter-class>filter.RequestCharacterEncodingFilter</filter-class>
   <init-param>
    <param-name>requestCharacterEncoding</param-name>
    <param-value>gb2312</param-value>
   </init-param>
</filter>
<filter-mapping>
  <filter-name>RequestCharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>ApplicationInitListener</listener-class>
</listener>


Another example:
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.Logger;

/**
 * Initialize the global web application context 
 * when the Servlet Container are starting
 *   
 * @version $Revision: 1.3 $
 * @author
 */

public class ApplicationInitListener implements ServletContextListener
{
    private static Logger logger = Logger.getLogger(FunctionUtil.class);
    
    /**
     * Initialize a FunctionUtil instance
     */
    public void contextInitialized(ServletContextEvent servletContextEvent){
	logger.info("[Application Init] ServletContext initialized");
	ServletContext servletContext = servletContextEvent.getServletContext();
	LoadCustomFunction.setServletContainerPath(servletContext.getRealPath("/"));
	FunctionUtil.INSTANCE.init();
    }
    
    /**
     * Destroy the web context
     */
    public void contextDestroyed(ServletContextEvent servletContextEvent){
	logger.info("[Application Init] ServletContext destroyed");
    }
}
分享到:
评论
1 楼 chian_xxp 2011-01-15  
谢谢,让我理解清楚了ServletContext,其实是针对servlet容器而来,所有的servlet通用。
servletContext保存了上下文的参数。任何servlet都可以访问。

相关推荐

    WEB服务器启动时加载一个ServerSocket服务

    这个类将在Web应用启动和关闭时分别调用`contextInitialized()`和`contextDestroyed()`方法。 ```java import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ...

    ServletContextListener完成在线人数统计和显示人员列表

    当我们想要在Web应用启动时执行某些初始化操作或者在Web应用关闭时进行清理工作时,`ServletContextListener`就显得非常有用。在这个场景中,我们将探讨如何使用`ServletContextListener`来实现在线人数的统计和显示...

    ServletContextListener的应用

    在Java Web开发中,`ServletContextListener`是一个非常重要的接口,它是Servlet API的一...通过实现这个接口,开发者可以在项目启动和关闭时执行特定的操作,如创建或删除数据库表,从而保证应用的正确初始化和清理。

    ServletContextListener,Timer,TimerTask学习笔记

    结合`ServletContextListener`和`Timer`,可以在Web应用程序启动时创建一个定时器,用于定时执行某些任务。例如,可以利用`contextInitialized`方法初始化`Timer`,并设置一个`TimerTask`来定期检查数据库连接池的...

    ServletContextListener使用详解

    ServletContextListener 使用详解 ServletContextListener ...ServletContextListener 是一个非常有用的接口,它允许我们在 Servlet 容器启动或终止 Web 应用时执行一些操作,例如加载数据库中的数据,初始化资源等。

    spring的监听器和缓存.docx

    在Spring Boot中,监听器是用来响应特定事件的组件,例如Web应用程序的启动和关闭。`MyListener`类实现了`ServletContextListener`接口,这个接口有两个主要方法:`contextInitialized`和`contextDestroyed`。当Web...

    利用servlet监听器,系统启动时创建自定义容器简单例子

    在`contextInitialized`方法中,你可以执行任何需要在应用启动时进行的初始化操作,例如创建数据库连接池、初始化缓存或者创建自定义对象容器。这正是这个例子的核心——创建一个自定义容器。你可以根据需求设计这个...

    SpringMVC中ervletContextListener的使用

    当Web应用程序启动时,服务器会调用`contextInitialized`方法,而在应用程序关闭时调用`contextDestroyed`。开发者可以重写这些方法以执行特定的初始化或清理任务。 在Spring MVC中,`ServletContextListener`的一...

    tomcat启动|退出执行事件

    tomcat启动|退出执行事件类: ...// 删除启动服务器时建立的文件 } // 服务器启动时执行该事件 public void contextInitialized(ServletContextEvent sce) { WriteFile();// 添加一个新的文本文件 }

    ServletContextListener socket实现数据接收

    通过创建ServletContextListener监听器,socket来实现tcp/ip协议客户端数据的接收功能。这是一个maven项目,直接导入eclipse即可运行,此处监听的是9092端口,将项目运行起后,可以对其端口使用情况进行查看,在...

    SpringBoot之Filter和Listener简单运用.rar

    1. 应用初始化:在Web应用启动时,执行一次性设置任务,如加载配置、数据库连接池初始化等。 2. 会话管理:监听Session的创建、销毁,以便统计在线用户、处理会话超时等。 3. 请求统计:记录请求次数、响应时间等,...

    如何在Web应用中去启动后台的任务

    因此,我们可以在这两个方法中分别添加启动和停止后台任务的代码。 **使用Quartz进行任务调度** Quartz是一个强大的任务调度框架,支持复杂的定时任务设置。在Web应用中,我们可以利用Quartz来定义我们的任务(Job...

    timer随tomcat启动案例

    本案例“timer随tomcat启动案例”就是针对这种情况的一个实例,它利用了Java的定时器(Timer)类和Tomcat的生命周期管理来实现在Tomcat服务器启动时自动运行的任务。 首先,我们要理解`Timer`类是Java.util包下的一...

    Java基于ServletContextListener实现UDP监听

    同时,需要使用ServletContextListener来监听Servlet上下文的创建和销毁,以便在Servlet上下文创建时启动UDP监听线程。 下面是使用ServletContextListener实现UDP监听的示例代码: 首先,需要创建一个实现...

    定时启动任务--跟随web容器启动

    1. **监听器**:通过`ServletContextListener`接口来监听Web容器的启动和关闭事件。 2. **定时器**:使用`java.util.Timer`类来实现任务的定时调度。 3. **自定义任务**:定义一个接口或抽象类来表示具体要执行的...

    java如何实现项目启动时执行指定方法

    Java 提供了一个名为 ServletContextListener 的接口,该接口可以监听 Servlet 容器的生命周期事件,包括项目启动和关闭事件。我们可以实现这个接口,创建一个监听器类,来执行项目启动时的指定方法。 下面是一个...

    servlet监听器教程(含代码)

    1. **ServletContextListener**:监听ServletContext对象的生命周期事件,例如在Web应用程序启动和关闭时触发。 2. **ServletRequestListener**:监听ServletRequest对象的创建和销毁,通常与HTTP请求的开始和结束相...

    Tomcat启动时,自动访问本地servlet

    在Java EE(Java Platform, Enterprise Edition)开发中,Tomcat是一个广泛应用的开源Servlet容器,它遵循Java Servlet和JavaServer ...这个机制在一些需要在服务器启动时进行预处理或者初始化任务的场景中非常有用。

    定时器的原理及使用

    结合 `ServletContextListener` 可以实现应用启动和关闭时的自动化管理,确保定时任务的生命周期与应用服务器同步。这种机制在许多实际应用场景中都非常实用,如监控、数据同步、定时邮件发送等。

    Servlet中监听器介绍.doc

    - 缓存管理:在Web应用启动时加载缓存,在关闭时清除。 - 统计分析:统计在线用户、访问量等。 - 安全控制:监控敏感操作,防止非法访问。 配置监听器通常在`web.xml`部署描述符中完成,或者在Servlet 3.0及以上...

Global site tag (gtag.js) - Google Analytics