ServletContextListener 解析用法

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,使用a pplication.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。
  3. 服务器将要关闭时,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>

Spring中的ContextLoaderListener使用

1、在web.xml配置监听器ContextLoaderListener

<listener>  
 <listener-class>org.springframework.web.context.ContextLoaderListener
 </listener-class>
 </listener>

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

2、部署applicationContext的xml文件

如何部署applicationContext的xml文件,如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
<context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>  
            /WEB-INF/classes/applicationContext-*.xml   
        </param-value>  
    </context-param>

在<param-value> </param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并一“,”号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。

由此可见applicationContext.xml的文件位置就可以有两种默认实现:

第一种:直接将之放到/WEB-INF下,之在web.xml中声明一个listener、

第二种:将之放到classpath下,但是此时要在web.xml中加入<context-param>,用它来指明你的applicationContext.xml的位置以供web容器来加载。按照Struts2 整合spring的官方给出的档案,写成:
<!-- Context Configuration locations for Spring XML files -->  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>  
</context-param>

3、调用处

在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。看看它的API说明

第一段说明ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果查看ContextLoaderServlet的API,可以看到它也关联了ContextLoader这个类而且它实现了HttpServlet。这个接口

第二段,ContextLoader创建的是 XmlWebApplicationContext这样一个类,它实现的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->

BeanFactory这样一来spring中的所有bean都由这个类来创建

IUploaddatafileManager uploadmanager = (IUploaddatafileManager) ContextLoaderListener.getCurrentWebApplicationContext().getBean("uploadManager");

时间: 2024-10-29 19:11:10

ServletContextListener 解析用法的相关文章

v-if和v-else以及v-show和v-hide的区别解析用法

v-if v-if接收bool类型.true的话则生成html,false则不生成.或者直接将元素remove掉. 举例如: <div v-if="true">你好</div> v-else v-else紧跟在v-if或者v-show后边,否则将不被识别 举例如: <div v-if="flase">错的</div> <div v-else>不是错的</div> v-show 通过此指令控制元素

ServletContextListener使用详解

ServletContextListener使用详解 分类: java编程2010-12-28 20:23 13298人阅读 评论(10) 收藏 举报 servletwebstring数据库nullfilter 在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件

ServletContextListener简介

在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期.当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理. 在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法: /***当Servlet

ServletContextListener使用详解(监听Tomcat启动、关闭)

在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理.在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法. java代码 1 /**

linux使用getopt解析参数

getopt是linux下解析命令行参数的api.以linux内核代码的一个例子来说明: static void cmdline(int argc, char *argv[]){    int opt;    progname = basename(argv[0]); while ((opt = getopt(argc, argv, "+lci:m:")) != -1) {        switch (opt) {        case 'l':            if (mo

Ajax解决IE浏览器兼容问题

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

第十天 1-9 rhel7-文件的归档和压缩

大纲:文件的归档和压缩1.tar命令的使用及参数解析tar.gz.bz/bz2文件的创建.查看及解压zip/unzip命令的使用 一.文件的归档和压缩 在我们的计算机中,经常会遇到有好多文件名相似或作用相似的文件,所有文件都摆放到一起看着很乱,而且不易于查找和管理,这是,我们会对功能或名字相似的文件分别放在不同的文件夹中,便于管理和浏览,把这些文件都放在文件夹中的操作就叫做归档!!!! 归档的好处:1.方便使用.查询.阅读2.易于管理 (批量删除文件) 为什么要压缩? 如图:主机A要跟主机B传输

Android控件篇

Android中提供了丰富的UI空间.为了最大限度地发挥平台的性能.每个开发人员必须熟练掌握UI控件尤其是经常使用的UI控件.并能依据须要呈现的内容选择最恰当的控件. Android提供了XML配置和Java两种方式来配置控件属性. 通常.XML配置有利于扩展和多目标环境的适配,但因为添加了XML解析过程而使性能略低且无法动态变化,而Java方式尽管性能较好.但因为目标环境多变的Android设备而言,其扩展性通常无法满足项目的须要.在实际的开发工作中,开发人员可依据实际情况的须要及两种方法的优

Python关键字总结

Python中的关键字包括如下: and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try 你想看看有哪些关键字?OK,打开一个终端,就像这样- [email protected]:~$ python Python 2.7.3 (